cat case/PM-2012-0053.md

Linux 内核 2012-07-01 闰秒在 timer 中断中 printk 触发 xtime_lock 死锁

P2 · 闰秒期间内核在持 xtime_lock 的定时器中断中调用 printk,引发多服务(Java/MySQL)死锁/活锁

summary

2012-07-01 闰秒期间,Linux 内核在持有 xtime_lock 的定时器中断上下文里调用了 printk,某些工作负载(如 Java、MySQL)因此陷入死锁/活锁,服务挂起或 CPU 飙高。

timeline

闰秒生效时刻,受影响机器在内核定时器路径持有 xtime_lock 时执行 printk 并阻塞,导致其他需要该锁的路径永久等待;运维通过重启或 workaround(如停 NTP 再手动设时)恢复。

root_cause

内核代码在持有关键锁(xtime_lock)的中断上下文中执行了可能阻塞的 printk,属于人为引入的锁使用不当;闰秒这一罕见时间事件把它触发出来。

amplifiers

闰秒等低频事件平时不触发,但一旦到来即在海量机器上同时暴露;中断上下文持锁 + 阻塞调用是经典死锁配方。

mitigation

内核社区修复了闰秒处理路径,避免在持锁中断中调用 printk,并改进闰秒相关逻辑;各发行版推送更新。

lessons

中断/持锁上下文严禁调用可能阻塞的函数;低频时间边界(闰秒、时区)必须作为独立测试场景覆盖。

checklist

锁临界区不放阻塞调用;闰秒/时钟变更纳入回归测试;关键服务对时钟跳变有可观测与自动恢复手段。