置顶生产问题排查手记:37 篇线上事故的完整排查过程(总目录与症状速查)
从 CPU 飙高、OOM、慢 SQL 到消息堆积、Docker 与 Nginx 故障,37 篇第一人称排查记录的总目录:分层排查地图、症状速查表、按分类索引。
从一个关键词,发现新的思路。
从 CPU 飙高、OOM、慢 SQL 到消息堆积、Docker 与 Nginx 故障,37 篇第一人称排查记录的总目录:分层排查地图、症状速查表、按分类索引。
客服转来一句“下单好慢”,怎么在半小时内定位到具体机构、具体接口、具体那一行调用?本文用一个完整时间线讲 traceId 贯穿(MDC、网关、Dubbo、MQ、线程池的坑)、Kibana KQL 检索、SkyWalking 看 span 耗时,并总结排查先问的 5 个问题和“定位漏斗”。
日志写入突然全部失败,报 index read-only / allow delete (api),集群还变了 yellow。顺着 _cluster/health、_cat/allocation、allocation/explain 一路查到磁盘水位线,讲清 85/90/95 三道线、解除只读的正确姿势,以及分片过多这个隐形推手。
接口 P99 隔几分钟就冲到 3 秒,机器 CPU 却不高。开 GC 日志、jstat 看趋势,发现老年代被一个无界的静态 Map 缓存慢慢撑满,Full GC 越来越频繁。附 JDK8 与 JDK11+ 日志参数、G1 与 CMS 取舍。
商品详情接口每隔几十次就慢 3 秒,日志里什么都没有。用 Arthas 的 dashboard、thread、trace、watch、stack 逐层下钻到一个连不上的备用节点,再用 jad、redefine 临时止血,最后用 profiler 火焰图复核。
读写分离上线后,用户“下单成功却看不到订单”。用 SHOW REPLICA STATUS 看 Seconds_Behind_Source,定位到大事务与单线程回放,再讲并行复制、Canal 延迟排查,以及“读自己写的”几种落地方案。
接口大面积报 Connection is not available, request timed out after 30000ms。用 Hikari 日志、show processlist 与 jstack 交叉验证,找出事务里调远程接口占着连接的元凶,并讲清 maximumPoolSize 的公式、leakDetectionThreshold 与指标告警。
Redis 没宕机、CPU 也不高,却隔几分钟整体卡顿,别的业务跟着超时。用 SLOWLOG、latency doctor、--bigkeys / --memkeys、MEMORY USAGE 揪出一个大 Hash 和一条 HGETALL,附 UNLINK、SCAN、拆 key 的完整修法。
用户投诉验证码半小时没到,RocketMQ 短信 Topic 堆积 300 万。用 mqadmin consumerProgress / consumerConnection / topicStatus 判断是消费慢还是消费者掉线,定位到线程卡在下游接口与失败无限重试,并给出扩容、批量消费、死信与跳过历史消息的处置。
管理界面里 Unacked 涨到 12 万,内存水位告警、生产者连接被 blocked。用 rabbitmqctl list_queues / list_channels / list_connections 定位忘记 ack 的消费者,讲清 prefetch、内存与磁盘水位流控、死信与 TTL,并给出止血与根治配置。
监控里 load 飙到几十,top 里 CPU 却几乎空闲。原来 Linux 的 load 也统计 D 状态进程。用 vmstat、iostat -x、pidstat -d、iotop 和 ps 找出是磁盘慢还是 NFS 卡死,并讲清 await 与 %util 怎么读。
某天早上全站弹“连接不是私密连接”,根因是 HTTPS 证书过期。用 openssl s_client 和 curl -v 看证书有效期与证书链,梳理 certbot/acme.sh 自动续期失败的常见原因,并给出提前 30 天告警的检查脚本。