DBMS開発に使っているプロファイリングツール
AsakusaFW & Tsurugi Advent Calendar 2021の22日目です。
DBMS開発は性能との戦いの連続で、コードを書く→性能測定を行う→ボトルネックを推定する→解消するコードを書く、という作業を日々繰り返しています。コンポーネントごとにボトルネックを作りこんでないことを確認しながら開発をすすめるので、性能分析用に使いやすいツールが欠かせません。本記事ではそのようなツールを紹介します。私の担当するコンポーネントはLinux上のサーバーサイドC++コードがメインなのでプロファイリングツールもそれがターゲットになっています。
Linux perf
Linux上の標準的なパフォーマンス分析用のツールです。複数のサブコマンドからなり、関数のトレースからCPUのHWカウンタ取得まで幅広く対応しています。perfを下記のFlame Graphと組み合わせて使用し、処理時間の長い関数を特定することが多いです。
Flame Graph
perfやdtraceなどで取得されたスタックトレース情報を加工し、グラフ表示します。関数が占める処理時間の比率を大雑把に確認するのに使用します。perf単体でも「時間がかかった関数」を単純にリストすることは可能ですが、Flame Graphではcaller/calleeの関係も含めて表示できるのでcalleeの処理時間をcaller側でも重複してカウントしてしまうという事が避けられます。出力はsvgファイルで名前によるsearchやfilterも可能です。
Tracy Profiler
UIの綺麗なマルチスレッド対応のプロファイリングツールです。各スレッドのアクティビティを時系列で表示し、UI上でインタラクティブにズームして分析することができます。DBMSのタスクスケジューラーがスレッドをコアへ割り当てる動作を確認したり、context switch等によるスレッドの遅延をナノ秒レベルで把握したり、スレッド間の相互作用を観察するのに重宝しています。
Likwid
TsurugiDBはインメモリDBなので、ボトルネックはメモリアクセスのレイテンシー増加やキャッシュミスの多発といった現象で観察される事が多くあります。LikwidはCPUの実行サイクル数・命令数・キャッシュミスなどのHWカウンタを取得することができます。HWカウンタ自体はperfでも取得可能ですが、LikwidはMarker APIが用意されており、コードの特定の区間におけるカウンタの増加を調査することができます。コードの違いによってCPUレベルの実行状況にどういう影響があるかを分析するのに使います。
その他
その他、時々使うものです。
htop - Linux標準のtopコマンドをより高度にしたもの。CPUごとの使用率がグラフで表示されるので、スレッドがCPU性能を十分に使えてるかということを瞬間的にざっくり見るのに使います。
dstat - 有名なシステム統計情報の収集ツール。CPUの使用率などを時系列で記録しておきたい場合に便利。
Intel Vtune Profiler - Intel謹製のCPU分析ツール。以前は有料のツールだったが、少し前に無料になった模様。
Process Counter Monitor - もともとIntelが公式にサポートしていたパフォーマンスカウンタ取得用のライブラリ。Likwidよりも尖っている印象だが、使いこなすには習熟が必要そう。
Discussion