Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用perf根据其他事件的发生情况获取事件计数_Linux_Profiling_Performancecounter_Perf - Fatal编程技术网

Linux 使用perf根据其他事件的发生情况获取事件计数

Linux 使用perf根据其他事件的发生情况获取事件计数,linux,profiling,performancecounter,perf,Linux,Profiling,Performancecounter,Perf,是否有任何可能的方法可以根据其他事件的发生情况获取事件计数器的值? 例如:如果我想知道每次特定计数器达到特定值时性能计数器的值。这不是一个很好或完整的答案,但它太大了,不适合评论 IDK,如果这在perf实用程序本身中是可能的话,但在理论上是的,对于每次计数器溢出时触发中断的遗留事件(以可编程溢出计数;这就是事件采样粒度的工作方式),您可以得到IDK。然后可以从其他事件的计数器读取值。可能使用与perf相同的API,您可以从用户空间编写这样做的代码 但在x86上,您可能不能,因为计数器溢出会将

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

这不是一个很好或完整的答案,但它太大了,不适合评论


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

但在x86上,您可能不能,因为计数器溢出会将事件放入缓冲区,而不是触发一个中断,这样您就可以执行任意其他操作。因此,如果您要使用的事件仅作为精确事件提供,那么您将需要一个不同的解决方案来解决最终问题

(一般而言,关于中断/异常的低级别奖金阅读,包括性能事件与PEB:)


你可能想知道一些事情是如何相互关联的。如果您不能轻松实现,那么当一个事件溢出时想要对其他事件进行采样可能是一个X-Y问题


perf record--timestamp
将在每个事件上添加时间戳。这可能会为您提供学习所需的原始数据。是相关的,并建议使用
perf script
perf record--all cpu--timestamp
的结果执行操作,您可以使用
perf event\u open
执行,但不能直接使用当前版本的
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.