2016年06月29日

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

songofacandy at 17:27│Comments(0)TrackBack(0)Python 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント