想必 Java 的開發者沒有不知道或者沒用過 jps 這個命令的,這個命令是用來在主機上查看有哪些 Java 程式在運行的。 我剛用 Go 語言程式的時候也很苦惱,我部署在公司伺服器上的 Go 程式,其他的同事由於不清楚就經常找不到。 那麼 Go 語言有沒有像 jps 這樣的工具呢?當然有,不僅有, ...
想必 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 所有命令都支持遠程)
在我們的程式中加入診斷用代碼,當部署到遠程伺服器上,也能很方便地分析程式情況。