Linux perf
工具(前段时间命名为 perf_events
)有几个内置的通用软件事件。其中最基本的两个是:task-clock
和 cpu_clock
(内部称为 PERF_COUNT_SW_CPU_CLOCK
和 PERF_COUNT_SW_TASK_CLOCK
)。但他们的问题是缺乏描述。
ysdx用户 reports那 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 可能需要定义一个新的计数器。
异常(exception):starting with v4.7-rc1 ,在分析一个或多个 CPU 时 - 而不是特定任务 - 例如perf stat -a
. perf stat -a
显示 cpu-clock
而不是 task-clock
.在这种特定情况下,这两个计数器旨在等效。 cpu-clock
的初衷|在这种情况下更有意义。所以对于 perf stat -a
,你可以忽略这个差异,并将其解释为 task-clock
.
如果您编写自己的代码来分析一个或多个 CPU——而不是特定任务——也许遵循 perf stat -a
的实现是最清楚的。 .但是您可能会链接到这个问题,以解释您的代码在做什么:-)。
Subject: Re: perf: some questions about perf software events
From: Peter ZijlstraOn Sat, 2010-11-27 at 14:28 +0100, Franck Bui-Huu wrote:
Peter Zijlstra writes:
On Wed, 2010-11-24 at 12:35 +0100, Franck Bui-Huu wrote:
[...]
Also I'm currently not seeing any real differences between cpu-clock and task-clock events. They both seem to count the time elapsed when the task is running on a CPU. Am I wrong ?
不,弗朗西斯已经注意到了,我可能在添加
多 pmu 的东西,它在我的待办事项 list 上看(弗朗西斯也递给我
一个小补丁),但我一直被其他东西分心:/
好的。
调整他们两个的期限是否有意义?
此外,在创建任务时钟事件时,将 'pid=-1' 传递给
sys_perf_event_open() 真的没有意义,是吗?
与 cpu 时钟和 'pid=n' 相同:无论值,事件度量
cpu 挂钟。
也许只在 API 中提出一个时钟并在内部绑定(bind)它
时钟到 cpu 或任务时钟取决于 pid 或 cpu 参数将
好些了吗?
不,在一个任务上同时计算 cpu 和任务时钟实际上是有意义的
(CPU时钟基本上是挂钟)。
在更肤浅的层面上,perf stat
cpu-clock
的输出可能与task-clock
略有不同性能早于 v4.7-rc1。例如,它可能会为task-clock
打印“CPUs used”。但不适用于cpu-clock
.