最近懒得思考,慢慢多写点东西恢复下热度以及恢复如何写东西的感觉。或者翻译……

#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 以及内存使用 的。