通过perf vs ftrace跟踪Linux上下文切换->;通过性能丢失事件
因此,我试图在Linux中跟踪上下文切换,我对通过perf vs ftrace跟踪Linux上下文切换->;通过性能丢失事件,linux,events,scheduling,perf,ftrace,Linux,Events,Scheduling,Perf,Ftrace,因此,我试图在Linux中跟踪上下文切换,我对sched_waking和sched_switch感兴趣,我尝试了两种方法:perf_event_open->mmap和&FTRACE 使用perf,我正在结构perf\u事件\u attr中配置以下内容: config = 305; // 305 for sched_switch / 308 for sched_waking type = PERF_TYPE_TRACEPOINT; sample_period = 1; sample_type =
sched_waking
和sched_switch
感兴趣,我尝试了两种方法:perf_event_open->mmap
和&FTRACE
使用perf,我正在结构perf\u事件\u attr
中配置以下内容:
config = 305; // 305 for sched_switch / 308 for sched_waking
type = PERF_TYPE_TRACEPOINT;
sample_period = 1;
sample_type = PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | PERF_SAMPLE_CPU;
然后,我映射FD并转储类型为PERF\u RECORD\u SAMPLE
和PERF\u RECORD\u LOST
的所有事件。我将FD映射到一个大的缓冲区(8MB),在那里,一旦读取记录,我就将尾部推进到头部。我确实跟踪了头部和尾部,以检查内核是否有可能覆盖,但是,还有很多空间。我还将读取时间从100毫秒改为1秒
使用FTRACE,我同时启用sched_开关
和sched_唤醒
:
echo sched_switch > set_event
echo sched_waking >> set_event
current_tracer = nop
tracing_on = 1
我得到的结果显示,当报告的事件超过5公里时,perf会丢失事件,而FTRACE不会。
检查每个核心结果,显示收集的事件+通过perf报告的丢失事件与通过FTRACE收集的事件匹配。
现在,FTRACE有per_cpu/cpuN/stats
,它显示由于覆盖而丢弃的事件,但这是另外一回事,如果我通过FTRACE读取生成的事件,这个计数器保持在0,而perf报告丢失的事件
我还玩了/proc/sys/kernel/perf\u event\u max\u sample\u rate
&/proc/sys/kernel/perf\u cpu\u time\u max\u percent
,也完全禁用了后者(=0),这没有帮助
我正在使用内核4.15.0-112-generic
,运行在AMD Ryzen 2950X、16核、32线程上
当然,我可以开始调试内核,为什么会有丢失的事件,现在我不确定这是因为我没有调整旋钮,或者perf在跟踪ftrace事件时增加了额外的开销,或者,有一个bug。非常感谢您的帮助