问题描述
因此,我试图跟踪Linux中的上下文切换,我对sched_waking
和sched_switch
感兴趣,我尝试了两种方法:perf_event_open -> mmap
&& FTRACE
。
借助性能,我正在struct perf_event_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;
然后我将MMAP映射到FD,并转储类型为PERF_RECORD_SAMPLE
和PERF_RECORD_LOST
的所有事件。我确实将FD映射到一个大缓冲区(8MB),一旦读取记录,我就将尾巴从头向前推进。我确实跟踪头部和尾部以检查是否可能被内核覆盖,但是仍有足够的空间。我还将读取时间从100毫秒更改为1秒钟。
使用FTRACE,我同时启用了sched_switch
和sched_waking
:
echo sched_switch > set_event
echo sched_waking >> set_event
current_tracer = nop
tracing_on = 1
我得到的结果显示,当报告的事件超过约5K时,性能损失事件发生,而FTRACE则没有。
检查每个核心结果,显示收集的事件+通过性能报告的丢失事件与通过FTRACE收集的事件匹配。
现在,FTRACE具有per_cpu/cpuN/stats
,它显示由于覆盖而导致的丢弃事件,但这又是一个缺点,如果我通过FTRACE读取生成的事件,该计数器保持为0,而perf报告丢失的事件。
我还玩过/proc/sys/kernel/perf_event_max_sample_rate
和&/proc/sys/kernel/perf_cpu_time_max_percent
,也完全禁用了后者(= 0),这没有帮助。
我正在使用内核4.15.0-112-generic
,该内核运行在AMD Ryzen 2950X,16核,32线程上。
我当然可以开始调试内核为什么会有丢失的事件,在这个时候我不确定这是因为我没有调整旋钮,或者在跟踪ftrace事件时perf增加了额外的开销,或者,有一个错误。任何帮助表示赞赏。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)