アプリケーションのパフォーマンス分析
詳解システム・パフォーマンス5.4はアプリケーションに対するパフォーマンス分析の手法についてまとめられています。
以下の順で分析をすることが勧められています。
①スレッドの状態の分析
はじめにアプリケーションのプロセスがどの状態で一番時間を過ごしているのかを確認します。取りうる状態およびその計測ツールは以下の通りです。
- 実行中:top
- 実行可能:schedstat
- 無名ページング(無名ページのページイン待ち):遅延アカウンティング
- スリープ:pidstat -d、遅延アカウンティング、iotop
- ロック:トレーシングツール
- アイドル
目標は出来るだけ多くの時間をアイドル状態で過ごさせることです。アプリケーションの性質によってはスリープやロック状態がアイドルに等しいこともあるので注意です。
②CPUのプロファイリング
アプリケーションがCPUリソースを消費しているのはなぜかを知るために、スタックトレースをサンプリングします。解析にはフレームグラフなどの可視化ツールが有効です。DTraceで実行中の関数のみトレーシングする例があげられていますが、ツールはおそらくアプリケーションの言語に依存するでしょう。
③システムコールの分析
システムコールを分析することによりスレッドがなぜその状態にいるのか、どのシステムコールがどこから呼び出されたのかを探ります。主にスリープやロック状態が対象で、実行可能や無名ページングにある場合には後述のUSEメソッドを使用します。ツールはオーバーヘッドを気にしない場合はstraceを、オーバーヘッドを最小にしたい場合はDTraceなどを使用します。(straceはシステムコール呼び出し時にブレークポイントを設定する侵食型なのに対し、DTraceはトレース情報をカーネル内でバッファリングするバッファードトレーシングという方式を採用しているためオーバーヘッドが小さい。)
④I/Oのプロファイリング
I/O関連のシステムコールに限定してその種類とコンテキスト(スタックトレース)を分析します。ツールは主にDTraceを使います。
⑤ワークロードの特性の把握
アプリケーションに送られてくるワークロードの解析を行います。
⑥USEメソッド
使用率・飽和・エラーの計測によりリソースのボトルネックを探します。実行可能状態や無名ページングの原因はリソースの飽和にある(それぞれCPUとメモリ)ためUSEメソッドが効果的です。
⑦ドリルダウン分析
実際にアプリケーションを読み込んでいく分析です。場合によってシステムライブラリなどの低レイヤー領域に踏み込むこともあります。
⑧ロック分析
競合のチェックと長すぎるロック保持をチェックします。解析にはCPUプロファイリングと同じ手法を使います。
⑨静的パフォーマンスチューニング
最後にアプリケーションの構成を分析し、より効果的な構成がないかどうか探ります。
以上9つの分析方法がありますが、全てをする必要はありませんし順番を入れ替えても問題ありません。大切なのはルーチン化しておき、分析が必要となった時に素早く、繰り返しできることだと想像します。