通过性能跟踪与ftrace跟踪Linux上下文切换->通过性能跟踪丢失的事件

问题描述

因此,我试图跟踪Linux中的上下文切换,我对sched_wakingsched_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_SAMPLEPERF_RECORD_LOST的所有事件。我确实将FD映射到一个大缓冲区(8MB),一旦读取记录,我就将尾巴从头向前推进。我确实跟踪头部和尾部以检查是否可能被内核覆盖,但是仍有足够的空间。我还将读取时间从100毫秒更改为1秒钟。

使用FTRACE,我同时启用了sched_switchsched_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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...