gops - 雲原生環境下診斷程序的好幫手
gops
是一個 Google 開源的可列出和診斷系統上當前運行的 go 進程的命令行工具,配合 agent,可以用來很方便的診斷運行中的 go 程序。
安裝
go get github.com/google/gops
// 或者
go install github.com/google/gops
使用
gops
本身可以查看所有 go 程序的進程,如果一個程序使用了 agent
,gops 可以報告更多的信息,比如 stack,內存統計,trace 等,使用了 agent 的程序會用 * 號標記。
agent 使用
go func() {
cfg := agent.Options{
Addr: ":2022", //遠程調試使用,綁定對應的進程pid
ShutdownCleanup: true,
}
if err := agent.Listen(cfg); err != nil {
panic(err)
}
}()
命令行使用
查看節點上全部進程
# gops 命令缺省指令可以獲取本機上所有 Golang 開發的進行信息
# 但是需要注意的是,如果程序是在容器中運行,則gops 指令默認無法檢測到
./go/bin/gops
3560 28909 gops go1.15 /root/go/bin/gops
7627 944 docker-proxy go1.11.13 /usr/bin/docker-proxy
5148 1 exec_agent go1.14.4 /usr/local/services/release_agent-1.0/bin/exec_agent
7680 3653 containerd-shim go1.11.13 /usr/bin/containerd-shim
32765 3653 containerd-shim go1.11.13 /usr/bin/containerd-shim
3653 944 containerd go1.11.13 /usr/bin/containerd
5997 1 kubelet go1.13.5 /usr/bin/kubelet
944 1 dockerd go1.11.13 /usr/bin/dockerd
查看具體進程信息
# 查看具體的進程信息
## robots-server 是我使用go 開發的微信機器人程序,使用host 網絡部署在容器中
$ ./go/bin/gops 315
parent PID: 32765
threads: 5
memory usage: 1.537%
cpu usage: 0.008%
username: admin
cmd+args: /bin/tke-robots-server -config /etc/t-one/tkeoss-config.yaml
elapsed time: 03-06:31:50
local/remote: :::9091 <-> :::0 (LISTEN)
## 查看機器上的二進制 golang 進程
$ ./go/bin/gops 944
parent PID: 1
threads: 17
memory usage: 6.947%
cpu usage: 6.174%
username: root
cmd+args: /usr/bin/dockerd
elapsed time: 178-05:46:50
local/remote: /var/run/docker/metrics.sock:0 <-> :0 (NONE)
local/remote: /run/docker/libnetwork/e068b005e9d3a5387c37924d01566e20856b2cb76c6a8c9365b47a53549983e3.sock:0 <-> :0 (NONE)
local/remote: /var/run/docker.sock:0 <-> :0 (NONE)
local/remote: :0 <-> :0 (NONE)
local/remote: :0 <-> :0 (NONE)
## 指定收集時間
$ ./go/bin/gops 944 10s
parent PID: 1
threads: 17
memory usage: 6.947%
cpu usage: 6.175%
cpu usage (10s): 23.700%
username: root
cmd+args: /usr/bin/dockerd
elapsed time: 178-05:51:06
local/remote: /var/run/docker/metrics.sock:0 <-> :0 (NONE)
local/remote: /run/docker/libnetwork/e068b005e9d3a5387c37924d01566e20856b2cb76c6a8c9365b47a53549983e3.sock:0 <-> :0 (NONE)
local/remote: /var/run/docker.sock:0 <-> :0 (NONE)
local/remote: :0 <-> :0 (NONE)
local/remote: :0 <-> :0 (NONE)
查看進程樹
## 顯示主機上的進程樹(僅Golang 程序o)
$ ./go/bin/gops tree
...
├── 1
│ ├── 5148 (exec_agent) {go1.14.4}
│ ├── 944 (dockerd) {go1.11.13}
│ │ ├── 7627 (docker-proxy) {go1.11.13}
│ │ └── 3653 (containerd) {go1.11.13}
│ │ ├── 7680 (containerd-shim) {go1.11.13}
│ │ └── 32765 (containerd-shim) {go1.11.13}
│ └── 5997 (kubelet) {go1.13.5}
└── 28909
└── 13540 (gops) {go1.15}
查看其他信息
## 輸出棧信息
$ gops stack <pid>
....
goroutine 8 [running]:
runtime/pprof.writeGoroutineStacks(0x13c7bc0, 0xc42000e008, 0xc420ec8520, 0xc420ec8520)
/Users/bgbiao/go/src/runtime/pprof/pprof.go:603 +0x79
runtime/pprof.writeGoroutine(0x13c7bc0, 0xc42000e008, 0x2, 0xc428f1c048, 0xc420ec8608)
/Users/bgbiao/go/src/runtime/pprof/pprof.go:592 +0x44
runtime/pprof.(*Profile).WriteTo(0x13eeda0, 0x13c7bc0, 0xc42000e008, 0x2, 0xc42000e008, 0x0)
/Users/bgbiao/go/src/runtime/pprof/pprof.go:302 +0x3b5
github.com/google/gops/agent.handle(0x13cd560, 0xc42000e008, 0xc420186000, 0x1, 0x1, 0x0, 0x0)
/Users/bgbiao/src/github.com/google/gops/agent/agent.go:150 +0x1b3
github.com/google/gops/agent.listen()
/Users/bgbiao/src/github.com/google/gops/agent/agent.go:113 +0x2b2
created by github.com/google/gops/agent.Listen
/Users/bgbiao/src/github.com/google/gops/agent/agent.go:94 +0x480
# ...
需要注意的是,如果使用 gops
來獲取進程的更多信息,需要在程序測注入 agent 來使用,否則將會有如下異常信息。
在 gops 中,需要注入 agent 的指令:
-
gops stack
-
gops version
-
gops memstats
-
gops stats
-
gops trace
$ ./go/bin/gops version 944
2022/09/24 17:57:55 couldn't resolve addr or pid 944 to TCPAddress: couldn't get port for PID 944: open /root/.config/gops/944: no such file or directory
項目地址 : https://github.com/google/gops
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/YcH43DiZrYse08lXk6aVEQ