想必 Java 的開發者沒有不知道或者沒用過 jps 這個命令的,這個命令是用來在主機上查看有哪些 Java 程序在運行的。
我剛用 Go 語言程序的時候也很苦惱,我部署在公司服務器上的 Go 程序,其他的同事由於不清楚就經常找不到。
那么 Go 語言有沒有像 jps 這樣的工具呢?當然有,不僅有,而且還是 Google 自己出品的,官方認證(這種問題 Google 不可能自己想不到啊)。名稱也跟 jps 很像,叫 gops。
安裝
gops 並不包含在官方安裝包中,不屬於標准工具。需要手動獲取。
go get -u github.com/google/gops
簡單使用
goes 的使用方法非常簡單,我們看一下 help 文檔就可以了。
最簡單的用法就是 gops
,會直接列出正在運行的 Go 程序
會依次列出 PID,PPID,程序名稱,編譯使用的 Go 版本號,程序路徑。信息比 jps 還詳細,不錯哦。
不止如此,gops 還能進行程序的診斷。
診斷
可能有人注意到了上面我的 memory-test 程序后面有個 *
號。這是因為程序中我加入了 gops 用的診斷支持代碼:
if err := agent.Listen(agent.Options{ShutdownCleanup:true}); err != nil {
log.Fatalln(err)
}
對於這樣的程序,我們才能進行 gops pprof-cpu
和 gops pprof-heap
等命令。(stack
, gc
, setgc
, memstats
, version
, stats
, trace
等命令運行同樣需要加入上面的代碼)。
使用很簡單,就直接貼一點圖,不講了。
因為 go pprof
命令有助於我們分析程序,相對來說更加常用。但是以往用起來相對要麻煩一些(可參照本人另一篇《Go 程序的性能優化及 pprof 的使用》)。現在有了 gops,分析 cpu 和內存使用就跟方便了。
gops 不僅支持本地使用,而且支持遠程。查看 agent.Options
:
可以設置 Addr
為 host:port
形式。我這邊設置為 ":9779"
。將其部署到遠程服務器上,運行命令 gops pprof-heap 192.168.199.210:9779
,可以看到:
完全可行。(注意,不僅只有 pprof-heap
,gops 所有命令都支持遠程)
在我們的程序中加入診斷用代碼,當部署到遠程服務器上,也能很方便地分析程序情況。