こんにちは!いっちーです。
みなさんはWebアプリケーションのパフォーマンス解析はどうしていますか?
私はISUCON10の予選過去問を解いていた時に、どこの処理が遅いかなどをサクッと調べたいなと思いその方法を探していると、
pprofのWebUIがいい感じらしいという情報を見つけました。
そこで実際に導入しWebアプリのパフォーマンス解析をしてみるとセットアップも簡単でWebUIもいい感じでアプリケーションのチューニングが捗りそうでした。
そこでこの記事では、
に関して紹介します!

さくっと使い方だけ知りたい方は 2.pprofを使用する方法 からお読みください!
大変なプロファイリングはプログラムに仕事をしてもらいましょう。
今回はGo言語のプロファイリングツールであるpprofの紹介記事です。
Go言語の勉強には「プログラミング言語Go」がおすすめです。
pprofとは?
pprofとはプログラム実行時のプロファイリングデータを提供してくれるGo言語のパッケージです。
pprofを使うとプログラム実行時のプロファイリングをグラフなど視覚的にわかりやすい状態で画面に表示してくれます。
Web UI
pprofのWeb UIでは複数の方法でプロファイリングを表示することが可能です。以下に例を示します。
Graph
下記の写真のような処理のグラフを表示してくれます。

各ボックスはそれぞれ関数を表しており、
矢印の起点が呼び出し元関数、矢印の先が呼び出し先の関数を表しています。
遅いところは色付けが異なっておりどこに処理の遅い部分があるのかわかりやすいです。
Top
ViewタブのTopを選択すると下記の画像のようなリストが表示されます。

それぞれのカラムの意味は以下になります。
名前 | 意味 |
Flat | 関数の処理時間 |
Flat% | 各Flatの全体に対する割合 |
Sum% | スタック履歴からの累計Flat% |
Cum | 待ち時間も含めた処理時間 |
Cum% | 各Cumの全体に対する割合 |
Name | 関数の名前 |
各カラムをクリックすることでソート可能です。
Flame Graph
ViewタブのFlame Graphを選択すると下記の画像のようなグラフが表示されます。

各ボックスが関数を意味しており、スタックトレースのように処理がつながっている部分に応じて
グラフが下に伸びています。
また各ボックスにカーソルをあてると関数名と処理時間が表示されます。
重い処理の下にぶら下がっている関数などをビジュアルで見分けやすいことが特徴です。
source
Viewタブのsourceを選択すると下記の画像のようなページが表示されます。

sourceではプログラムのどの部分でどれだけ時間かかかっているのかを把握することができます。
今回の画像だとDBからchairの情報を取得している部分が10msかかっていると、画像からすぐわかりますね。
pprofを使用する方法
ここからは実際にpporfを使用する方法を紹介します。
なお、今回の例はISUCON10の予選過去問題を解く際にpprofを仕込んでみたものになります。
ISUCON10の予選環境を立ち上げるにはこちら、予選問題はこちらから確認できます。
main.goに以下の+部分のコードを追加します。既存コードに対する変更は+部分のみです。
import(
+ _ "net/http/pprof"
+ "log"
~~略~~
)
func main() {
+ go func() {
+ l.Println(http.ListenAndServe("0.0.0.0:6060", nil))
+ }()
~~略~~
}

これだけでセットアップが終わるなんて簡単だ!
以下のコマンドを叩くことでWebUIを使用する準備ができます。今回は9999ポートを使用していますが、ポート番号はお好きなものを使ってもらってOKです。
$ pprof -http=localhost:9999 ~/isuumo/webapp/go/ http://localhost:6060/debug/pprof/profile
これでpprofを使う準備は完了です。あとは解析したいプログラムを実行すればWeb UIにてプロファイリングの情報が見えるようになります。
プログラムの実行
実際にプログラムを実行します。今回はISUCON10を例にとり、ベンチマークを動かします。
./bench -target-url http://127.0.0.1
http:localhost:9999にアクセスしてみて以下のような画面が表示されていればOKです!

さいごに
今回のブログではGo言語でpprofを使ったプロファイリングの方法を解説しました。
数行コードを仕込むだけでとても簡単なので、
プロファイリングが必要な際にはpprofを使ってみてはいかがでしょうか?
=======================================================
日本ブログ村のランキングに参加しています\(^^)/よろしければポチッとお願いします。

にほんブログ村
コメント