Linuxで定期的にパフォーマンスカウンターを読み取る方法はありますか?
Xサイクルごとにサンプリングする機能のようなperf stat
ものが私が探しているものです。
基本的には、あるプログラムのCPUサイクル数X回ごとに命令カウンタ(実行した命令数)を読み取れるようにしたいと思います。
朗報: 次のカーネル (Linux 3.9) では、perf stat-I msecs
に定期的な時間間隔でイベント デルタを出力するオプションが追加されます。
https://patchwork.kernel.org/patch/2004891/
$ perf stat -I 1000 -e cycles noploop 10 noploop for 10 seconds 1.000086918 2385155642 cycles # 0.000 GHz 2.000267937 2392279774 cycles # 0.000 GHz 3.000385400 2390971450 cycles # 0.000 GHz 4.000504408 2390996752 cycles # 0.000 GHz 5.000626878 2390853097 cycles # 0.000 GHz
http://man7.org/linux/man-pages/man1/perf-stat.1.html
-I msecs, --interval-print msecs
N ミリ秒ごとにカウント デルタを出力します (最小: 10 ミリ秒)
Linux の perf ツールは、一定の間隔でサンプリングするのではなく、カウンターが特定の値に達したときにイベントを記録することによって機能しているようです。
コマンドperf record -e cycles,instructions -c 10000
は、10000 サイクルごと、および 10000 命令ごとにイベントを格納します。新しいコマンドまたは既存の pid に対して実行できます。perf.data
現在のディレクトリに記録します。
データの分析は別の問題です。を使用perf script
すると、非常に近くなります。
ls 16040 2152149.005813: cycles: c113a068 ([kernel.kallsyms])
ls 16040 2152149.005820: cycles: c1576af0 ([kernel.kallsyms])
ls 16040 2152149.005827: cycles: c10ed6aa ([kernel.kallsyms])
ls 16040 2152149.005831: instructions: c1104b30 ([kernel.kallsyms])
ls 16040 2152149.005835: cycles: c11777c1 ([kernel.kallsyms])
ls 16040 2152149.005842: cycles: c10702a8 ([kernel.kallsyms])
...
その出力から一連の行を取得し、そのセット内の「サイクル」および「命令」イベントの数をカウントするスクリプトを作成する必要があります。-c 10000
記録コマンドのパラメータを変更することで、解像度を調整できます。
perf stat
とperf record
を実行して分析を検証しましたls /
。Stat は 2,634,205 サイクル、1,725,255 命令を報告しましたが、スクリプト出力には 410 サイクルのイベントと 189 の命令イベントがありました。値が小さいほど-c
、サイクル読み取りのオーバーヘッドが大きくなるようです。
定期的にサンプリングする-F
オプションもあります。perf record
ただし、このオプションを使用すると、カウンターの値を取得する方法が見つかりませんでした。
編集: perf stat
明らかにpidでも機能し、ctrl-cが押されるまでデータをキャプチャします。常に N 秒間キャプチャしてからループで実行するようにソースを変更するのは非常に簡単です。
これを行うために perf stat を簡単に変更できます。
実際、私はすでに大まかな変更を実装しており、この変更を喜んで共有します..
私が行った変更は、主に while(!done) ループ内の run_perf_stat 関数にあります。
while(!done) {sleep(1);} の下の行をループ内に移動し、サンプリングしたい期間でスリープを nanosleep に変更するだけです
これにより、perf は出力を STDOUT (または STDERR) に出力するようになります。
これらの値を保存したい場合は、struct stats 型の 2 次元配列を作成し、これをサンプルごとに更新して、定期的にファイルに書き込むことをお勧めします。