Go 语言运行时环境变量快速导览
原文: http://dave.cheney.net/2015/11/29/a-whirlwind-tour-of-gos-runtime-environment-variables
Go 語言運(yùn)行時(shí)環(huán)境變量快速導(dǎo)覽
Go Runtime除了提供:GC, goroutine調(diào)度, 定時(shí)器,network polling等服務(wù)外, 還提供其它一些工具設(shè)施,用于開啟額外的調(diào)試輸出,?
或是改變Go Runtime自身的一些行為。這些工具設(shè)施由傳給Go program的一些環(huán)境變量控制, 本文主要講述它們。
GOGC
GOGC 是Go Runtime最早支持的環(huán)境變量,甚至比GOROOT還早,幾乎無人不知。GOGC 用于控制GC的處發(fā)頻率, 其值默認(rèn)為100,?
意為直到自上次垃圾回收后heap size已經(jīng)增長(zhǎng)了100%時(shí)GC才觸發(fā)運(yùn)行。即是GOGC=100意味著live heap size 每增長(zhǎng)一倍,GC觸發(fā)運(yùn)行一次。
如設(shè)定GOGC=200, 則live heap size 自上次垃圾回收后,增長(zhǎng)2倍時(shí),GC觸發(fā)運(yùn)行, 總之,其值越大則GC觸發(fā)運(yùn)行頻率越低, 反之則越高,
?如果GOGC=off 則關(guān)閉GC.
雖然go 1.5引入了低延遲的GC, 但是GOGC對(duì)GC運(yùn)行頻率的影響不變, 仍然是其值大于100,則越大GC運(yùn)行頻率越高,
反之則越低。
GOTRACEBACK
GOTRACEBACK用于控制當(dāng)異常發(fā)生時(shí),系統(tǒng)提供信息的詳細(xì)程度, 在go 1.5, GOTRACEBACK有4個(gè)值。
?
- GOTRACEBACK=0 只輸出panic異常信息。
- GOTRACEBACK=1 此為go的默認(rèn)設(shè)置值, 輸出所有g(shù)oroutine的stack traces, 除去與go runtime相關(guān)的stack frames.
- GOTRACEBACK=2 在GOTRACEBACK=1的基礎(chǔ)上, 還輸出與go runtime相關(guān)的stack frames,從而了解哪些goroutines是由go runtime啟動(dòng)運(yùn)行的。
- GOTRACEBACK=crash, 在GOTRACEBACK=2的基礎(chǔ)上,go runtime處發(fā)進(jìn)程segfault錯(cuò)誤,從而生成core dump, 當(dāng)然要操作系統(tǒng)允許的情況下, 而不是調(diào)用os.Exit。
以下為GOTRACEBACK的代碼測(cè)試?yán)?br /> ?
運(yùn)行結(jié)果:
$ env GOTRACEBACK=0 ./crash? panic: kerboom $ echo $? 2
讀者有興趣可以嘗試其它值, 看看效果。
GOTRACEBACK
在go 1.6中的變化
- GOTRACEBACK=none 只輸出panic異常信息。
- GOTRACEBACK=single 只輸出被認(rèn)為引發(fā)panic異常的那個(gè)goroutine的相關(guān)信息。
- GOTRACEBACK=all 輸出所有g(shù)oroutines的相關(guān)信息,除去與go runtime相關(guān)的stack frames.
- GOTRACEBACK=system 輸出所有g(shù)oroutines的相關(guān)信息,包括與go runtime相關(guān)的stack frames,從而得知哪些goroutine是go runtime啟動(dòng)運(yùn)行的。
- GOTRACEBACK=crash 與go 1.5相同, 未變化。
為了與go 1.5兼容,0 對(duì)應(yīng) none, 1 對(duì)應(yīng) all, 以及 2 對(duì)應(yīng) system.
注意: 在go 1.6中, 默認(rèn),只輸出引發(fā)panci異常的goroutine的stack trace.
GOMAXPROCS
GOMAXPROCS 大家比較熟悉, 用于控制操作系統(tǒng)的線程數(shù)量, 這些線程用于運(yùn)行g(shù)o程序中的goroutines.
到go 1.5的時(shí)候, GOMAXPROCS的默認(rèn)值就是我們的go程序啟動(dòng)時(shí)可見的操作系統(tǒng)認(rèn)為的CPU個(gè)數(shù)。
注意: 在我們的go程序中使用的操作系統(tǒng)線程數(shù)量,也包括:正服務(wù)于cgo calls的線程, 阻塞于操作系統(tǒng)calls的線程,
所以go 程序中使用的操作系統(tǒng)線程數(shù)量可能大于GOMAXPROCS的值。
?
GODEBUG
老鼠拉鐵鍬,大頭在后邊, 本文其余篇幅主要講講GODEBUG. GODEBUG的值被解釋為一個(gè)個(gè)的
name=value對(duì), 每一對(duì)間由逗號(hào)分割,每一對(duì)用于控制go runtime 調(diào)試工具設(shè)施, 例如:
上面這條命令用于運(yùn)行g(shù)odoc程序時(shí)開啟 GC tracing and schedule tracing.
下面開始介紹幾個(gè)比較有用的調(diào)試工具設(shè)施
gctrace
這個(gè)工具我認(rèn)為最有用處了,請(qǐng)看程序輸出便知
$ 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的每一不同的版本發(fā)生變化,但總是能發(fā)現(xiàn)共性的東西, 如: 每一GC 階段所花費(fèi)的時(shí)間量, heap size 的變化量,?
也包括每一GC階段完成時(shí)間,相對(duì)于程序啟動(dòng)時(shí)的時(shí)間,當(dāng)然老版本go可能省略一些信息。
每一行信息都很有用, 不過我認(rèn)為綜合分析這些信息則更有用,比如, 不斷輸出的gc tracing,可以清楚在表明程序的內(nèi)存分配情況,?
持續(xù)不斷增長(zhǎng)的heap size 則表明可能有內(nèi)存泄露,也許一些被引用的東西沒有被釋放。
開啟gctrace的代價(jià)是很小的,不過其通常是關(guān)閉的, 不過我推薦在一些產(chǎn)品環(huán)境中,抽取一些
樣本產(chǎn)品,開啟這個(gè)調(diào)試工具。
原文未翻譯,未找到準(zhǔn)確表述。
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的輸出.
?
scavenger 的工作就是周期性地打掃h(yuǎn)eap中無用的操作系統(tǒng)內(nèi)存分頁, 它會(huì)向操作系統(tǒng)發(fā)出建義,請(qǐng)操作系統(tǒng)回收無用內(nèi)存頁,
當(dāng)然并不能強(qiáng)迫操作系統(tǒng)立刻就去做回收處理,操作系統(tǒng)可以忽略此建義,或是延遲回收,比如直到可分配的空閑內(nèi)存不夠的時(shí)候。
scavenger輸出的信息是我們了解go程序虛擬內(nèi)存空間使用情況的最好方式, 當(dāng)然你也可以通過其它工具,如free, top來獲到這些信息,
不過你應(yīng)用信任scavenger.
schedtrace
因?yàn)間o runtime管理著大量的goroutine, 并調(diào)度goroutine在操作系統(tǒng)線程集上運(yùn)行,
這個(gè)操作系統(tǒng)線程集,其實(shí)是就是線程池, 所以從外部考察go程序的性能我們不能獲取足夠的細(xì)節(jié)信息,
更談不上準(zhǔn)確分析程序性能。故此我們需要直接了解go runtime scheduler的每一個(gè)操作,其輸出如下:
詳細(xì)討論請(qǐng)看 Dmitry Vyukov’s excellent blog post from the Intel DeveloperZone.
設(shè)定scheddetail=1將使go runtime輸出總結(jié)性信息時(shí), 一并輸出每一個(gè)goroutine的狀態(tài)信息,如:
?
??
?這個(gè)輸出對(duì)于調(diào)試goroutines leaking很有幫助, 不過其它工具, 諸如:net/http/pprof?
?好像更有用一些。
?
?深入閱讀請(qǐng)看godoc for the runtime package.
總結(jié)
以上是生活随笔為你收集整理的Go 语言运行时环境变量快速导览的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 物联网、云计算、大数据、人工智能之间有怎
- 下一篇: 使用kubectl delete pod