Go言語(Golang) Windowsで google pprof を使用する方法

開発Divの藤原です。

以前、当社ブログでも紹介された、こちらの記事の後追いです。 blog.keepdata.jp

go tool pprofは、github.com/google/pprof の 2017-11-08 までの更新分しか取り込まれていないので、github.com/google/pprofを go get して使うことにより更に機能が追加されたpprofを使うことができます。

 主にこちらの新しくなった pprof の設定方法から使い方について詳しく書いていきます。※一部重複する部分もあります。
今回は、Windows10で実施しましたが、他の環境でも概ね同じ手順だと思います。

設定手順

① Goのバージョンを 1.10 以上にする
こちらからダウンロード
https://golang.org/dl/

② Graphizをインストール
こちらからダウンロード
http://www.graphviz.org/download/

③ google pprofをインストール
コマンド実行

$ go get -u github.com/google/pprof

 
④ Graphizのパスを通す
Windowsキー → 「環境」と入力 → [システム環境変数の編集]をクリック → [環境変数]をクリック
システムの環境変数に以下を追加する

C:\Program Files (x86)\Graphviz2.38\bin\

※バージョンの部分は適宜変更してください。

⑤ ソースコードに以下の import を追加する

_ "net/http/pprof"

元々、サーバーアプリケーションであれば、これだけでOK。
そうじゃない場合、上記に加えソースコードを以下のように改造し、サーバーアプリケーションっぽくする。

func main() {
    http.HandleFunc("/test/", handler)
    http.ListenAndServe(":9999", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
    // <<元々の処理>>
}

※pprofを使うにあたってプログラムをサーバーアプリケーションにする必要はないのですが、今回は説明の都合上そのようにしています。
 
⑥ ビルド

実行手順

① プログラムを起動

② pprofの監視開始
コマンドプロンプトから以下のコマンドを実行(※プログラムのポートが :9999 の場合)

$ pprof -http "localhost:22222" "localhost:9999/debug/pprof/profile"
    
Fetching profile over HTTP from http://localhost:9999/debug/pprof/profile
Saved profile in C:\Users\hoge\pprof\pprof.samples.cpu.024.pb.gz

ここから30秒の間に実行された処理を解析してくれる。

※「profile」以外にも以下のような解析方法の指定が可能

http://localhost:9999/debug/pprof/heap
http://localhost:9999/debug/pprof/block
http://localhost:9999/debug/pprof/goroutine
http://localhost:9999/debug/pprof/threadcreate
http://localhost:9999/debug/pprof/mutex

※こんな風に書けば30秒以上でも待ってくれる

$ pprof -http "localhost:22222" -seconds 100 "localhost:9999/debug/pprof/profile"

Fetching profile over HTTP from http://localhost:9999/debug/pprof/profile?seconds=100
Please wait... (1m40s)

 
③ プログラムを実行
ブラウザやCurlコマンドでAPIを叩く

ブラウザで「http://localhost:9999/test/」を開く
$ curl -X GET "http://localhost:9999/test/"

 
④ 結果の表示
ブラウザで 「localhost:22222」 を開く
以下のような Graph や Flame Graph が表示可能 f:id:mfujiwarakeepdataasia:20180722104355p:plainf:id:mfujiwarakeepdataasia:20180722102207p:plainf:id:mfujiwarakeepdataasia:20180722102156p:plain

補足

〇 保存されている pb.gz ファイルを指定して表示することも可能

$ cd ~/pprof
$ pprof -http "localhost:22222" pprof.samples.cpu.025.pb.gz

ブラウザで「localhost:22222」にアクセスする

〇 go toolの場合

$ go tool pprof -http=:22222 localhost:9999
$ go tool pprof -http=:22222 localhost:9999 -seconds 100

プログラム実行 → ブラウザで「localhost:22222」にアクセスする

$ cd ~/pprof
$ go tool pprof pprof.samples.cpu.027.pb.gz
(pprof) web

ブラウザで「localhost:22222」にアクセスする