我目前正在使用perf_event_open
系统调用(在Linux系统上),我试图理解这个系统调用的一个配置参数,它由struct perf_event_attr
结构给出。
这是关于read_format
选项。任何人都可以在此syscall的手册页上看到,此参数与此调用的输出相关。
但我不明白每一个可能的论点都能做什么。
尤其是这两种可能性:
- PERF_FORMAT_TOTAL_TIME_ENABLED
- PERF_FORMAT_TOTAL_TIME_RUNNING
有没有人知道给予一个直接的答案?
2条答案
按热度按时间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
是struct perf_event_attr
的instance。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
结构应该是什么样子。