生产问题排查手记 列表全部文章
生产问题排查手记

生产问题排查手记:37 篇线上事故的完整排查过程(总目录与症状速查)

从 CPU 飙高、OOM、慢 SQL 到消息堆积、Docker 与 Nginx 故障,37 篇第一人称排查记录的总目录:分层排查地图、症状速查表、按分类索引。

更多

这是一份写给未来自己的线上问题备忘录,也希望能帮到下一个在凌晨被告警叫醒的你。每篇都按同一个套路写:现象 → 排查路线图 → 命令与输出 → 根因 → 止血 → 根治 → 复盘,命令能直接复制,图能直接看懂。

说明:这些案例综合了我自己踩过的坑,以及公开的技术复盘和官方文档,再按第一人称重新讲述;涉及公司、客户、内网的信息全部做了脱敏或改写,文中的 IP、订单号、手机号都是示例值。命令与原理都对照资料核对过,示例输出按真实格式编写,具体数字仅用于说明量级。发现错误欢迎留言。

先看地图:问题在哪一层?

① 入口层 证书过期 · Nginx 502/504 · 413 与 WebSocket 断连 ② 服务治理层 Dubbo 超时重试 · Nacos 配置与注册中心 · XXL-JOB · 链路追踪 ③ 应用进程层 CPU 飙高 · OOM · Full GC · 线程池 · 堆外内存 · 死锁 · Arthas ④ 数据与消息层 慢 SQL · 死锁 · MDL · 主从延迟 · 连接池 · Redis · MQ 堆积与重复 ⑤ 机器与容器层 磁盘 · 负载 · OOM Killer · 句柄 · 挖矿木马 · cron · Docker 全家桶

口诀:由外到内、逐层排除。用户说“慢”,先看入口有没有报错,再看服务有没有超时,然后是进程、数据、机器;每一层只用一两条命令,别一上来就怀疑人生。

症状速查

症状

去读这篇

CPU 800%,接口全超时

CPU 飙到 800%:一条“无辜”的正则,把 8 核机器吃得只剩渣

接口偶发卡几秒

接口“偶发”卡 3 秒?它其实很准时:一次 Full GC 频繁的追凶记

导出报表后进程挂了

导出 50 万行报表,堆直接原地去世:一次 OOM 的 dump 分析与流式改造

堆没满但容器被杀

堆明明没满,容器却被 OOMKilled:一个 ByteBuf 忘了 release 的堆外内存漏洞

下游一慢,上游全挂

下游慢 2 秒,上游全挂:一次线程池被打满的连环追尾

CPU 很低但请求全挂

应用“假死”:CPU 2%,请求全挂,jstack 一眼看出两个线程在互相“谦让”

想不重启就定位慢方法

不重启、不改代码:用 Arthas 现场揪出“偶发 3 秒”的那一次调用

SQL 有索引却很慢

明明建了索引,SQL 却跑成了全表扫描:隐式转换、函数包裹与字符集的“四连暗杀”

Deadlock found (1213)

“Deadlock found when trying to get lock”:两个事务互相谦让,谁也没让成

加字段后整表卡死

给大表加一个字段,整站查询全卡死:一个“睡着”的事务与 Waiting for table metadata lock

刚下的单查不到

刚下的单,转头就查不到:读写分离、主从延迟与那个 500 万行的 DELETE

Connection is not available

HikariPool-1 - Connection is not available:连接池被“借了不还”的事务掏空了

月初热点 key 打爆数据库

月初报税高峰,热点 key 同时“下班”:缓存击穿把 MySQL 打成了 PPT

Redis 隔几分钟抽风

Redis 隔几分钟“抽风”一次:一个 200 万字段的 Hash,拖着全公司业务一起卡

分布式锁锁不住

分布式锁“锁了个寂寞”:任务跑得比锁久,两台机器同时扣了一笔款

“怎么还没收到短信”

“怎么还没收到短信?”RocketMQ 堆了 300 万条消息,我从 Diff Total 一路追到一个死循环重试

重复消费 / 丢消息

用户收到两条短信,另一位用户的扣款却“查无此消息”:MQ 重复与丢失的双面案件

RabbitMQ Unacked 堆积

RabbitMQ 的 Unacked 越攒越多,连接还被 blocked 了:一条忘了 ack 的消息引发的血案

df 满了 du 对不上

df 说磁盘 100%,du 说只用了一半:被 rm 了却还“活着”的日志文件

load 很高 CPU 很闲

load average 飙到 60,CPU 却在摸鱼:一场由 D 状态进程引发的“假繁忙”

Java 进程无声消失

Java 进程“人间蒸发”:没有 hs_err、没有 OOM 异常,凶手是 Linux 的 OOM Killer

Too many open files

Too many open files:一个没关的 HttpClient,攒出了三万个 CLOSE_WAIT

CPU 100% 的陌生进程

服务器 CPU 100%,罪魁是个名字很奇怪的进程:一次挖矿木马应急响应

手敲能跑 cron 不跑

手敲能跑,放进 cron 就“装死”:定时任务没执行的八种死法

容器反复重启 137

容器每 40 秒“重生”一次:Restarting、exit 137 与一场 restart always 引发的重启风暴

Docker 吃光根分区

根分区 100%:一个没配 max-size 的 json.log,把 200G 磁盘“吃”成了 0 字节

容器里访问不通

容器里 curl localhost 永远拒绝连接:Docker 网络的五个经典“不通”与 ufw 那个著名的坑

JVM 进容器后水土不服

Java 搬进 Docker 就“水土不服”:容器 2G 内存,JVM 却以为自己有 64G

挂载 Permission denied

挂载目录 Permission denied 及两个“难兄难弟”:时区差 8 小时、改了代码镜像纹丝不动

Nginx 502 / 504

502 还是 504?Nginx 给你的不是报错,是一张“尸检报告”

全站证书报错

早上全站“您的连接不是私密连接”:一张证书过期,让我提前体验了“社死”

上传 413 / WebSocket 断

上传 5MB 就 413,WebSocket 每 60 秒准时“下班”:两个 Nginx 默认值的经典坑

慢接口引发雪崩

一个慢接口引发的雪崩:Dubbo 超时 + 默认重试,把流量放大了 3 倍

配置改了不生效

配置改了线上不生效,服务下线了流量还在来:Nacos 配置与注册中心的两类“灵异事件”

ES 写入全部 403

ES 写入全线 403:磁盘刚到 95%,整个集群就“只读”了——水位线三兄弟与 read_only_allow_delete

定时任务重复 / 不触发

XXL-JOB 的三种“灵异现象”:重复执行、莫名不触发、执行器离线——一次讲透调度链路

用户说“下单慢”

“用户说下单慢”:从一句废话到根因的定位漏斗——traceId、ELK、链路追踪与排查方法论总纲

全部文章(按分类)

Java / JVM 排查(7 篇)

数据库与缓存排查(8 篇)

消息队列排查(3 篇)

服务器与 Linux 排查(6 篇)

Docker 与容器排查(5 篇)

Nginx 与网络排查(3 篇)

微服务与中间件排查(5 篇)

怎么读这个合集

  1. 值班前:先读「用户说下单慢」那篇的方法论,再扫一遍症状速查表。

  2. 出事时:按分层地图定位到层,再进具体文章抄命令。

  3. 事后:把自己的复盘也写成这个格式——写不清楚,就说明还没真懂。

— 感谢读到这里 —发现错误,或想补充?告诉我 →
TURN KNOWLEDGE INTO SOMETHING REAL

有想法,也想把它做出来?

从技术方案到上线交付,聊聊你的下一个项目。

聊聊需求

一起聊聊

搜索文章

输入关键词,按标题和摘要即时筛选。

浏览分类文章归档

阅读设置

字号
行宽
专注模式

专注模式会隐藏页头与侧栏,只留正文。设置保存在当前浏览器。

稍后阅读

保存在当前浏览器,留给下一次安静阅读。

总浏览 -- 次 · 总访客 -- 人 · 今日浏览 -- 次 · 今日访客 -- 人