Linux perf 事件:cpu-clock 和 task-clock - 有啥区别
Posted
技术标签:
【中文标题】Linux perf 事件:cpu-clock 和 task-clock - 有啥区别【英文标题】:Linux perf events: cpu-clock and task-clock - what is the differenceLinux perf 事件:cpu-clock 和 task-clock - 有什么区别 【发布时间】:2014-05-31 00:52:06 【问题描述】:Linux perf
工具(前段时间命名为perf_events
)有几个内置的通用软件事件。其中最基本的两个是:task-clock
和cpu_clock
(内部称为PERF_COUNT_SW_CPU_CLOCK
和PERF_COUNT_SW_TASK_CLOCK
)。但他们的问题是缺乏描述。
ysdx用户reportsman 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
什么时候会给出不同的值?我应该使用哪一个?
【问题讨论】:
Frederic Weisbecker supposed 在 2010 年的 LKML 中指出:“cpu-clock 是基于在 cpu 上花费的总时间。task-clock 仅基于在配置文件上花费的时间任务,因此不计算花费在其他任务上的时间,它具有每个线程的粒度”,并指出他“在..解释中可能有某种错误”。还有 Peter Zijlstra says 说“在一个任务上同时计算 cpu 和任务时钟实际上是有意义的(cpu 时钟基本上是墙上时间)。” 两个事件的源文件:kernel/events/core.c
,"Software event: cpu wall time clock" (line 6092, cpu_clock_event_*
) 用于 cpu 时钟 (pmu perf_cpu_clock
),"Software event: task time clock" (line 6168, task_clock_event_*
) 用于任务时钟 (pmu perf_task_clock
)。两者都是基于hrtimers,但更新功能不同:cpu_clock_event_update
使用local_clock
和task_clock_event_update
使用event->ctx->time
....
Robert Haas, "perf: the good, the bad, the ugly", 2012:"但是 perf 还包括软件事件,例如 cpu-clock 和 task-clock,它们除了 Linux 内核之外没有任何意义,并且没有关于这些含义的文档。我通过使用默认事件、周期、任务时钟和 cpu 时钟进行分析,得到大致相同的结果,......没有任何解释有什么区别。为了使 perf 广泛有用,......它需要解释所有内容的文档这些事件是什么,以及如何有效地利用它们。"
对我来说,描述看起来像 cpu 时钟可能是操作系统开始时间的 jiffies 数量。任务时钟可能是任务开始后的瞬间。请查看手册页 proc(5) 并在其中搜索 starttime。也许***.com/a/44524937/1950345可以给你更多的信息。
@reichhart,性能使用值之间的差异,而不是绝对值。你甚至使用过性能记录或性能统计吗?您的评论可能与问题无关:在性能代码中,cpu 时钟为 local_clock()
,任务时钟为 perf_clock()
和一些 hrtimer。
【参考方案1】:
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 可能需要定义一个新的计数器。
异常: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
的实现可能是最清楚的。但是您可能会链接到这个问题,以解释您的代码在做什么:-)。
主题:Re: perf: some questions about perf software events 来自:Peter Zijlstra
2010 年 11 月 27 日星期六 14:28 +0100,Franck Bui-Huu 写道:
Peter Zijlstra 写道:
2010 年 11 月 24 日星期三 12:35 +0100,Franck Bui-Huu 写道:
[...]
另外,我目前没有看到 cpu-clock 和 任务时钟事件。他们似乎都在数时间 任务在 CPU 上运行。我错了吗?
不,弗朗西斯已经注意到了,我可能在添加 多 pmu 的东西,它在我的待办事项清单上看(弗朗西斯也递给我 一个小补丁),但我总是被其他东西分心:/
好的。
调整他们两个的时间段有意义吗?
此外,在创建任务时钟事件时,将 'pid=-1' 传递给 sys_perf_event_open() 真的没有意义,不是吗?
与 cpu 时钟和 'pid=n' 相同:任何值,事件度量 cpu 挂钟。
也许在 API 中只提议一个时钟并在内部绑定它 时钟到 cpu 或任务时钟取决于 pid 或 cpu 参数将 好点了吗?
不,实际上在一个任务上同时计算 cpu 和任务时钟是有意义的 (cpu 时钟基本上是挂钟)。
在更肤浅的层面上,cpu-clock
的perf stat
输出可能与早于 v4.7-rc1 的 perf 中的task-clock
的输出略有不同。例如,它可能会为task-clock
打印“CPUs used”,但不会为cpu-clock
打印。
【讨论】:
您能否在此处链接您引用的邮件列表存档,仅供参考,以便我们知道您引用的谁? @PeterCordes +1,已编辑。我有点回答问题cmets。希望这是权威的答案,所有的问题都可以擦掉:-)。In this specific case, the two counters were intended to be equivalent. The original intention for cpu-clock makes more sense in this case.
但是在 per-cpu 模式下,只有 cpu-clock 才有意义。这就是为什么在 v4.7-rc1 中,在 per-cpu 模式下默认使用 cpu-clock 而不是 task-clock。 (请参阅我对答案的编辑。)【参考方案2】:
一般来说: 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://***.com/a/20378648/8223204
【讨论】:
Patrick,我不需要关于 perf 使用的基本信息,而是确切软件事件之间的真正区别:cpu-clock 和 task-clock(参考文档或内核源代码或书籍)。两者都将测量并行任务的时间,因为当线程处于活动状态(在此核心上运行)时 cpu-clock 滴答作响。换句话说:这些事件之间何时会有巨大差异在命令perf stat -e cpu-clock,task-clock ./program
中,例如echo 2^234567%2 | perf stat -e cpu-clock,task-clock /usr/bin/bc
1 个线程和perf ... pixz -1 ./huge_file
(多线程)显示几乎相等的计数。【参考方案3】:
根据this message,他们测量的是相同的东西。
它们只是采样时间不同。
cpu-clock 是基于挂钟的——所以样本是定期采集的 相对于 walltime 的间隔。 我相信任务时钟与任务运行时间有关。所以, 相对于过程定期取样' 运行时。
当我在我的多线程应用程序上运行它时,它确实显示了几乎相同的值。
【讨论】:
您的参考资料很旧,来自可能不是内核/性能开发人员的 David Ahern。程序的挂起时间是多少(仅分析单个程序的情况,因此仅当程序或内核代表它工作时才打开分析 - 所以当任务正在运行时)?当每个 CPU 上运行一些线程(用户或内核)并且即使在空闲时也有合成任务正在运行(elixir.free-electrons.com/linux/v4.13.10/source/kernel/sched/…以上是关于Linux perf 事件:cpu-clock 和 task-clock - 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章