Go 语言运行时环境变量快速导览

2023-11-01

原文: http://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables


Go 语言运行时环境变量快速导览


介绍:


Go Runtime除了提供:GC, goroutine调度, 定时器,network polling等服务外, 还提供其它一些工具设施,用于开启额外的调试输出, 

或是改变Go Runtime自身的一些行为。这些工具设施由传给Go program的一些环境变量控制, 本文主要讲述它们。


GOGC


GOGC 是Go Runtime最早支持的环境变量,甚至比GOROOT还早,几乎无人不知。GOGC 用于控制GC的处发频率, 其值默认为100, 

意为直到自上次垃圾回收后heap size已经增长了100%时GC才触发运行。即是GOGC=100意味着live heap size 每增长一倍,GC触发运行一次。

如设定GOGC=200, 则live heap size 自上次垃圾回收后,增长2倍时,GC触发运行, 总之,其值越大则GC触发运行频率越低, 反之则越高,

 如果GOGC=off 则关闭GC.


虽然go 1.5引入了低延迟的GC, 但是GOGC对GC运行频率的影响不变, 仍然是其值大于100,则越大GC运行频率越高,
反之则越低。


GOTRACEBACK


GOTRACEBACK用于控制当异常发生时,系统提供信息的详细程度, 在go 1.5, GOTRACEBACK有4个值。


GOTRACEBACK=0 只输出panic异常信息。
GOTRACEBACK=1 此为go的默认设置值, 输出所有goroutine的stack traces, 除去与go runtime相关的stack frames.
GOTRACEBACK=2 在GOTRACEBACK=1的基础上, 还输出与go runtime相关的stack frames,从而了解哪些goroutines是由go runtime启动运行的。
GOTRACEBACK=crash, 在GOTRACEBACK=2的基础上,go runtime处发进程segfault错误,从而生成core dump, 当然要操作系统允许的情况下, 而不是调用os.Exit。


以下为GOTRACEBACK的代码测试例子


package main


func main() {


panic("kerboom")

}


运行结果:


$ env GOTRACEBACK=0 ./crash 
panic: kerboom
$ echo $?
2


读者有兴趣可以尝试其它值, 看看效果。


GOTRACEBACK 在go 1.6中的变化


GOTRACEBACK=none 只输出panic异常信息。
GOTRACEBACK=single 只输出被认为引发panic异常的那个goroutine的相关信息。
GOTRACEBACK=all 输出所有goroutines的相关信息,除去与go runtime相关的stack frames.
GOTRACEBACK=system 输出所有goroutines的相关信息,包括与go runtime相关的stack frames,从而得知哪些goroutine是go runtime启动运行的。
GOTRACEBACK=crash 与go 1.5相同, 未变化。


为了与go 1.5兼容,0 对应 none, 1 对应 all, 以及 2 对应 system.


注意: 在go 1.6中, 默认,只输出引发panci异常的goroutine的stack trace.


GOMAXPROCS


GOMAXPROCS 大家比较熟悉, 用于控制操作系统的线程数量, 这些线程用于运行go程序中的goroutines.
到go 1.5的时候, GOMAXPROCS的默认值就是我们的go程序启动时可见的操作系统认为的CPU个数。


注意: 在我们的go程序中使用的操作系统线程数量,也包括:正服务于cgo calls的线程, 阻塞于操作系统calls的线程,
所以go 程序中使用的操作系统线程数量可能大于GOMAXPROCS的值。


GODEBUG


老鼠拉铁锹,大头在后边, 本文其余篇幅主要讲讲GODEBUG. GODEBUG的值被解释为一个个的
name=value对, 每一对间由逗号分割,每一对用于控制go runtime 调试工具设施, 例如:


$ env GODEBUG=gctrace=1,schedtrace=1000 godoc -http=:8080


上面这条命令用于运行godoc程序时开启 GC tracing and schedule tracing.


下面开始介绍几个比较有用的调试工具设施


gctrace


这个工具我认为最有用处了,请看程序输出便知


$ env GODEBUG=gctrace=1 godoc -http=:8080 -index
gc #1 @0.042s 4%: 0.051+1.1+0.026+16+0.43 ms clock, 0.10+1.1+0+2.0/6.7/0+0.86 ms cpu, 4->32->10 MB, 4 MB goal, 4 P
gc #2 @0.062s 5%: 0.044+1.0+0.017+2.3+0.23 ms clock, 0.044+1.0+0+0.46/2.0/0+0.23 ms cpu, 4->12->3 MB, 8 MB goal, 4 P
gc #3 @0.067s 6%: 0.041+1.1+0.078+4.0+0.31 ms clock, 0.082+1.1+0+0/2.8/0+0.62 ms cpu, 4->6->4 MB, 8 MB goal, 4 P
gc #4 @0.073s 7%: 0.044+1.3+0.018+3.1+0.27 ms clock, 0.089+1.3+0+0/2.9/0+0.54 ms cpu, 4->7->4 MB, 6 MB goal, 4 P


此信息的输出格式随着go的每一不同的版本发生变化,但总是能发现共性的东西, 如: 每一GC 阶段所花费的时间量, heap size 的变化量, 
也包括每一GC阶段完成时间,相对于程序启动时的时间,当然老版本go可能省略一些信息。


每一行信息都很有用, 不过我认为综合分析这些信息则更有用,比如, 不断输出的gc tracing,可以清楚在表明程序的内存分配情况, 

持续不断增长的heap size 则表明可能有内存泄露,也许一些被引用的东西没有被释放。



开启gctrace的代价是很小的,不过其通常是关闭的, 不过我推荐在一些产品环境中,抽取一些
样本产品,开启这个调试工具。


原文未翻译,未找到准确表述。
note:setting gctrace to values larger than 1 causes each garbage collection cycle to be run twice.
 This exercises some aspects of finalisation that require two garbage collection cycles to complete. 
 You should not use this as a mechanism to alter finalisation performance in your programs because you should not write programs who’s correctness depends on finalisation.


The heap scavenger


到目前为止,gctrace给出的最有用的信息就是 the heap scavenger的输出.


scvg143: inuse: 8, idle: 104, sys: 113, released: 104, consumed: 8 (MB)


scavenger 的工作就是周期性地打扫heap中无用的操作系统内存分页, 它会向操作系统发出建义,请操作系统回收无用内存页,

当然并不能强迫操作系统立刻就去做回收处理,操作系统可以忽略此建义,或是延迟回收,比如直到可分配的空闲内存不够的时候。



scavenger输出的信息是我们了解go程序虚拟内存空间使用情况的最好方式, 当然你也可以通过其它工具,如free, top来获到这些信息,
不过你应用信任scavenger.


schedtrace


因为go runtime管理着大量的goroutine, 并调度goroutine在操作系统线程集上运行,
这个操作系统线程集,其实是就是线程池, 所以从外部考察go程序的性能我们不能获取足够的细节信息,
更谈不上准确分析程序性能。故此我们需要直接了解go runtime scheduler的每一个操作,其输出如下:


$ env GODEBUG=schedtrace=1000 godoc -http=:8080 -index
SCHED 0ms: gomaxprocs=4 idleprocs=2 threads=4 spinningthreads=1 idlethreads=0 runqueue=0 [0 0 0 0]
SCHED 1001ms: gomaxprocs=4 idleprocs=0 threads=8 spinningthreads=0 idlethreads=2 runqueue=0 [189 197 231 142]
SCHED 2004ms: gomaxprocs=4 idleprocs=0 threads=9 spinningthreads=0 idlethreads=1 runqueue=0 [54 45 38 86]
SCHED 3011ms: gomaxprocs=4 idleprocs=0 threads=9 spinningthreads=0 idlethreads=2 runqueue=2 [85 0 67 111]
SCHED 4018ms: gomaxprocs=4 idleprocs=3 threads=9 spinningthreads=0 idlethreads=4 runqueue=0 [0 0 0 0]


详细讨论请看 Dmitry Vyukov’s excellent blog post from the Intel DeveloperZone.


设定scheddetail=1将使go runtime输出总结性信息时, 一并输出每一个goroutine的状态信息,如:


$ env GODEBUG=scheddetail=1,schedtrace=1000 godoc -http=:8080 -index
SCHED 0ms: gomaxprocs=4 idleprocs=3 threads=3 spinningthreads=0 idlethreads=0 runqueue=0 gcwaiting=0 nmidlelocked=0 stopwait=0 sysmonwait=0
  P0: status=1 schedtick=0 syscalltick=0 m=0 runqsize=0 gfreecnt=0
  P1: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0
  P2: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0
  P3: status=0 schedtick=0 syscalltick=0 m=-1 runqsize=0 gfreecnt=0
  M2: p=-1 curg=-1 mallocing=0 throwing=0 preemptoff= locks=1 dying=0 helpgc=0 spinning=false blocked=false lockedg=-1
  M1: p=-1 curg=17 mallocing=0 throwing=0 preemptoff= locks=0 dying=0 helpgc=0 spinning=false blocked=false lockedg=17
  M0: p=0 curg=1 mallocing=0 throwing=0 preemptoff= locks=2 dying=0 helpgc=0 spinning=false blocked=false lockedg=1
  G1: status=2(stack growth) m=0 lockedm=0
  G17: status=3() m=1 lockedm=1
  G2: status=1() m=-1 lockedm=-1
  
 这个输出对于调试goroutines leaking很有帮助, 不过其它工具, 诸如:net/http/pprof 
 好像更有用一些。
 
 深入阅读请看godoc for the runtime package.
 
 
  注意: 此文章只是我个人笔记, 如有错漏,请一定指正, 共同学习, 我的邮箱: htyu_0203_39@sina.com
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 语言运行时环境变量快速导览 的相关文章

  • fastdfs特点

    FastDFS是一个开源的轻量级分布式文件系统 它对文件进行管理 功能包括 文件存储 文件同步 文件访问 文件上传 文件下载 等 解决了大容量存储和负载均衡的问题 特别适合以文件为载体的在线服务 如相册网站 视频网站等等 FastDFS为互

随机推荐

  • 每个开发人员都应该知道的10个CSS选择器

    对于任何网站而言 要在用户上产生良好印象是什么 是的 它是任何网站的用户界面 每个开发人员都知道为用户创建美观的设计以便与任何网站进行交互非常重要 如果你不熟悉CSS及其选择器 那么在最短的时间内巧妙地对网页进行样式设置并不是一件容易的事
  • css中display属性作用大全

    定义和用法 display 属性规定元素应该生成的框的类型 实例 设置段落生成一个行内框 p inline display inline 使用说明 说明 这个属性用于定义建立布局时元素生成的显示框类型 对于 HTML 等文档类型 如果使用
  • 学习记录,利用canvas写扫雷游戏

    记录js学习后制作的第一关小游戏 这里的代码还不够精简 许多地方偷懒没有封装 逻辑也有许多可以优化 胜利条件 找出所有地雷并标记
  • XSS-labs靶场1-13关解法答案

    目录 XSS labs克隆 下载地址 第一关 解法 第二关 解法 第三关 解法 第四关 解法 第五关 解法 第六关 解法 第七关 解法 第八关 解法 第九关 解法 第十关 解法 第十一关 解法 第十二关 解法 第十三关 解法 从XSS pa
  • 关于利用python解压文件出现文件名乱码的问题

    利用python中的zipfile模块解压zip文件会出现文件名乱码的问题 会成为莫名的字符 例如 出现原因 zipfile模块中的源代码如下 if flags 0x800 UTF 8 file names extension filena
  • C++异常详解

    文章目录 前言 一 C语言传统的处理错误的方式 二 C 异常概念 三 异常的使用 3 1 异常的抛出和捕获 3 2 异常的重新抛出 3 3 异常安全 3 4 异常规范 四 C 标准库的异常体系 五 自定义异常体系 六 异常的优缺点 C 异常
  • 创建线程的第三种方式:实现Callable接口(含部分源码解析)

    创建线程的第三种方式 实现Callable接口 package com lqy Multithreading import java util concurrent Callable import java util concurrent
  • 递归和迭代的区别

    http blog csdn net laoyang360 article details 7855860 http www zhihu com question 20278387 深究递归和迭代的区别 联系 优缺点及实例对比 1 概念区分
  • JavaWeb核心技术(上)

    目录 第一章 Servlet核心技术 上 前端相关 1 1 基本概念 常识 1 1 1 C S架构的概念 1 1 2 B S架构的概念 1 1 3 JavaWeb的概念 1 2 HTTP协议 熟悉 1 2 1 HTTP协议的概念 1 2 2
  • Leetcode动态规划部分典型题目分类及总结

    参考内容 https leetcode cn com problems longest palindromic substring solution zhong xin kuo san dong tai gui hua by liweiwe
  • 创建vue脚手架时,npmERR报错的解决方法

    创建vue脚手架 1 我是刚学vue的小白 在安装vue脚手架的时候 遇到了安装时出现的问题 查阅了我几个小时 苦苦在挣扎着 确实难受 想借此机会把它给记录下来 希望能帮助更多的初学者解决疑惑 2 我在安装时遇到了这个问题 当时我一直在网上
  • Ubuntu安装nvidia显卡驱动,CUDA与CUDNN

    本文提到的文件可以在这里下载 链接 https pan baidu com s 1cfo0xqrXoK3pA4pHUN3Mcw 提取码 kdjq 目录 1 安装nvidia显卡驱动 2 安装CUDA 3 安装CUDNN 1 安装nvidia
  • [错误解决] paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

    最近项目中需配置sftp上传下载 配置好环境后连接报错 报错信息如图 paramiko ssh exception SSHException Error reading SSH protocol banner 解决方式一 设置banner
  • 域名解析的查看

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 一 配置域名解析 DNS与Host 1 hosts文件 2 配置DNS 3 Host表解析与DNS机械的次序由文件 etc host conf决定 Hosts优先于DN
  • 图的广度优先遍历 + 拓扑排序(笔记)

    广度优先遍历 模板题 广度优先遍历的大体思路就是 每次扩展当前一步能到达的未标记的点加入队列中并标记 每次也从队列中拿出一个点进行扩展 该题是让求最权值都相等的短路我们就可以利用广度优先搜索来求 include
  • 数据仓库理论知识

    一 数据仓库与数据集市 可以简单理解为数据仓库是面向整个企业 而数据集市是面向某个部门的 数据集市的数据来自数据仓库 当然 如果没有数据仓库 数据集市的数据也可以直接取自业务数据库 1 离线与实时 离线数仓 从业务上看 对已知范围的数据定时
  • linux 动态库 段错误,dlopen加载so动态链接库出现段错误的问题

    so库中暴露出来的函数 写在某基类头文件中 大体如下 ifdef cplusplus extern C endif Object construct return new Object void destroy Object object
  • Linux操作系统基础知识学习

    Q1 什么是GNU Linux与GNU有什么关系 A 1 GNU是GNU is Not Unix的递归缩写 是自由软件基金会 Free Software Foundation FSF 的一个项目 该项目已经开发了许多高质量的编程工具 包括e
  • STM32串口调试一直打印 00 00

    在STM32串口调试过程中 通过printf函数往串口打印英文字母 串口助手却一直收到 00 凭直觉 这种情况一般都是时钟没配置好 但是查代码很难找到原因 经过反复查找 发现是STM32CubeMX中时钟源选择错误 就是下面这个地方 切记一
  • Go 语言运行时环境变量快速导览

    原文 http dave cheney net 2015 11 29 a whirlwind tour of gos runtime environment variables Go 语言运行时环境变量快速导览 介绍 Go Runtime除