C语言 “perf_event_attr”结构的“read_format”属性的选项到底是什么?

x9ybnkn6  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(77)

我目前正在使用perf_event_open系统调用(在Linux系统上),我试图理解这个系统调用的一个配置参数,它由struct perf_event_attr结构给出。
这是关于read_format选项。任何人都可以在此syscall的手册页上看到,此参数与此调用的输出相关。
但我不明白每一个可能的论点都能做什么。
尤其是这两种可能性:

  • PERF_FORMAT_TOTAL_TIME_ENABLED
  • PERF_FORMAT_TOTAL_TIME_RUNNING

有没有人知道给予一个直接的答案?

gwbalxhn

gwbalxhn1#

好的.
我想我已经找到了答案。

  • PERF_FORMAT_TOTAL_TIME_ENABLED:似乎“启用时间”是指不再观察事件的时间与事件注册为“待观察”的时间之间的差异。
  • PERF_FORMAT_TOTAL_TIME_RUNNING:似乎“运行时间”是指内核真正观察到事件的时间总和。小于等于PERF_FORMAT_TOTAL_TIME_ENABLED

举例来说:
你告诉你的内核你想在下午1:13:05观察X事件。您的内核在X上创建一个“探测器”,并开始记录活动。然后,由于未知的原因,您在1:14:05 PM停止记录。然后,您在下午1:15:05恢复记录。最后,您在1:15:35 PM停止记录。
您已启用00:02:30时间(1:15:35 PM - 1:13:05 PM = 00:02:30)
和00:01:30运行时间(1:14:05 PM - 1:13:05 PM + 1:15:35 PM - 1:15:05 PM = 00:01:30)
read_format属性可以使用掩码同时具有这两个值。在C++中,它看起来像这样:

event_configuration.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_TOTAL_TIME_RUNNING;

其中event_configurationstruct perf_event_attr的instance。

wz1wpwve

wz1wpwve2#

这个问题的最高答案是不正确的。
CPU具有有限数量的性能计数器。典型的Intel CPU核心有4个通用PMU计数器,加上3个用于指令、周期和参考周期的固定计数器。因此,如果要监视的事件数量超过可用计数器的数量,perf将对事件进行基于时间的多路复用。换句话说,内核以100或1000 Hz的频率切换计数器监视的事件,以便给予每个事件监视硬件的机会。因此,并非所有事件都一直受到监控。
PERF_FORMAT_TOTAL_TIME_ENABLED是启用事件监视的总时间,而PERF_FORMAT_TOTAL_TIME_RUNNING是实际监视事件的总时间。如果被监视的事件数超过计数器数,则后者的时间将小于前者。在这种情况下,报告的值按time_enabled / time_running缩放,以估计在整个监控过程中运行的值。
perf代码中的注解显示了perf_read_format结构应该是什么样子。

相关问题