perf record
は、それがいずれかのプログラム・ハードウェアのパフォーマンス・イベント・モニタ・ユニット(PMU)は、カウンタと、カウントサイクルを可能にするために-e cycles -c 1000000
書き込み-1000000と(例えばカウントのいくつかの数の後にオーバーフローし、statistical profiling toolある-F
またはFREQ /期間引数なしでautotune value)、overflow interrupt perfは次のカウントのためにそれを再プログラムします。したがって、毎秒数百または数千のイベントが発生します。または、OSタイマー割り込み(-e task-clock
)を使用して定期的なサンプルを取得することもできます。すべてのサンプル(またはハードウェアPMUからの割り込み)で、perfは現在のPC(EIP)および/またはコールスタックを記録します。現在のカウンタの値を記録しません(perf script
or perf script -D
またはcode of sample event dumpingのperf.dataに格納されているデータのフルダンプを確認してください)。sample->ip
がありますが、PMUの現在のカウントはありません。
perf report
はperf.dataを解析して記録されたすべてのPCを取得します。ヒストグラム[PC] -> sample_count
を構築するために各PCがサンプリングされた回数をカウントします。すべてのPCはそれが属する正確な関数に関連付けられます(perfレポートはメモリマップを解析します。mmap
イベントもperf.dataに記録されます。使用されているバイナリをすべて開き、すべてのバイナリのシンボルテーブルを検索します)。
perf report
の
実際のコードがあるlinux/tools/perf/builtin-report.c
中:cmd_report
/__cmd_report
- >perf_session__process_events
- >いくつかのマジック - >process_sample_event
すべてがhist_iter__report_callback
でヒストグラムにhist_entry_iter__add(&iter, &al, rep->max_stack, rep);
でperf.data ip
(PC)の値に言及した記録する:
hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
. . . (perf/util/annotate.c) __symbol__inc_addr_samples
611 h->addr[offset]++;
report__browse_hists
- >perf_evlist__tty_browse_hists
- >hists__fprintf_nr_sample_events(hists, rep, evname, stdout);
で収集したヒストグラムを出力します。
すべてのサンプルはすでに正確な関数(CPUの順序が狂っていると正確ではないPMUオーバーフローイベントのために正確な関数(およびその内部のビット不正確な命令)に関連付けられており、これはどのような方法ですか?statistical profiling worksです。あなたのプログラムが短時間(秒未満)実行されたり、サンプリング周波数が低すぎる場合、perf.data
に記録されているサンプルはほとんどないかもしれません。しかし、何百ものサンプルがあれば、ほとんどのcpu-heavy関数を見つけることができます(彼らはおそらくpareto ruleを持っており、数十パーセントのプログラム実行時間で動作します)数千、数十、または数千のサンプルを使用し、いくつかの統計的推定を行います(100または1000のサンプルを持つとき、0.1%の時間にわたって実行される関数の正しいパーセントを取得しません)。
wow。 – Strudle
したがって、基本的にカウントは無視され、オーバーフローイベント中のPCの出現をサンプリングするだけです。イベントがCPUサイクルで、十分なサンプルがある場合、その動作を確認できます。しかし、イベントがキャッシュミスなどの場合、どのように動作しますか?キャッシュミスでのオーバーフローイベントも良好な近似値を示すことが保証されていますか? – Strudle
基本的に、サンプリング数はirqではゼロです。すべてのイベントは同じPMUユニットを使用して動作し、異なるイベントIDに対してのみ設定します。最も近いキャッシュへのキャッシュミス(それぞれのコアには独自のL1キャッシュとL2キャッシュがあります)は、ほぼ正確に登録できます(ただし、一部のアーキテクチャでは、LOADコマンドからロードされた値のUSEにスキップすることがあります)。 Offcore/uncoreイベントは、リソースによってはコア間で共有され、グローバルPMUを使用するため容易ではありません。それらを関連付けるために、ローカルPMUの特別な合成イベントを使用して、カウントと経路の割込みを関連付けることができます(しかし、私はこの部分を完全に誤解しています)。 – osgx