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-clockcpu_clock(内部称为PERF_COUNT_SW_CPU_CLOCKPERF_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-clockcpu-clock 事件的计算方式和时间给出权威答案吗?它们与 linux 内核调度程序有什么关系?

task-clockcpu-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_clocktask_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-clocksleep 1 显示大约1 秒。相反,task-clock 将显示接近于零。使用cpu-clock 读取挂钟时间会很有意义。然后您可以查看cpu-clocktask-clock 之间的比率。

但在当前的实现中,cpu-clock 等价于task-clock。甚至有可能“修复”现有的计数器可能会破坏某些用户空间程序。如果有这样的程序,Linux 可能无法“修复”这个计数器。 Linux 可能需要定义一个新的计数器。

异常:starting with v4.7-rc1,在分析一个或多个 CPU 时 - 而不是特定任务 - 例如perf stat -aperf 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-clockperf 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 - 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

perf 使用字段分隔符选项获取时间

perf工具crash的问题

错误:perf.data 文件没有样本

利用strace和perf分析MySQL运行

Linux内核性能架构:perf_event

perf:无法合成 bpf 事件