某客户使用内核模块实现了一个 1.33ms 的 hrtimer 定时器, 实际测试下来发现定时非常不准,有时候延迟多达 10 多 ms。
根据 hrtimer 的实现原理,怀疑是中断被异常 disable 过长时间所致。
这篇文章记录了调查过程:
首先给出了用于测试的 hrtimer 内核模块;
其次使用 irqsoff tracer 测试 irq disable 的 latency 和 call trace;
然后使用 Event Tracing 进一步验证了 irq disable 的 latency;
最后给出结论:内核 printk 且和 hrtimer 运行在同一个 core 是造成 hrtimer 不准的罪魁祸首。
Linux arch_timer 是内核最重要的基础设施之一,内核术语中,timer 带有前缀arch,可见其地位之高!内核之 arch_timer 提供系统运行的节拍,是其他定时任务的基础,相当于人之心脏!
The customer reflected the hrtimer has big delay, taking the irqsoff tracer to check the irq disable latency.
About irqsoff tracer: irqsoff Tracer — The Linux Kernel documentation
But when echoing irqsoff to current_tracer, the kernel has WARNING as below, at the same time, no call trace from the trace as well.
某项目 adb 通讯架构如下,两个系统 Linux 和 Android 运行在某 type-1 hypervisor 上,user 通过 adb 同两个系统通讯。
The Linux on top of hypervisor has hrtimer overrun issue, 1.33ms hrtimer may has delay for more than 10ms. The hypervisor supplier hope us check if there are overruns in native Linux.
作为一个 Linux 平台软件工程师,时常面对 panic 的世界。每当早晨打开电脑,看到 teams 人影闪动:”Jianguo,刚刚发现系统 crash 了,请有空看下现场吗?” 这时候我的内心充满了 panic, 真似 “衣带渐宽终不悔,为伊消得人憔悴”, 还似 “天不老,情难绝。心似双丝网,中有千千结” 啊!是时候再次了解下内核 panic 的流程了!