開発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 が表示可能
補足
〇 保存されている 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」にアクセスする