程序员如何做「故障排查」:不是玄学,是方法论
系统出问题了,怎么快速定位原因?
很多程序员靠"经验"和"直觉",但其实故障排查是有方法论的。
一、故障排查的步骤
1. 确认问题
- 用户反映什么问题
- 影响范围多大
- 什么时候开始的
2. 收集信息
- 查看监控和告警
- 查看日志
- 查看最近变更
3. 定位原因
- 是哪个服务的问题
- 是什么导致的
- 时间线是什么
4. 止血
- 先恢复服务
- 不要纠结根因,先止损
5. 复盘
- 问题是怎么发生的
- 以后怎么避免
二、常见的故障原因
1. 资源问题
- CPU 跑满
- 内存泄漏
- 磁盘满了
- 网络问题
2. 应用问题
- 代码 bug
- 配置错误
- 依赖服务挂了
3. 外部问题
- 第三方服务不可用
- 网络不可达
- DNS 问题
三、故障排查的工具
1. 日志
- grep / awk / sed
- ELK / Loki
- Sentry(异常日志)
2. 监控
- Grafana
- Prometheus
- APM(SkyWalking / Pinpoint)
3. 网络
- ping / telnet / curl
- tcpdump / wireshark
- traceroute
4. 系统
- top / htop(CPU/内存)
- netstat(网络连接)
- df / du(磁盘)
四、快速定位的技巧
1. 排除法
从基础设施到应用,从外到内,一层层排除。
2. 对比法
和正常情况对比——哪里不一样?
3. 回溯法
从问题发生的时间点往前推——最近做了什么变更?
4. 隔离法
关掉部分功能,确认是哪个模块的问题。
五、故障复盘的模板
1. 问题概述
什么问题?影响范围?
2. 时间线
- 什么时候发现的
- 什么时候恢复的
- 总共影响了多久
3. 根因分析
问题是怎么发生的?真的是什么?
4. 改进措施
- 短期:怎么止血
- 长期:怎么避免再次发生
六、一句话总结
故障排查 = 确认问题 + 收集信息 + 定位原因 + 止血 + 复盘。