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 的指令:

$  ./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