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