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
本文使用 文章同步助手 同步