Netflix FlameScope: a new open source performance analysis tool https://t.co/ALhVppkzfd #flamescope pic.twitter.com/YrJMuJvb7p
— Brendan Gregg (@brendangregg) 2018年4月4日
Brendan Gregg らの所属する Netflix の cloud performance engineering team が FlameScope というパフォーマンス可視化ツールをオープンソースで公開した。詳しくは Netflix Tech Blog 参照。
flame graphs は瞬間的なスパイクを分析しづらかったが、FlameScope により1秒未満のヒートマップでイベント発生回数の多い時間帯が可視化されピンポイントで特定期間の flame graph を表示できるようになった。Oracle Database でいうと AWR/Statspack レポートだけでなく ASH 的な分析、さらに1秒未満のCPU時間の内訳のプロファイリングまで Craig Shallahamer の fulltime.sh でズームアップできるイメージ*1。
FlameScope は Pyhton(フレームワークは Flask) で書かれた Web アプリで、Perf で取得したデータを、ブラウザでアクセスして flame graph を分析するツールです。
Brendan Gregg は性能分析の大家でバックグラウンドは以下の通り。
Flame Graphs の作者の Brendan Gregg は Sun、Oracle、Joyent でカーネル、パフォーマンスのエンジニアとして活躍し、現在は Netflix(北米のインターネットのトラフィックの32.3%を占める。YouTubeは17.1%)*2 のシニア・パフォーマンス・アーキテクトです。ZFS L2ARC や DTrace Toolkit の開発者で、Solaris Performance and Tools、DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD の著者で、LinuxCon、FreeBSD Summit、Oaktable World、AWS re:Invent などのイベントで幅広く活動されています。是非 Brendan Gregg's Homepage をご覧ください。
perf + Flame Graphs で Linux カーネル内のボトルネックを特定する - ablog
FlameScope の見方
x軸が秒単位、y軸が1秒未満の時系列になっていて、赤いセルほどイベント発生回数が多い(CPU負荷が高い)。密度を高めるため2次元にしていると思われる。
実際のスクリーンショットはこんな感じで、x軸が秒単位、y軸が1秒未満の単位になっていて、
選択範囲の FlameGraph を表示することができる。
flame graph の見方は以下の通り。詳しくはこちら。
- 関数名で左から右にソートされている
- コールスタックは上に行くほど深い
- 最もコールスタックが深くて横幅が長いのがCPUを最も使っている関数
FlameScope を使ってみる
macOS に FlameScope をインストールして、Linux で perf で取得した性能情報をダウンロードして、FlameScope で可視化してみた。
環境
インストール
- EC2 に perf をインストールする。
$ sudo yum -y install perf
- macOS に FlameScope をインストールする。
$ git clone https://github.com/Netflix/flamescope $ cd flamescope $ sudo pip install -r requirements.txt
使ってみる
- EC2 で perf で性能情報を取得しつつ openssl で負荷をかける
- perf で性能情報を収集する
$ sudo perf record -F 49 -a -g -- sleep 120 $ sudo perf script --header > stacks.openssl.2018-04-07_01 $ gzip stacks.openssl.2018-04-07_01 $ ls -lh stacks.openssl.2018-04-07_01.gz -rw-rw-r-- 1 ec2-user ec2-user 389K Apr 8 13:45 stacks.openssl.2018-04-07_01.gz
-
- "sudo perf record -F 49 -a -g -- sleep 120" を実行して1分経過後に30秒ほど openssl コマンドで負荷をかける(参考)。
$ openssl speed -multi 4
- macOS で FlameScope を起動する。
- FlameScope を起動する
$ python run.py
-
- flamescope/examples 以下に EC2 から stacks.openssl.2018-04-07_01.gz をコピーする。
- ブラウザで http://127.0.0.1:5000/ にアクセスする。
スタックのリストが表示されるので、stacks.openssl.2018-04-07_01.gz をクリックする。
ヒートマップを表示すると綺麗に2分間計測したうち1分経過後から30秒間が赤くなっている。
範囲を選択してクリックすると flame graph を見ることができる。
参考
関連
- sysのCPU使用率が高い場合にその内訳を調べる方法 - ablog
- 「シンプルでシステマチックなLinux性能分析方法」 @ db tech showcase 東京 2014 - ablog
- perf + Flame Graphs で Linux カーネル内のボトルネックを特定する - ablog
- funcgraph で Linux カーネル内のボトルネックをミクロに追跡する - ablog
- Java Mixed-Mode Flame Graphs で Java の CPU ネックをフルスタックで分析する - ablog
- 真のCPU使用率 by Brendan Gregg@Netflix - ablog
*1:細かすぎて伝わらない例えかもしれない。。。