golang runtime 包官方文档 翻译

环境变量

runtime 包含的是go实时运行系统的一些交互操作,比如控制goroutines,也包含了一些使用反射包获得的底层信息,具体见反射包关于实时系统的接口。

下面的环境变量($name或者是%name%,取决于运行的操作系统)控制go运行时候的实时行为,这个意义和使用方法,也许会在不同版本之间变化(目前1.4版)。

GOGC变量设置垃圾回收的百分比,当新添加的数据加上上次垃圾回收之后留下的数据重新达到这个比例之后,会再次出发垃圾回收,默认的GOGC是100,设置gogc=off会彻底禁止垃圾回收,runtime/debug包的SetGCPercent函数会允许在运行时修改该参数。详见http://golang.org/pkg/runtime/debug/#SetGCPercent.

GODEBUG变量控制着运行时的debug输出,GODEBUG变量是一个逗号分隔的键值对,支持的键名有

  1. allocfreetrace :设置 allocfreetrace = 1会让每次分配和释放都记录并且可以被栈追踪打印到
  2. efence : 设置efence = 1会让分配器给每一个对象都分配一个单独的页,并且该页不会再被重复利用了
  3. gctrace : 设置 gctrace = 1 会让垃圾回收器每次回收的时候都发送一个一行到error,描述回收的量和停顿的时间长度,设置gctrace = 2 ,不止会得到上述结果,但是还有重复的次数。
  4. gcdead: 设置gcdead = 1 会毁了所有他认为死掉了执行堆栈。
  5. invalidptr : 默认invalidptr = 1,如果指针被赋予一个无效值,会引起程序的崩溃,设置该值为0,会停止该检查,这个只能临时用于查找bug,真正的解决方法是不要把整数类型的值存在指针变量里面。
  6. scheddetail : 设置 scheddetail= 1 && schedtrace = X 会让调度器 发出来一个详细的Xms内多线调度信息,描述调度器的情况,如线程,进程,协程等等。
  7. schedtrace: 同上
  8. scavenge : scavenge=1 enables debugging mode of heap scavenger

变量GOMAXPROCS限制操作系统可以 同时运行的用户级别的go代码数量,但是对于出于阻塞状态的线程数量是没有限制的,这些是不受GOMAXPROCS 限制的,GOMAXPROCS 是可以修改该限制的(注:NumCPU() 函数可以获取当前系统的CPU数目,可以根据该结果确认GOMAXPROCS的值)。

GOTRACEBACK可以控制go成语因为未恢复的panic和意外情况造成的崩溃的时候输出栈数量,默认会输出所有的尚存的goroutine,内置函数到实时系统,如果以退出码2退出,如果GOTRACEBACK 设置成0,那goroutine追踪栈会全部输出,GOTRACEBACK 设置成1,采用默认的行为,如果GOTRACEBACK设置成2,不仅输出全部的栈,还有实时交互系统的函数,如果GOTRACEBACK 设置成crash,不仅包括输出栈和实时系统本身的函数,还有尽可能的以操作系统规定的方式退出而不是立即退出,比如在unix系统上,程序会发送一个SIGABRT 去触发一个core dump。

GOARCH, GOOS, GOPATH, 和 GOROOT 这些环境变量。题目影响go程序的构建。

常量

const Compiler = "gc" 
编译器是构建运行的二进制代码的工具集的名字,一直的工具集名字有
gc      The 5g/6g/8g compiler suite at code.google.com/p/go.
gccgo   The gccgo front end, part of the GCC compiler suite.
const GOARCH string = theGoarch
GOARCH  是运行程序的CPU架构:386,amd64,或者是arm
const GOOS string = theGoos
GOOS 是运行程序的操作系统,darwin,freebsd,linux等等

变量

var MemProfileRate int = 512 * 1024

MemProfileRate 会在内存profile 里面 保存内存分配的频率和报告频率,profile的目标是对内存分配的平均情况进行采样分析。 为了在内存profile分析报告里面记录每一次内存分配的情况,请将MemProfileRate 设置成1,如果彻底关闭内存分析,请将MemProfileRate 设置成0, 该工具会会在整个程序的生命周期里面不停地以设置的频率对内存进行采样分析,修改内存采样频率的操作只应该做一次,并且最好尽可能的早做。

 

func BlockProfile

func BlockProfile(p []BlockProfileRecord) (n int, ok bool)

该函数返回n,几率的是当前阻塞的报告。如果len(p) >= n ,该函数会拷贝分析报告进入p,并且返回n,如果len(p) < n, BlockProfile 不做任何修改,只是返回n,false。

Most clients should use the runtime/pprof package or the testing package’s -test.blockprofile flag instead of calling BlockProfile directly.

 

func CPUProfile

func CPUProfile() []byte

CPUProfile returns the next chunk of binary CPU profiling stack trace data, blocking until data is available. If profiling is turned off and all the profile data accumulated while it was on has been returned, CPUProfile returns nil. The caller must save the returned data before calling CPUProfile again.

Most clients should use the runtime/pprof package or the testing package’s -test.cpuprofile flag instead of calling CPUProfile directly.

 

func GoroutineProfile

func GoroutineProfile(p [] StackRecord) (n int, ok bool)
GoroutineProfile 返回n,活动gogoutine 站报告的记录数,如果 len(p) >= n,GoroutineProfile 会拷贝报告进入p,然后返回n,如果 len(p) < n , GoroutineProfile并不会改变p,并且返回n,false。
应该使用runtime/pprof包,而不是直接使用GoroutineProfile

func NumCPU()

返回本机逻辑CPUS的数量

func NumGoroutine

func NumGoroutine int
返回存在的goroutineus 的数量
func ReadMemStats(m *MemStats)

读取内存分配的数据
 

Leave a comment

Your email address will not be published.

*