vmprof-flamegraph を作りました
vmprof-flamegraph を作ったのでその紹介をしておきます。
まず、サンプルとして Sphinx を使って Python のドキュメントをビルドしたときの vmprof 結果を flamegraph にしてみたので、どんなものかはこちらを見てみてください。
http://dsas.blog.klab.org/img_up/sphinx-prof.svg
flamegraph について
flamegraph の一般的な紹介については省略して、リンクだけ置いておきます。
公式サイト: http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html
日本語の紹介記事: http://d.hatena.ne.jp/yohei-a/20150706/1436208007
他にプロファイル結果をビジュアライズするツールとしては cachegrind 系 (kcachegrind, wincachegrind など) がありますが、 flamegraph の方がスタックトレースで 遅い部分が分かりやすいので最近のお気に入りです。
たとえばWebアプリで、ORMのクエリオブジェクトから実際のクエリを生成してそれを実行して結果をインスタンス化する処理が重い事がわかったとします。 その場合、 cachegrind 系でもどこから呼び出されているのが重いのかまではだいたい分かります。しかし flamegraph を使った場合は、 ここから呼び出された場合はインスタンス生成が重い(大量にオブジェクトを取得しているなど)、こっちから呼び出された場合はクエリビルドが重い (単純にクエリの実行回数が多いなど)、までひと目で把握することができます。
他のメリットとして、GUIアプリが不要でブラウザで見ることができるとか、 flamegraph.pl
に食わせるデータファイルのテキスト形式が
grep などのツールと親和性が高い (興味がある関数で grep してから食わせることができる) などのメリットがあり、使いやすいです。
このテキストファイルのフォーマットはシンプルで、各行が次のようになっています。
トップレベルの関数名;1段深い関数名;一番深い関数名 サンプル数
関数名としているところは実際にはなんでも良く、サンプル数も整数であれば何でも良いです。なのでCPU時間以外にもメモリ使用量とかいろんな目的で利用することができます。
vmprof について
PyPy プロジェクトで開発されている、 PyPy と CPython 用のサンプリングプロファイラです。
サンプリングプロファイラなので、サンプル間隔を長めにすればオーバーヘッドを小さくすることができ、本番環境で動かすことも可能です。
まだまだ開発中のプロジェクトですが、サンプリングプロファイラ好きなので積極的に使っています。
vmprof はビジュアライザとして独自の Web アプリを開発していて、実際に http://vmprof.com/ で動いています。 特に PyPy のプロファイル結果を見る場合、 JIT のウォームアップなども見ることができます。
この Web アプリは https://github.com/vmprof/vmprof-server を見れば(ある程度のPythonの知識があれば)簡単に動かすことができます。
vmprof-flamegraph について
簡単に動かせると言っても、プロファイル結果を見るためだけに社内でWebアプリを運用するのも面倒です。 CPython で動かしているアプリのプロファイルを見るだけなら flamegraph を使うほうがお手軽です。
ということで、 vmprof が生成するバイナリ形式のプロファイル結果を、 flamegraph.pl の入力フォーマットのテキストファイルに変換するのが vmprof-flamegraph になります。
インストール方法は、 flamegraph.pl を PATH が通ったディレクトリに置いておき、 vmprof をインストールした Python の環境で
pip install vmprof-flamegraph
するだけです。
その Python 環境の bin ディレクトリに vmprof-flamegraph.py
がインストールされます。
使い方は次のような感じになります。
$ python3 -m vmprof -o profile.data <Pythonスクリプト> $ vmprof-flamegraph.py profile.data | flamegraph.pl > profile.svg $ open profile.svg # Mac の場合
詳細は vmprof-flamegraph や flamegraph.pl のヘルプを見てください。
@methane