ISUCONに向けてpprof導入手順まとめた

pprofとは

Go用プロファイリングツール
実行時間を計測して処理の重い箇所を調べることができるとても便利なツール

pprofの画像

導入手順

ライブラリの取得

$ go get -u runtime/pprof
$ go get -u net/http/pprof

※go modを利用していれば不要だった気がする

コードの修正

インポート部分に下記追加

import (
        ...
        ...
+   _ "net/http/pprof"
)

main関数に以下を追加

func main() {
+   runtime.SetBlockProfileRate(1)
+   runtime.SetMutexProfileFraction(1)
+   go func() {
+       log.Println(http.ListenAndServe("0.0.0.0:6060", nil))
+   }()
        ...
        ...
}

ここまでできたらほぼ完了。

依存パッケージのインストール

WebUIでグラフを見れるようにするために下記をインストール

$ apt install graphviz
or
$ yum install graphviz

ポート開放

WebUIを外から見れる用にするために 1080 ポートを開ける

分析データ収集

アプリケーションが動いてる状態(ISUCONならベンチマーク中)で以下のコマンドを実行しデータを収集&WebUIを起動する

$ go tool pprof -http=0.0.0.0:1080 {アプリケーションのディレクトリ}  http://localhost:6060/debug/pprof/profile

プロファイルできてから再度見る場合

$ go tool pprof -http=0.0.0.0:1080 {アプリケーションのディレクトリ} {収集したファイルパス}

実行が終了したら以下のURLで見ることができる。

http://xxx.xxx.xxx.xxx:1080/

※ポートの説明

  • 1080:pprofを結果を外部から見るためのポート
  • 6060:pprof自体がアクセスするためのポート(外部からアクセスしないので、開けなくてよい)

参考サイト

medium.com

docs.google.com