perfの使い方
CPUネックのサーバーの状況をリアルタイムに知りたいケースというのは、科学計算、暗号処理、画像処理などのCPU boundなアプリケーションでは良くあるんじゃないかと思います。
perfはoprofileのリアルタイム版といった感じで、hardware event, software eventの測定をでき、その場の状況を測定できるのでとても便利です。リアルタイムに状況を知りたい場合の使い方を中心にまとめてみました。
全体の測定
まずは、最初何も状況がわからなければ。
perf top
特定関数の測定
perf top実行後、s keyを押して、perf topで表示されたfunction名を入力。
これで、特定関数が測定できる。perf topで眺めながら、問題のある関数が把握できたらその関数だけ見るといった使い方が便利。
特定プロセス・スレッドの測定
問題のあるプロセス・スレッドが特定できているという場合には、それだけをモニタリングするというのは良くやりたくなることの一つです。以下で確認できました。
特定プロセスの測定
perf stat -e cycles -p プロセスID sleep 5
- e で指定するイベントなどは適宜。
特定スレッドの測定
特定イベントのperformance counterの取得。
ps -L axなどでスレッドIDは決めて、以下を実行。
perf stat -t <スレッドID> sleep 5
- e で指定するイベントなどは適宜。
特定イベントの測定
問題が特定イベントに絞り込まれている場合に。これは上記のいずれのものとも組み合わせられるので、適宜使うこと。
- イベントはperf listで確認
- perf stat -e event1,event2 で絞り込んで測定
call chainを表示してbottleneckを発見
これは、perf top, perf statと違って記録を残して分析するための使い方なのですが、とても便利なので書いておきます。
sudo perf record -g yourprogram sudo perf report -g