2017-02-15 20 views
2

perfツールは、PMUイベントを関数にどのように関連付けるのですか? カーネルperfサブシステムがイベントカウンタを記録すると、関数にカウントを関連付けることができるようにプログラムカウンタ(PC)も記録されます。perfはどのようにイベントを関数に関連付けますか?

しかし、実際に細粒度の結果を得るには、カウンタを非常に高速でサンプリングする必要があります。そうしないと、カウンタを関数のグループに関連付けることができます。 しかし、カウンタを読み取ってサンプリングされたデータ(カウンタ、PC、コールスタック)をperfmmap領域に書き込むことは非常に困難です。

私はPMUがオーバーフローに対抗する際に、このサンプリングのみ起こることをいくつかのソースに読みますが、私はここで何をしないのです非常に迅速に

をオーバーフローするカウンターを設定していない限り、これは、非常に粗いことができますか?

答えて

4

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%の時間にわたって実行される関数の正しいパーセントを取得しません)。

+0

wow。 – Strudle

+0

したがって、基本的にカウントは無視され、オーバーフローイベント中のPCの出現をサンプリングするだけです。イベントがCPUサイクルで、十分なサンプルがある場合、その動作を確認できます。しかし、イベントがキャッシュミスなどの場合、どのように動作しますか?キャッシュミスでのオーバーフローイベントも良好な近似値を示すことが保証されていますか? – Strudle

+0

基本的に、サンプリング数はirqではゼロです。すべてのイベントは同じPMUユニットを使用して動作し、異なるイベントIDに対してのみ設定します。最も近いキャッシュへのキャッシュミス(それぞれのコアには独自のL1キャッシュとL2キャッシュがあります)は、ほぼ正確に登録できます(ただし、一部のアーキテクチャでは、LOADコマンドからロードされた値のUSEにスキップすることがあります)。 Offcore/uncoreイベントは、リソースによってはコア間で共有され、グローバルPMUを使用するため容易ではありません。それらを関連付けるために、ローカルPMUの特別な合成イベントを使用して、カウントと経路の割込みを関連付けることができます(しかし、私はこの部分を完全に誤解しています)。 – osgx

関連する問題