for (idx = 0; idx < x86_pmu.num_counters; idx++) { if (!test_bit(idx, cpuc->active_mask)) continue; event = cpuc->events[idx]; val = x86_perf_event_update(event); if (val & (1ULL << (x86_pmu.cntval_bits - 1)))
通过上面的分析,我们知道 perf 最终会调用 perf_event_overflow 函数来进行数据采样。所以我们来看看 perf_event_overflow 函数的实现,代码如下: int perf_event_overflow(struct perf_event *event,intnmi, struct perf_sample_data *data, struct pt_regs *regs) { return__perf_event_overflow(event, nmi,1,...
通过上面的分析,我们知道 perf 最终会调用perf_event_overflow()函数来进行数据采样。所以我们来看看perf_event_overflow()函数的实现,代码如下: int perf_event_overflow(struct perf_event *event, int nmi, struct perf_sample_data *data, struct pt_regs *regs) { return __perf_event_overflow(event, nmi...
通过上面的分析,我们知道 perf 最终会调用perf_event_overflow()函数来进行数据采样。所以我们来看看perf_event_overflow()函数的实现,代码如下: int perf_event_overflow(structperf_event*event,intnmi, structperf_sample_data*data, structpt_regs*regs) { return__perf_event_overflow(event,nmi,1,data,regs)...
可以看出,perf_event_overflow() 函数只是对 __perf_event_overflow() 函数的封装。我们接着来分析 __perf_event_overflow() 函数的实现: staticint__perf_event_overflow(struct perf_event*event,int nmi,int throttle,struct perf_sample_data*data,struct pt_regs*regs){...perf_event_output(event,nmi,...
例如,对于CPU时钟事件,当定时器被触发时,会调用perf_swevent_hrtimer函数: c static enum hrtimer_restart perf_swevent_hrtimer(struct hrtimer *hrtimer) { ... event->pmu->read(event); ... } 然后,perf_event_overflow函数会被调用来进行数据采样和收集: c int perf_event_overflow(struct perf...
数据采样是 perf 的核心功能之一。在采样过程中,内核通过调用 perf_event_overflow() 和 perf_event_output() 函数来收集数据,然后通过 perf_output_sample() 和 perf_output_put() 函数将数据保存到环形缓冲区。用户可以通过 mmap() 系统调用来读取环形缓冲区的数据。总结而言,本文详细介绍了 perf...
cache-references [Hardware event] cpu-cycles OR cycles [Hardware event] [...] cgroup-switches [Software event] context-switches OR cs [Software event] cpu-clock [Software event] [...] L1-dcache-load-misses [Hardware cache event]
此外,内核调用perf_event_alloc来分配perf_event时,如果没有指定overflow_handler处理函数,那么内核会根据应用传递的参数设置默认的handler,假如应用没有要求按backwrite的写方向,那么handler就是perf_event_output_forward。 内核写 以perf_event_output_forward为例: ...
perf本身的原理也非常有意思,其把事件源视为perf_event,并分为task和CPU两个维度进行事件触发,本身支持counting,sampling以及bpf作为事件的处理流程。事件源类型(不是机制)被分为Hardware Events,Software Events...