实时延迟出现尖峰时,先要知道那段时间被谁占走了。osnoise tracer 在指定 CPU 上运行采样线程,比较它本该运行的时间和实际得到的时间,再把缺口和 IRQ、softirq、NMI、调度等内核事件对上。它适合用来拆开“偶尔抖一下”到底是哪类干扰。
osnoise 与 timerlat 的分工
timerlat 从定时器到期开始,关注 IRQ 延迟和被唤醒线程真正获得 CPU 的延迟;osnoise 则在一个 CPU 上持续观察“本应属于采样线程的时间为什么消失”。前者更适合解释周期唤醒尖峰,后者更适合枚举该 CPU 长期存在的各种噪声。二者通常应配合:先用 cyclictest/timerlat 发现 deadline 风险,再用 osnoise 和 ftrace 追根因。
先让测量条件可重复
采样线程应绑定到要研究的 CPU,尽量避免测试程序自身在核心间迁移。启动前记录 CPU 隔离配置、IRQ 分布、频率 governor、C-state、内核版本和系统负载;否则同一个“最大噪声”无法与下次比较。
1 | # 先查看 rtla 提供的子命令与本机内核支持情况 |
不同内核版本的 rtla osnoise 参数会有差异,因此更稳妥的做法是先阅读本机 --help,把实际命令、持续时间和阈值写入测试脚本,而不是复制一条未知版本的命令。
从一个缺口走到根因
发现一个 300 微秒缺口后,先锁定它发生的时间窗口和 CPU。若同时看到某个网卡 IRQ 或 ksoftirqd 活跃,优先检查 IRQ affinity、队列和 NAPI;若 trace 中没有合理的内核事件,却在温度或 BIOS 事件附近反复出现,则继续怀疑 NMI、SMI 或固件。每次只调整一个因素,然后在同一负载、同一时间长度下复测。
osnoise 只告诉你线索,不会替你修好系统。把结果和业务超时、硬件中断、功耗状态、实际负载一起记录,才知道这次尖峰值不值得处理、该从哪里下手。
参考:OSNOISE Tracer · rtla