使用 perf 获取事件计数取决于其他事件的发生

Posted

技术标签:

【中文标题】使用 perf 获取事件计数取决于其他事件的发生【英文标题】:Using perf to get events counts depending on the occurrence of other events 【发布时间】:2018-04-19 03:54:00 【问题描述】:

是否有任何可能的方法可以根据其他事件的发生来获取事件计数器的值? 例如:如果我想知道每次特定计数器达到特定值时性能计数器的值。

【问题讨论】:

【参考方案1】:

您可以使用 perf_event_open 做到这一点,但 AFAIK 不能直接使用当前版本的 perf record

我想知道每次特定计数器达到特定值时性能计数器的值。

使用一组事件,“特定计数器”是组长。对于您设置的此事件:

struct perf_event_attr leader;
leader.sample_type = PERF_SAMPLE_TIME | PERF_SAMPLE_READ;
leader.sample_period = specific_value;
// set type/config accordingly
leader.read_format = PERF_FORMAT_GROUP;
group_fd = syscall(__NR_perf_event_open, &leader, tid, cpu, -1, 0);
...

struct perf_event_attr other;
other.sample_period = 0; // doesn't trigger overflows
// set type/config accordingly
syscall(__NR_perf_event_open, &other, tid, cpu, group_fd, 0);

// do the mmap dance, ioctl etc. with the fd you get for the leader
// read values from both leader and other counters in your mmap buffer.

【讨论】:

【参考方案2】:

这不是一个很好或完整的答案,但对于评论来说太大了。


IDK,如果 perf 实用程序本身可以实现的话,但理论上是的,对于每次计数器溢出时触发中断的遗留事件(在可编程溢出计数下;这就是事件采样粒度的工作方式),您可以得到它.然后,您可以从计数器中读取其他事件的值。可能使用与 perf 相同的 API,您可以编写从用户空间执行此操作的代码。

但在 x86 for PEBS (precise events) 上,您可能无法做到,因为计数器溢出会将事件放在缓冲区中,而不是在您可以执行任意其他操作时立即触发中断。因此,如果您要使用的事件仅作为精确事件可用,那么您将需要针对最终问题的不同解决方案。

(关于一般中断/异常的低级奖励阅读,包括性能事件与 PEBS:When an interrupt occurs, what happens to instructions in the pipeline?)


您可能想了解事件之间的相互关系。想要在一个溢出时对其他事件进行采样可能是一个 X-Y 问题,如果您无法轻松实现它。

perf record --timestamp 将为每个事件添加一个时间戳。这可能会为您提供了解您想知道的内容所需的原始数据。 Collecting the data for a partiulcar process from PMU for every 1 milli second 是相关的,建议使用perf script 来处理perf record --all-cpus --timestamp 的结果。

【讨论】:

以上是关于使用 perf 获取事件计数取决于其他事件的发生的主要内容,如果未能解决你的问题,请参考以下文章

perf-perf stat用户层代码分析

perf命令

perf.data 到文本或 csv

perf界面乱码

ARM Cortex-A7 中的事件计数器

使用 linux perf 工具测量应用程序的 FLOP