从12%到100%:一次由“内存泄漏”引发,被“Soft Lockup”终结的48小时系统崩溃实录 原

张开发
2026/4/10 16:43:20 15 分钟阅读

分享文章

从12%到100%:一次由“内存泄漏”引发,被“Soft Lockup”终结的48小时系统崩溃实录                                                原
我们复盘了这次惊心动魄的线上故障发现最致命的不是内存耗尽而是内核在彻底崩溃前发出的最后一声呐喊。引言那个被忽略的、价值百万的“稻草”监控告警响了10天内存曲线从12%爬升到48%所有人都在找是哪个应用“吃”掉了内存。直到2月24日下午3点CPU核心使用率猛地撞上100%的红线一条来自内核深处的日志闪现BUG: soft lockup - CPU#7 stuck for 22s!18小时后系统彻底“脑死亡”。我们后来才知道这条日志是内核在心脏停跳前最后的求救信号。第一章慢性死亡——那条被忽视的、持续10天的上扬曲线故障复盘常常始于一条看似温和的曲线。在过去10天里一台核心业务服务器的内存使用率从12%匀速爬升至48%。运维视角“内存还够可能是业务量增长保持观察。”监控视角每日3-5%的稳定增长不符合业务波动规律触发了“内存增长趋势告警”但等级仅为“警告”。真相这是一个典型的内存泄漏。像浴室里一个未拧紧的水龙头日夜不息地滴漏终将盛满整个水槽。技术点1内存泄漏的隐蔽性应用程序在申请内存后未能正确释放这部分内存就会被永久占用。在低压力下它像背景噪音但当泄漏累积到临界点通常是总内存的70%-80%系统将变得无比脆弱任何风吹草动都可能成为压垮骆驼的最后一根稻草。我们的系统此时正站在这根稻草之上。第二章急性发作——内核的“SOS”与监控图的“死亡心电图”2月24日 14:56真正的“刽子手”登场。监控系统记录下了系统濒死前的“心电图”。这张图就是最直接的“犯罪现场”记录让我们解读这张“死亡心电图”顶部 - 5分钟平均负载Load5从约0.04瞬间飙升至51.18这意味着有超过50个进程在排队等待CPU资源系统拥堵已达崩溃边缘。中部 - 总体CPU使用率峰值达到67.1%但请注意在软死锁发生时总体使用率未必是100%因为一个核心的彻底僵死会拖累整体调度效率。底部 - 致命一击CPU单核使用率看最后一行cpu7的数据“1.40%” - “100.00%”。紫色折线在14:56左右拉出一条绝望的垂直直线直至100%的顶点并维持。这正是soft lockup发生的直观体现——CPU 7号核心被某个内核任务彻底独占陷入死循环。与此同时内核日志留下了铁证NMI watchdog: BUG: soft lockup - CPU#7 stuck for 22s! [runc:[1:CHILD]:26303]技术点2Soft Lockup 为何如此致命你可以将每个CPU核心想象成一条繁忙的高速公路收费亭。soft lockup意味着收费员内核调度器在7号收费亭里晕倒了22秒。这导致交通彻底瘫痪所有要经过7号亭的车进程任务排起长队系统负载Load暴增如上图负载从0.04飙升至51.18。救援通道被堵甚至连“拖车”OOM Killer进程清理和“急救车”监控Agent都无法通过这个亭子。局部脑死亡这个CPU核心在内核层面“脑死亡”无法处理任何有意义的指令表现为使用率恒定为100%。在我们的案例中正是持续的内存泄漏最终触发了某个内核或驱动程序的BUG导致在7号核心上执行的关键任务陷入死循环从而引发了这场“软死锁”。技术点3Soft Lockup vs. 普通应用卡死应用卡死只是一个“门店”关门整条“商业街”系统还可运行。Soft Lockup是“交通枢纽”瘫痪整片区域的运行逻辑崩溃。第三章崩溃时刻——故障链条的最终闭合当7号CPU核心瘫痪多米诺骨牌被彻底推倒负载雪崩一个核心的失效任务被重新调度到其他核心引发连锁拥堵。救援失败系统试图通过OOM Killer杀死进程释放内存但关键的内核线程可能已无法正常响应。彻底静默经过18小时的挣扎在2月25日08:47系统内核最终完全停止响应。蓝鲸监控的“心跳丢失”告警不过是给一具已经凉透的躯体开具的死亡证明。从内存泄漏到OOM再到Soft Lockup最终到系统硬死机一条完整而经典的系统性故障链条就此闭合。第四章黄金十分钟——我们能从中学到什么故障在15分钟内通过重启恢复但业务影响长达18小时。这“失去的18小时”是本可避免的沉没成本。以下是我们用真金白银换来的三条“防崩”铁律铁律一监控必须“闻到”内核的焦味升级你的监控不要只监控应用层。soft lockup、hard lockup、RCU stall等内核日志关键字必须设置为P0级电话告警。建立关联告警当“内存使用率 70%”且“单个CPU核心使用率 95%持续1分钟”时立即触发故障预诊断流程。可视化关键指标必须将CPU单核使用率与系统负载Load作为核心监控视图如上图所示二者结合是判断软/硬锁死的最直观依据。铁律二预案必须写到“内核恐慌”之前内存泄漏预案内存日均增长超3%自动抓取进程内存快照定位嫌疑进程。Soft Lockup应急预案立即抓取现场通过sysrq等命令在重启前强制获取所有CPU堆栈这是最宝贵的尸检报告。明确决策树一旦确认非临时锁死应果断在业务低峰期重启。与一个状态未知的内核赌博胜率为零。铁律三文化必须敬畏每一条警告曲线所有突发的崩溃都是蓄谋已久的伏击。那条爬升了10天的内存曲线和那张图中cpu7那条冲顶后僵直的紫色尖峰共同完成了这次“伏击”。运维的终极艺术是在系统“叹息”和“痉挛”单核冲高时就听见、看见它的痛苦。结语这次故障始于一段“健忘”的代码内存泄漏经过一次“错误”的内核调度BUG最终被一个“失效”的监控所放过。它像一部精密的灾难片每个环节都为我们亮起了红灯却又被我们一一略过。系统稳定性是一个关于“敬畏”的命题。敬畏每一条反常的曲线敬畏每一条晦涩的日志敬畏系统在崩溃前向我们发出的每一次、哪怕最微弱的求救。自查请将本文转发至你的技术团队群并立即检查你的监控是否覆盖了内核soft lockup告警你的监控大屏能否一眼看到“CPU单核使用率”和“系统负载”的关联曲线你的系统过去一周是否有任何一条持续上扬的、令你隐隐不安的资源曲线它像一部精密的灾难片每个环节都为我们亮起了红灯却又被我们一一略过。系统稳定性是一个关于“敬畏”的命题。敬畏每一条反常的曲线敬畏每一条晦涩的日志敬畏系统在崩溃前向我们发出的每一次、哪怕最微弱的求救。

更多文章