Jump to Navigation

GO运行时环境变量

GO运行时环境变量

介绍

Go运行时,是除了普通用途的垃圾回收,goroutine调度,计时器,网络poll功能外,开启额外的调试输出,

或者改变运行时本身行为的工具。

这些工具是通过传递给go程序的环境变量控制的。本篇文档描述了运行时支持的4个主要环境变量的功能。

这4个主要环境变量是,GOGC,GOTRACEBACK,GOMAXPROCS, GODEBUG。

GOGC

GOGC是Go运行时支持的最老的环境变量之一。它甚至比GOROOT还老,但却不广为人知。

GOGC控制垃圾回收的不良影响。其默认值为100,表达的含义是垃圾收集器直到达到上次收集的100%时才会被触发。

简单来说,默认情况下垃圾回收会在每次堆使用翻倍执行。

如果设置为更大的值,如GOGC=200,将会推迟垃圾回收直到堆增涨到前一次的200%。

如果设置为更小的值,如GOGC=20,意味着垃圾回收会更频繁的执行,并且在每次触发回收前能够分配的数据越来越少。

设置GOGC=off将会完全关闭垃圾回收。

在Go 1.5中引入了低延迟的回收器,说起来就是“垃圾回收的触发”更灵活流畅,然而其实不变的是,

大于100的GOGC值导致垃圾回收执行的更少,小于100的GOGC值导致垃圾回收执行的更多。

GOTRACEBACK

GOTRACEBACK控制着当程序崩溃时的详细级别。Go 1.5包括4个有效值,

GOTRACEBACK=0,会抑制所有的回溯信息,只能得到崩溃信息。 GOTRACEBACK=1,是默认值,会显示所有的goroutine调用栈信息,但会抑制运行时相关栈信息。 GOTRACEBACK=2,与前一个一样,还会显示运行时相关信息,包括由运行时启动的goroutine。 GOTRACEBACK=crash,与前一个一样,但不会调用os.Exit(),运行时触发segment段错误,并且如果系统允许则会产生coredump。

GOTRACEBACK的影响可以通过一个简单程序查看:

package main
func main() {panic("kerboom")}

编译设置GOTRACEBACK=0运行该程序,将会抑制所有的goroutine调用栈信息。

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

设置GOTRACEBACK其他有效值的测试留给读者了。

Go 1.6中GOTRACEBACK的变化:

Go 1.6 中GOTRACEBACK的值变化了。新的GOTRACEBACK值为,

  • GOTRACEBACK=none,会抑制所有的回溯信息,只能得到崩溃信息。
  • GOTRACEBACK=single,该新的默认值的行为会打印导致panic的goroutine栈信息。
  • GOTRACEBACK=all,会显示所有的goroutine信息,但不包括由运行时启动的goroutine栈信息。
  • GOTRACEBACK=system,与前一个一样,但会显示运行时信息,包括由运行时启动的goroutine栈信息。
  • GORACEBACK=crash,与Go 1.6一样。

为了保持与Go 1.5的兼容,0与none对应,1与all对应,2与system对应。

Go 1.6主要的改变是,默认panic只会打印panic的goroutine的调用栈信息。 详细信息在issue 12366 和 CL 16512。

GOMAXPROCS

GOMAXPROCS大家都知道,(并且可以通过runtime.GOMAXPROCS获取),控制着Go程序中能够分配的操作系统线程数。

对于 Go 1.5,GOMAXPROCS默认值是Go程序启动时能够看到的CPU数(系统认为的CPU都算)。

注:Go程序使用的操作系统线程数还包括cgo调用服务线程,阻塞在系统调用的线程,所以有可能会大于GOMAXPROCS值。

GODEBUG

最好的也是最后的一个是GODEBUG。GODEBUG的值是是以逗号分隔的多个name=value对,每个name都是个运行时调试工具。

以下是开启了垃圾回收和调度跟踪调用godoc的例子:

% evn GODEBUG=gctrace=1,schedtrace=1000 godoc -http=:8080

调用工具名包括,

  • gctrace=1/0
  • schedtrace=1/0
  • scheddetail=1/0
  • allocfreetrace=1/0
  • efence=1/0
  • gccheckmark=1/0
  • gcpacertrace=1/0
  • gcshrinkstackoff=1/0
  • gcstackbarrierall=1/0
  • gcstoptheworld=1/0
  • memprofilerate=X/0
  • invalidptr=1/0
  • sbrk=1/0

更详细的来看看这儿吧,https://godoc.org/runtime#hdr-Environment_Variables

...

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

添加新评论

Plain text

  • 不允许HTML标记。
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.


Main menu 2

Story | by Dr. Radut