web-dev-qa-db-ja.com

Linuxパフォーマンスイベント:CPUクロックとタスククロック-違いは何ですか

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-clockcpu-clockが異なる値を返すのはいつですか?どちらを使用すればよいですか?

35
osgx

1)デフォルトでは、perf stattask-clockを表示し、cpu-clockは表示しません。したがって、task-clockの方がはるかに有用であると予想されたことがわかります。

2)cpu-clockは単に壊れており、何年も修正されていません。無視するのが最善です。

cpu-clocksleep 1が約1秒と表示されるのは意図したでした。対照的に、task-clockはゼロに近い値を示します。 cpu-clockを使用して実時間を読み取ることは理にかなっています。次に、cpu-clocktask-clockの比率を確認できます。

ただし、現在の実装では、cpu-clocktask-clockと同等です。既存のカウンタを「修正」すると、一部のユーザー空間プログラムが壊れる可能性さえあります。そのようなプログラムがある場合、Linuxはこのカウンターを「修正」できない可能性があります。 Linuxは代わりに新しいカウンターを定義する必要があるかもしれません。

例外: v4.7-rc1以降 、特定のタスクではなく、CPUをプロファイリングする場合-たとえば、 perf stat -aperf stat -aは、cpu-clockではなくtask-clockを表示します。この特定のケースでは、2つのカウンターは同等であることが意図されていました。この場合、cpu-clockの本来の意図はより理にかなっています。したがって、perf stat -aの場合、この違いを無視してtask-clockとして解釈することができます。

特定のタスクではなく、CPUのプロファイルを作成する独自のコードを作成する場合、perf stat -aの実装に従うことが最も明確です。しかし、あなたのコードが何をしているかを説明するために、この質問にリンクするかもしれません:-)。

件名: Re:perf:perfソフトウェアイベントに関するいくつかの質問
差出人:Peter Zijlstra

2010-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 statcpu-clock出力は、v4.7-rc1より前のperfのtask-clockの出力とわずかに異なる場合があります。たとえば、task-clockの場合は「使用されたCPU」を出力しますが、cpu-clockの場合は出力しません。

6
sourcejedi

一般的に言って: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

0

このメッセージ によると、彼らは同じことを測定します。

サンプリングするタイミングが異なるだけです。

cpu-clockは実時間ベースです-したがって、サンプルは実時間に対して一定の間隔で取得されます。タスククロックはタスクの実行時間に関連していると思います。したがって、サンプルはプロセスのランタイムに関連して定期的に取得されます

マルチスレッドアプリで実行すると、ほぼ同じ値が表示されます。

0
Bram