go 標準のツールチェインでプロファイル取るときのメモ
Goのパフォーマンス計測2019/02/20(水) Makuake LT Party #9
View Slide
convtojisibariTwitter: @convtoGithub: convto2
もくじ- どういう時に必要?- bench mark test- pprof (with test)- pprof (埋め込み)- pprof (with http)- runtime- まとめ
どういう時に必要?- ボトルネック調査- コードレビュー- その他
どうせツールの導入が大変でしょ...?
標準のツールチェイン&パッケージでできます- testing- runtime/pprof- runtime
標準のツールチェイン&パッケージでできます- testing- runtime/pprof- runtimeThank you
除霊
どういう時に必要?- ボトルネック調査- コードレビュー- その他気軽に試せるのでぜひ
もくじ- どういう時に必要?- bench mark test- pprof (with test)- pprof (埋め込み)- pprof (with http)- runtime- まとめ
Bench mark test- testingパッケージでできる- `Benchmark` プレフィックスが対象- `$ go test -bench .` で実行できる- オプションがいくつかある
例
実行
実行実行回数 1回あたり実行時間
実行実行回数 1回あたり実行時間 1回あたり使用メモリ1回あたりメモリ割り当て回数
runtime/pprofパッケージ- runtimeパッケージのwrapperみたいなもの- 可視化ツールで想定されている形式で調査結果を吐き出す- 可視化は `go tool pprof` を利用する
“Package pprof writes runtimeprofiling data in the formatexpected by the pprofvisualization tool.https://golang.org/pkg/runtime/pprof/
pprof (with test)- benchmark の結果をプロファイルとして出力する機能- `go test` コマンドに組み込まれている- `go test -memprofile mem.out -bench .` のように実行する
pprof (with test)- benchmark の結果をプロファイルとして出力する機能- `go test` コマンドに組み込まれている- `go test -memprofile mem.out -bench .` のように実行するテストコードをいじるだけでできますビルドされるコードに影響はでません
[demo] 吐かれたプロファイルを go tool で分析してみる
pprof (埋め込み)- スタンドアロンなプログラムで使う- バイナリに埋め込むので配布先でもプロファイルが吐ける
ドキュメントで紹介されている例
ドキュメントで紹介されている例main関数にこれを埋めるとプロファイル吐けるようになる
pprof (with http)- net/httpのサブパッケージ(net/http/pprof)を使う- HTTP経由でプロファイルを取得できる- testも書いてないし、バイナリに埋め込むのは面倒、とかでサクッと試す時におすすめ
こう書く
こうやってプロファイルとる
対応してるエンドポイント- http://localhost:6060/debug/pprof/profile- http://localhost:6060/debug/pprof/heap- http://localhost:6060/debug/pprof/block- http://localhost:6060/debug/pprof/mutex- より詳しくはこちらhttps://golang.org/pkg/net/http/pprof/
runtimeパッケージでもパフォーマンス観測はできる- たとえばhttps://golang.org/pkg/runtime/#MemProfile を使ったりする- が、ドキュメントでも「ほとんどの場合はpprof使った方がいいよ」とちょいちょい出てくる
runtimeパッケージのメリット- https://golang.org/pkg/runtime/#ReadMemStats を使うとstack領域のメモリ使用量がわかる- pprofはstackは基本的に読めない、heapのみ- その他、比較的低レイヤーな処理を生で触れる
runtimeパッケージのメリット- https://golang.org/pkg/runtime/#ReadMemStats を使うとstack領域のメモリ使用量がわかる- pprofはstackは基本的に読めない、heapのみ- その他、比較的低レイヤーな処理を生で触れるランタイムレベルの操作をサポートするパッケージなので、wrapperがあれば理由がない限りそっちを使おう
まとめ- Goは標準でいろいろ覗けるからよい- pprofは色々な方法で使える- runtimeでの計測は基本しなくていい
- プレゼンテーションテーマは SlidesCarnival の ヨークプレゼンテーションテンプレート を利用していますクレジット表記
ご静聴ありがとうございました