如果我有perf_event_open(&attr, tid, -1, -1, 0)和
attr.sample_period = _interval; (1ms)
attr.sample_type = PERF_SAMPLE_CALLCHAIN;这到底是什么意思呢?这是否意味着当线程在任何CPU上花费了恰好1ms时,我注册的处理程序都会收到一个调用链的通知?如果线程在CPU-1上花费500us,现在在CPU-2上达到500us,那么一个信号(SIGPROF)将由运行在CPU上的同一线程传播到进程的处理程序?
发布于 2020-11-17 21:04:33
根据the manual的说法,每次经过事件周期,它都是从当前指令开始的堆栈回溯(因此是函数调用链)。sample_max_stack字段提供要存储的最大帧数,exclude _callchain_ user /内核字段分别排除用户和内核空间帧。
传递给perf_event_open()的第三个参数决定考虑哪个cpu:
int perf_event_open(struct perf_event_attr *attr,
pid_t pid, int cpu, int group_fd,
unsigned long flags);当您为此参数传递-1时:
pid >0和CPU == -1它测量任何cpu上的指定进程/线程。
注意事项:在英特尔体系结构上,性能监控单元(PMU)具有一种称为处理器基于事件的采样(PEBS)和性能监控中断的功能,该功能在计数器溢出条件下触发。PEBS使用调试存储机制和PMI来存储处理器的一组体系结构状态信息。
此document提供了有关perf如何操作的一些详细信息。采样周期是根据事件的发生次数来表示的,而不是计时器节拍的数量。
此document提供了有关在几种硬件架构上实现采样的方式的更多信息。
https://stackoverflow.com/questions/64873934
复制相似问题