1. 引言:为什么需要一间「IT 疑难杂症诊疗室」
- 技术人每天都在「接诊」:线上告警、系统卡顿、数据不一致、诡异的内存泄漏......
- 常见痛点:问题复现难、定位耗时、修完又复发、缺乏系统化排查方法
- 本文目标:建立一套可复用的「诊断---定位---修复---复盘」方法论,并配以真实案例拆解
2. 诊疗室的第一课:建立正确的排查心态
- 先止血,再根治:区分「应急恢复」与「根因修复」
- 拒绝玄学:一切故障都有迹可循,避免「重启大法」式侥幸
- 证据链思维:日志、监控、链路追踪是诊断的三驾马车
- 时间线还原:从「首次异常」到「故障爆发」的完整时间轴
3. 诊断工具箱:必备的排查武器
- 系统层:CPU、内存、磁盘、网络(top、vmstat、iostat、sar)
- 应用层:日志分析、线程转储(jstack)、堆转储(jmap/jhat)
- 数据库层:慢查询日志、执行计划、锁等待分析
- 网络层:抓包(tcpdump)、DNS 解析、连接池状态
- 链路追踪:SkyWalking、Zipkin、OpenTelemetry 的选型与落地
4. 常见疑难杂症案例拆解(核心章节)
4.1 案例一:线上服务频繁 Full GC,接口响应飙升
- 症状描述与初步排查
- 通过堆转储定位大对象与内存泄漏点
- 根因分析与修复方案
- 事后优化:GC 参数调优与容量规划
4.2 案例二:数据库连接池被打满,应用假死
- 症状:连接获取超时、线程阻塞
- 排查:连接池监控、慢 SQL、长事务定位
- 根因:未释放连接 / 慢 SQL 拖垮连接池
- 修复与预防:连接池参数优化、SQL 治理
4.3 案例三:诡异的数据不一致,时好时坏
- 症状:偶发数据错乱,难以复现
- 排查:并发场景分析、缓存与数据库一致性
- 根因:缓存穿透 / 并发写覆盖 / 分布式锁失效
- 修复:引入版本号、分布式锁与最终一致性方案
4.4 案例四:接口偶发超时,但日志无异常
- 症状:偶发超时,应用日志一切正常
- 排查:网络抓包、GC 停顿、CPU 抖动分析
- 根因:网络抖动 / 频繁 Full GC 导致 STW
- 修复:超时重试策略、GC 优化、网络链路冗余
5. 从「救火」到「防火」:建立故障预防体系
- 监控告警:黄金指标(延迟、流量、错误、饱和度)
- 容量规划:压测与水位管理
- 代码质量:Code Review 与静态扫描
- 混沌工程:主动注入故障,提前暴露隐患
6. 复盘方法论:让每一次故障都成为资产
- 故障复盘的正确姿势:对事不对人
- 时间线复盘法:还原每个决策点
- 输出行动项:短期修复 + 长期改进
- 建立知识库:把个案沉淀为团队的排查手册
7. 结语:人人都是 IT 急诊医生
- 总结核心方法论
- 鼓励读者建立自己的「诊疗笔记」
- 附:常用排查命令速查表(可作为附录)
附录:常用排查命令速查表
CPU
| 命令 | 常用参数 | 用途 |
|---|---|---|
top |
-H -p <pid> |
实时查看进程 CPU 占用,-H 按线程维度展示,定位高 CPU 线程 |
uptime |
无 | 查看系统负载(1/5/15 分钟),判断是否过载 |
mpstat |
-P ALL 1 |
查看每个 CPU 核心的使用率与空闲率 |
pidstat |
-p <pid> 1 |
按进程/线程统计 CPU 使用率,观察波动趋势 |
perf |
top / record |
采样热点函数,定位 CPU 消耗在哪个方法/内核路径 |
内存
| 命令 | 常用参数 | 用途 |
|---|---|---|
free |
-h |
查看物理内存与 Swap 使用情况,判断是否内存不足 |
vmstat |
1 5 |
查看内存、Swap、IO 与 CPU 的综合状态,定位内存抖动 |
top |
-o %MEM |
按内存占用排序,找出内存大户进程 |
ps |
aux --sort=-%mem |
列出进程内存占用排行,快速定位异常进程 |
/proc/meminfo |
无 | 查看内核内存细粒度统计(如 Slab、PageCache) |
磁盘
| 命令 | 常用参数 | 用途 |
|---|---|---|
df |
-h |
查看文件系统容量与使用率,判断磁盘是否写满 |
iostat |
-x 1 |
查看磁盘 IOPS、吞吐与利用率,定位 IO 瓶颈 |
iotop |
无 | 实时查看各进程的磁盘读写速率 |
du |
-sh * |
统计目录占用空间,定位大文件/大目录 |
lsof |
+L1 |
查看已删除但仍被进程占用的文件(磁盘空间不释放的常见原因) |
网络
| 命令 | 常用参数 | 用途 |
|---|---|---|
netstat |
-anp |
查看端口监听、连接状态与对应进程,定位连接堆积 |
ss |
-s / -tn |
更高效的 socket 统计,查看 TCP 连接状态分布 |
tcpdump |
-i eth0 -nn port 8080 |
抓包分析网络报文,定位丢包、重传与延迟 |
ping |
-c 10 |
检测网络连通性与 RTT,判断基础链路是否正常 |
sar |
-n DEV 1 |
查看网卡吞吐与错误包统计,定位网络抖动 |
JVM
| 命令 | 常用参数 | 用途 |
|---|---|---|
jps |
-l |
列出本机 Java 进程及主类,确认目标 PID |
jstack |
<pid> |
导出线程转储,定位死锁、线程阻塞与高 CPU 线程栈 |
jmap |
-heap <pid> / -dump:format=b,file=heap.hprof <pid> |
查看堆配置或导出堆转储,分析内存泄漏 |
jstat |
-gcutil <pid> 1000 |
实时查看 GC 次数与耗时,判断 GC 是否频繁 |
jcmd |
<pid> GC.heap_info |
综合诊断命令,查看堆信息、线程与系统属性 |
数据库
| 命令 | 常用参数 | 用途 |
|---|---|---|
SHOW PROCESSLIST |
无 | 查看当前所有连接与正在执行的 SQL,定位慢查询与长事务 |
EXPLAIN |
ANALYZE |
查看 SQL 执行计划,分析是否走索引、扫描行数 |
SHOW ENGINE INNODB STATUS |
无 | 查看 InnoDB 锁等待、事务与死锁信息 |
SHOW VARIABLES |
LIKE '%timeout%' |
查看连接、锁等超时参数配置 |
SHOW STATUS |
LIKE 'Threads%' |
查看连接数、线程池等运行状态指标 |