6

Linuxで定期的にパフォーマンスカウンターを読み取る方法はありますか?

Xサイクルごとにサンプリングする機能のようなperf statものが私が探しているものです。

基本的には、あるプログラムのCPUサイクル数X回ごとに命令カウンタ(実行した命令数)を読み取れるようにしたいと思います。

4

3 に答える 3

7

朗報: 次のカーネル (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 ミリ秒)

于 2013-02-28T13:45:06.433 に答える
5

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 statperf recordを実行して分析を検証しましたls /。Stat は 2,634,205 サイクル、1,725,255 命令を報告しましたが、スクリプト出力には 410 サイクルのイベントと 189 の命令イベントがありました。値が小さいほど-c、サイクル読み取りのオーバーヘッドが大きくなるようです。

定期的にサンプリングする-Fオプションもあります。perf recordただし、このオプションを使用すると、カウンターの値を取得する方法が見つかりませんでした。

編集: perf stat明らかにpidでも機能し、ctrl-cが押されるまでデータをキャプチャします。常に N 秒間キャプチャしてからループで実行するようにソースを変更するのは非常に簡単です。

于 2012-08-26T19:51:57.073 に答える
0

これを行うために perf stat を簡単に変更できます。

実際、私はすでに大まかな変更を実装しており、この変更を喜んで共有します..

私が行った変更は、主に while(!done) ループ内の run_perf_stat 関数にあります。

while(!done) {sleep(1);} の下の行をループ内に移動し、サンプリングしたい期間でスリープを nanosleep に変更するだけです

これにより、perf は出力を STDOUT (または STDERR) に出力するようになります。

これらの値を保存したい場合は、struct stats 型の 2 次元配列を作成し、これをサンプルごとに更新して、定期的にファイルに書き込むことをお勧めします。

于 2013-02-22T22:06:35.697 に答える