最近懒得思考,慢慢多写点东西恢复下热度以及恢复如何写东西的感觉。或者翻译……
#gops 的历史背景
gops是一个命令,用于列出和诊断系统上当前运行的Go进程。
用于优化golang程序已经诊断Go的问题
github 地址 https://github.com/google/gops
使用方式
$ gops
983 980 uplink-soecks go1.9 /usr/local/bin/uplink-soecks
52697 52695 gops go1.10 /Users/jbd/bin/gops
4132 4130 foops * go1.9 /Users/jbd/bin/foops
51130 51128 gocode go1.9.2 /Users/jbd/bin/gocode
安装方式
go get -u github.com/google/gops
诊断
对于启动诊断代理的进程,gops可以报告其他信息,如当前堆栈跟踪、Go版本、内存统计信息等。 例子如下:
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)
}
上面的是简单的demo,可配合http服务使用
手册
在本地和远程模式下都可以使用gops工具。
本地模式要求您以运行gops二进制文件的相同用户启动目标二进制文件。要在远程模式下使用gops,您需要知道目标的代理地址。 在局部模式下,以过程PID为目标;在远程模式下,目标是主机:端口组合。
列出本地运行的所有进程
打印所有go的进程 ,可以 直接 运行 gops 而不需要其他参数:
$ gops
983 980 uplink-soecks go1.9 /usr/local/bin/uplink-soecks
52697 52695 gops go1.10 /Users/jbd/bin/gops
4132 4130 foops * go1.9 /Users/jbd/bin/foops
51130 51128 gocode go1.9.2 /Users/jbd/bin/gocode
输出显示:
PID PPID 项目的名称 Go版本用于构建程序 关联程序的位置 注意,运行代理的进程在PID旁边标记了(例如4132)。
$ gops pid
要报告关于进程的更多信息,运行gops后的PID:
$ gops pid
parent PID: 5985
threads: 27
memory usage: 0.199%
cpu usage: 0.139%
username: jbd
cmd+args: /Applications/Splice.app/Contents/Resources/Splice Helper.app/Contents/MacOS/Splice Helper -pid 5985
local/remote: 127.0.0.1:56765 - :0 (LISTEN)
local/remote: 127.0.0.1:56765 - 127.0.0.1:50955 (ESTABLISHED)
local/remote: 100.76.175.164:52353 - 54.241.191.232:443 (ESTABLISHED)
$ gops tree
要显示具有所有正在运行的Go进程的进程树,运行以下命令:
$ gops tree
...
├── 1
│ └── 13962 [gocode] {go1.9}
├── 557
│ └── 635 [com.docker.supervisor] {go1.9.2}
│ └── 638 [com.docker.driver.amd64-linux] {go1.9.2}
└── 13744
└── 67243 [gops] {go1.10}
$ gops stack ( pid | addr )
为了从目标程序打印当前堆栈跟踪,运行以下命令:
$ gops stack ( pid | addr )
gops stack 85709
goroutine 8 [running]:
runtime/pprof.writeGoroutineStacks(0x13c7bc0, 0xc42000e008, 0xc420ec8520, 0xc420ec8520)
/Users/jbd/go/src/runtime/pprof/pprof.go:603 +0x79
runtime/pprof.writeGoroutine(0x13c7bc0, 0xc42000e008, 0x2, 0xc428f1c048, 0xc420ec8608)
/Users/jbd/go/src/runtime/pprof/pprof.go:592 +0x44
runtime/pprof.(*Profile).WriteTo(0x13eeda0, 0x13c7bc0, 0xc42000e008, 0x2, 0xc42000e008, 0x0)
/Users/jbd/go/src/runtime/pprof/pprof.go:302 +0x3b5
github.com/google/gops/agent.handle(0x13cd560, 0xc42000e008, 0xc420186000, 0x1, 0x1, 0x0, 0x0)
/Users/jbd/src/github.com/google/gops/agent/agent.go:150 +0x1b3
github.com/google/gops/agent.listen()
/Users/jbd/src/github.com/google/gops/agent/agent.go:113 +0x2b2
created by github.com/google/gops/agent.Listen
/Users/jbd/src/github.com/google/gops/agent/agent.go:94 +0x480
# ...
$ gops memstats ( pid | addr )
要打印当前的内存统计数据,运行以下命令:
$ gops memstats ( pid | addr )
gops gc ( pid | addr )
如果希望强制在目标程序上运行垃圾收集,请运行gc。它将阻塞,直到GC完成。
$gops setgc ( pid | addr )
将垃圾收集目标设置为一定的百分比。以下命令将其设置为10%:
$ gops setgc ( pid | addr ) 10
$ gops version ( pid | addr )
gops报告目标程序的Go版本,如果您运行以下命令:
$ gops version ( pid | addr )
devel +6a3c6c0 Sat Jan 14 05:57:07 2017 +0000
gops stats ( pid | addr )
打印运行时统计信息,例如goroutines和gomaxproc的数量。
Profiling
Pprof
gops支持CPU和堆pprof配置文件。在读取堆或CPU概要文件之后,它将被分离到go工具pprof中,并允许您交互式地检查概要文件。 要输入CPU profile ,运行:
$ gops pprof-cpu ( pid | addr )
要进入堆 profile ,运行:
$ gops pprof-heap ( pid | addr )
执行跟踪
gops允许您启动运行时跟踪程序5秒钟并检查结果。
$ gops trace ( pid | addr )
总结
gops 这个从命名上看到 就是 go ps 。
一个用于可以检测的工具 以及调试 工具。测试gc的回收时间 以及跟踪程序
部分功能是 封装 https://golang.org/pkg/net/http/pprof/ 这个的功能,
分析cpu 以及内存使用 的。