gops —— Go 程式診斷分析工具
GitHub: https://github.com/google/gops
一個用於列出和診斷分析系統中正在執行的 Go 程式的命令列工具
安裝
go get -u github.com/google/gops
命令幫助
執行gops help
檢視幫助文件:
gops is a tool to list and diagnose Go processes. gops <cmd> <pid|addr> ... gops <pid> # displays process info Commands: stackPrints the stack trace. gcRuns the garbage collector and blocks until successful. setgcSets the garbage collection target percentage. memstatsPrints the allocation and garbage collection stats. versionPrints the Go version used to build the program. statsPrints the vital runtime stats. helpPrints this help text. Profiling commands: traceRuns the runtime tracer for 5 secs and launches "go tool trace". pprof-heapReads the heap profile and launches "go tool pprof". pprof-cpuReads the CPU profile and launches "go tool pprof". All commands require the agent running on the Go process. Symbol "*" indicates the process runs the agent.
使用詳解
為了能更好的分析程式,需要在我們的專案中加一行agent
診斷分析程式碼,用於統計分析程式問題。
package main import ( "log" "time" "github.com/google/gops/agent" ) func main() { if err := agent.Listen(agent.Options{}); err != nil { log.Fatal(err) } time.Sleep(time.Hour) }
其中,agent.
支援更多的引數:
// Code reference: github.com/google/gops/agent/agent.go:42 // Options allows configuring the started agent. type Options struct { // Addr is the host:port the agent will be listening at. // Optional. Addr string // ConfigDir is the directory to store the configuration file, // PID of the gops process, filename, port as well as content. // Optional. ConfigDir string // ShutdownCleanup automatically cleans up resources if the // running process receives an interrupt. Otherwise, users // can call Close before shutting down. // Optional. ShutdownCleanup bool }
● Addr
可選。為遠端分析服務提供監聽地址,例如::9119
。配置了該項,那我們可以在本機檢視分析遠端伺服器上的 Go 程式,非常有幫助。
● ConfigDir
可選。用於存放統計資料和配置的目錄,預設為當前使用者的主目錄。也可以通過環境變數GOPS_CONFIG_DIR
設定。具體參考程式碼:
const gopsConfigDirEnvKey = "GOPS_CONFIG_DIR" func ConfigDir() (string, error) { if configDir := os.Getenv(gopsConfigDirEnvKey); configDir != "" { return configDir, nil } if runtime.GOOS == "windows" { return filepath.Join(os.Getenv("APPDATA"), "gops"), nil } homeDir := guessUnixHomeDir() if homeDir == "" { return "", errors.New("unable to get current user home directory: os/user lookup failed; $HOME is empty") } return filepath.Join(homeDir, ".config", "gops"), nil } func guessUnixHomeDir() string { usr, err := user.Current() if err == nil { return usr.HomeDir } return os.Getenv("HOME") }
● ShutdownCleanup
可選。設定為true
,則在程式關閉時會自動清理資料。
NOTE
: 如果不加 agent
程式碼,那我們無法更深入的診斷程式,也就是說無法執行gops memstats
、gops pprof-heap
等所有類似於 gops <cmd> <pid|addr> ...
的子命令。
gops
直接執行gops
命令會列出本機所有正在執行的 Go 程式。
$ gops 99288 47636 gogo1.10.1 /usr/local/Cellar/go/1.10.1/libexec/bin/go 99300 99288 main* go1.10.1 /private/var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/go-build375822490/b001/exe/main 99570 2899gopsgo1.10.1 /Users/shocker/gowork/bin/gops 99154 14655 hugogo1.11.1 /usr/local/Cellar/hugo/0.49.1/bin/hugo
該命令會顯示以下內容:
● PID
● PPID
● 程式名稱
● 構建該程式的 Go 版本號
● 程式所在絕對路徑
注意,列表中有個程式名稱後面帶了個*
,表示該程式加入了 gops
的診斷分析程式碼。
gops<pid>
用法:gops <pid>
檢視本機指定 PID
Go 程式的基本資訊
$ gops 99300 parent PID:99288 threads:11 memory usage:0.157% cpu usage:0.013% username:shocker cmd+args:/var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/go-build375822490/b001/exe/main local/remote:*:9105 <-> :0 (LISTEN) local/remote:127.0.0.1:57109 <-> 127.0.0.1:3306 (ESTABLISHED) local/remote:*:8000 <-> :0 (LISTEN)
local/remote
表示本機建立的監聽(LISTEN),或者與遠端伺服器建立的連結(ESTABLISHED)
local/remote: *:9105 <-> :0 (LISTEN)
中的 *:9105
是 gops/agent
提供的服務,
gops tree
用法:gops tree
以目錄樹的形式展示所有 Go 程式。
$ gops tree ... ├── 2899 │└── 99996 (gops) {go1.10.1} ├── 47636 │└── 99288 (go) {go1.10.1} │└── [*]99300 (main) {go1.10.1} └── 14655 └── 99154 (hugo) {go1.11.1}
gops stack(<pid>|<addr>)
用法:gops stack (<pid>|<addr>)
用於顯示程式所有堆疊資訊,包括每個 goroutine 的堆疊資訊、執行狀態、執行時長等。
$ gops stack 99300 goroutine 7 [running]: runtime/pprof.writeGoroutineStacks(0x1882720, 0xc4202b8010, 0xd0, 0xd0) /usr/local/Cellar/go/1.10.1/libexec/src/runtime/pprof/pprof.go:650 +0xa7 runtime/pprof.writeGoroutine(0x1882720, 0xc4202b8010, 0x2, 0x30, 0xc420068248) /usr/local/Cellar/go/1.10.1/libexec/src/runtime/pprof/pprof.go:639 +0x44 goroutine 1 [IO wait, 9 minutes]: internal/poll.runtime_pollWait(0x1db4da0, 0x72, 0x0) /usr/local/Cellar/go/1.10.1/libexec/src/runtime/netpoll.go:173 +0x57 internal/poll.(*pollDesc).wait(0xc4201e7318, 0x72, 0x0, 0x0, 0x0) # more ...
gops memstats(<pid>|<addr>)
用法:gops memstats (<pid>|<addr>)
檢視程式的記憶體統計資訊
$ gops memstats 127.0.0.1:9105 alloc: 1.36MB (1428632 bytes) total-alloc: 10.21MB (10709376 bytes) sys: 9.07MB (9509112 bytes) lookups: 91 mallocs: 102818 frees: 91896 heap-alloc: 1.36MB (1428632 bytes) heap-sys: 5.22MB (5472256 bytes) heap-idle: 2.34MB (2457600 bytes) heap-in-use: 2.88MB (3014656 bytes) heap-released: 0 bytes heap-objects: 10922 stack-in-use: 704.00KB (720896 bytes) stack-sys: 704.00KB (720896 bytes) stack-mspan-inuse: 47.95KB (49096 bytes) stack-mspan-sys: 80.00KB (81920 bytes) stack-mcache-inuse: 6.78KB (6944 bytes) stack-mcache-sys: 16.00KB (16384 bytes) other-sys: 1.21MB (1266624 bytes) gc-sys: 492.00KB (503808 bytes) next-gc: when heap-alloc >= 4.00MB (4194304 bytes) last-gc: 2018-10-18 13:37:04.37511973 +0800 CST gc-pause-total: 9.209158ms gc-pause: 52831 num-gc: 60 enable-gc: true debug-gc: false
gops gc(<pid>|<addr>)
用法:gops gc (<pid>|<addr>)
檢視指定程式的垃圾回收(GC)資訊
gops setgc(<pid>|<addr>)
用法:gops setgc (<pid>|<addr>)
設定指定程式的 GC 目標百分比
gops version(<pid>|<addr>)
用法:gops version (<pid>|<addr>)
檢視指定程式構建時的 Go 版本號
gops stats(<pid>|<addr>)
用法:gops stats (<pid>|<addr>)
檢視指定程式的 goroutine
數量、GOMAXPROCS
值等資訊
$ gops stats 127.0.0.1:9105 goroutines: 11 OS threads: 14 GOMAXPROCS: 4 num CPU: 4
gops pprof-cpu(<pid>|<addr>)
用法:gops pprof-cpu (<pid>|<addr>)
呼叫並展示 go tool pprof
工具中關於 CPU 的效能分析資料,操作與 pprof
一致。
$ gops pprof-cpu 99300 Profiling CPU now, will take 30 secs... Profile dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/profile881383738 Profiling dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/profile881383738 Binary file saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/binary970030929 File: binary970030929 Type: cpu Time: Oct 18, 2018 at 2:43pm (CST) Duration: 30s, Total samples = 0 Entering interactive mode (type "help" for commands, "o" for options) (pprof)
gops pprof-heap(<pid>|<addr>)
用法:gops pprof-heap (<pid>|<addr>)
呼叫並展示 go tool pprof
工具中關於 heap 的效能分析資料,操作與 pprof
一致。
$ gops pprof-heap 99300 Profile dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/profile045800436 Profiling dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/profile045800436 Binary file saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/binary315133123 File: binary315133123 Type: inuse_space Time: Oct 18, 2018 at 2:46pm (CST) Entering interactive mode (type "help" for commands, "o" for options) (pprof)
gops trace(<pid>|<addr>)
用法:gops trace (<pid>|<addr>)
追蹤程式執行5秒,生成視覺化報告,並可在瀏覽器中檢視: http://127.0.0.1:61380
$ gops trace 99300 Tracing now, will take 5 secs... Trace dump saved to: /var/folders/cs/mfl4k8t54_g1thdzvzkdxbbr0000gn/T/trace136310737 2018/10/18 14:49:06 Parsing trace... 2018/10/18 14:49:06 Serializing trace... 2018/10/18 14:49:06 Splitting trace... 2018/10/18 14:49:06 Opening browser. Trace viewer is listening on http://127.0.0.1:61380
原文釋出時間為:2018-10-24
本文作者:Shocker
本文來自雲棲社群合作伙伴“ofollow,noindex">Golang語言社群 ”,瞭解相關資訊可以關注“Golang語言社群 ”。