Linux perf
ツール(以前はperf_events
と名付けられた)には、組み込みのユニバーサルソフトウェアイベントがいくつかあります。それらの最も基本的な2つは、task-clock
およびcpu_clock
(内部ではPERF_COUNT_SW_CPU_CLOCK
およびPERF_COUNT_SW_TASK_CLOCK
と呼ばれます)です。しかし、彼らの何が問題なのかは、説明不足です。
ysdx user reports that man perf_event_open
には短い説明があります:
PERF_COUNT_SW_CPU_CLOCK
This reports the CPU clock, a high-resolution per-
CPU timer.
PERF_COUNT_SW_TASK_CLOCK
This reports a clock count specific to the task
that is running.
しかし、説明は理解しにくいです。
誰かがtask-clock
およびcpu-clock
イベントがいつどのように説明されるかについて信頼できる回答を提供できますか? Linuxカーネルスケジューラとどのように関連していますか?
task-clock
とcpu-clock
が異なる値を返すのはいつですか?どちらを使用すればよいですか?
1)デフォルトでは、perf stat
はtask-clock
を表示し、cpu-clock
は表示しません。したがって、task-clock
の方がはるかに有用であると予想されたことがわかります。
2)cpu-clock
は単に壊れており、何年も修正されていません。無視するのが最善です。
cpu-clock
のsleep 1
が約1秒と表示されるのは意図したでした。対照的に、task-clock
はゼロに近い値を示します。 cpu-clock
を使用して実時間を読み取ることは理にかなっています。次に、cpu-clock
とtask-clock
の比率を確認できます。
ただし、現在の実装では、cpu-clock
はtask-clock
と同等です。既存のカウンタを「修正」すると、一部のユーザー空間プログラムが壊れる可能性さえあります。そのようなプログラムがある場合、Linuxはこのカウンターを「修正」できない可能性があります。 Linuxは代わりに新しいカウンターを定義する必要があるかもしれません。
例外: v4.7-rc1以降 、特定のタスクではなく、CPUをプロファイリングする場合-たとえば、 perf stat -a
。 perf stat -a
は、cpu-clock
ではなくtask-clock
を表示します。この特定のケースでは、2つのカウンターは同等であることが意図されていました。この場合、cpu-clock
の本来の意図はより理にかなっています。したがって、perf stat -a
の場合、この違いを無視してtask-clock
として解釈することができます。
特定のタスクではなく、CPUのプロファイルを作成する独自のコードを作成する場合、perf stat -a
の実装に従うことが最も明確です。しかし、あなたのコードが何をしているかを説明するために、この質問にリンクするかもしれません:-)。
件名: Re:perf:perfソフトウェアイベントに関するいくつかの質問
差出人:Peter Zijlstra2010-11-27(土)14:28 +0100に、フランクブイフーは次のように書いています。
Peter Zijlstraはこう書いている:
2010年11月24日水曜日の12:35 +0100に、フランクブイフーは次のように書いています。
[...]
また、現在、CPUクロックイベントとタスククロックイベントの間に実際の違いはありません。どちらも、タスクがCPUで実行されているときに経過した時間をカウントするようです。私が間違っている ?
いいえ、フランシスはすでにそれに気付いていました。おそらくmulti-pmuのものを追加したとき、私はそれを破壊しました。それは私のtodoリストを見て確認しました(Francisも私に小さなパッチレットを渡してくれました)。
OK。
両方の期間を調整することは意味がありますか?
また、タスククロックイベントを作成するときに、「pid = -1」をsys_perf_event_open()に渡しても意味がありませんか?
CPUクロックおよび「pid = n」と同じ:値が何であれ、イベントはCPUウォールタイムクロックを測定します。
おそらく、APIで1つのクロックのみを提案し、pidまたはcpuパラメータに応じて、このクロックを内部的にCPUまたはタスククロックにバインドする方が良いでしょう。
いいえ、実際にはタスクのCPUクロックとタスククロックの両方をカウントすることは理にかなっています(CPUクロックは基本的にウォールタイムです)。
より表面的なレベルでは、perf stat
のcpu-clock
出力は、v4.7-rc1より前のperfのtask-clock
の出力とわずかに異なる場合があります。たとえば、task-clock
の場合は「使用されたCPU」を出力しますが、cpu-clock
の場合は出力しません。
一般的に言って:cpu-clockイベントは時間の経過を測定します。 Linux CPUクロックをタイミングソースとして使用します。
以下は、perfを使用して実行のホットスポットを見つけることに関する詳細な記事です。 http://sandsoftwaresound.net/perf/perf-tutorial-hot-spots/
タスククロックは、ジョブの並列度/使用されたCPUの数を示します。この概要には、perfによって生成された出力の詳細情報が含まれています。 https://doc.zih.tu-dresden.de/hpc-wiki/bin/view/Compendium/PerfTools
ここにもたくさんの情報があります: https://stackoverflow.com/a/20378648/8223204
このメッセージ によると、彼らは同じことを測定します。
サンプリングするタイミングが異なるだけです。
cpu-clockは実時間ベースです-したがって、サンプルは実時間に対して一定の間隔で取得されます。タスククロックはタスクの実行時間に関連していると思います。したがって、サンプルはプロセスのランタイムに関連して定期的に取得されます
マルチスレッドアプリで実行すると、ほぼ同じ値が表示されます。