likes
comments
collection
share

gops-云原生环境下诊断程序的好帮手

作者站长头像
站长
· 阅读数 18

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

项目地址 : github.com/google/gops

本文使用 文章同步助手 同步