线上故障,你慌不慌?
凌晨 2 点,手机告警狂响——订单接口超时率飙升,3000 用户受影响。你只有 5 分钟止血,15 分钟定位根因。
问题解决能力不是天赋,而是一套可训练的方法论。本文整理了从问题发现到复盘总结的完整框架。
六步标准流程
发现异常 → 定义问题 → 定位根因 → 实施修复 → 验证修复 → 总结改进
问题分类
| 类型 |
策略 |
| 线上故障 |
先止血再排查 |
| 性能问题 |
基准测试对比 |
| 功能 Bug |
复现 → 定位 → 修复 |
| 环境问题 |
对比环境差异 |
| 依赖故障 |
排除法确认 |
5W1H 分析法
| 维度 |
问题 |
| What |
什么问题?现象是什么? |
| When |
什么时候发生? |
| Where |
哪里发生?哪个服务? |
| Who |
影响了谁? |
| Why |
为什么发生?根因? |
| How |
怎么解决?怎么防止再发? |
线上故障排查 SOP
1 分钟:快速评估
├── 确认影响范围(用户数/功能)
├── 确认严重等级 (P0/P1/P2/P3)
└── 通知相关人员
5 分钟:止血
├── 是否需要回滚?
├── 是否需要限流/降级?
└── 是否需要扩容?
15 分钟:定位根因
├── 检查最近变更(部署/配置)
├── 检查基础设施(网络/DB/缓存)
├── 检查应用日志和监控
└── 检查依赖服务状态
30 分钟:修复验证
├── 实施修复方案
├── 验证功能恢复
└── 持续观察
事后:复盘总结
├── 编写故障报告
├── 分析根因和改进措施
└── 完善监控告警
常见故障模式速查
| 故障现象 |
常见原因 |
排查方法 |
| 接口超时 |
慢SQL / 下游超时 |
日志 trace / 慢查询 |
| OOM |
内存泄漏 / 堆不够 |
jmap / heap dump |
| CPU 100% |
死循环 / GC 频繁 |
top / arthas thread |
| 连接池满 |
慢查询 / 连接泄漏 |
show processlist |
| 502/503 |
后端不可用 / 超载 |
nginx 日志 |
调试技巧
日志调试
# 结构化日志最佳实践
class StructuredLogger:
def info(self, message, **kwargs):
record = {
"message": message,
"trace_id": kwargs.pop("trace_id", str(uuid.uuid4())[:8]),
**kwargs
}
self.logger.log(logging.INFO, json.dumps(record))
# 使用
log.info("Order created", order_id="ORD-001", amount=99.99)
log.error("Payment failed", order_id="ORD-001", error="timeout", retry=3)
远程调试
# Java
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar app.jar
# Python
python -m debugpy --listen 0.0.0.0:5678 app.py
# Node.js
node --inspect=0.0.0.0:9229 app.js
性能分析工具
| 工具 |
语言 |
用途 |
| Arthas |
Java |
方法耗时/参数,热更新诊断 |
| pprof |
Go |
CPU/内存分析 |
| py-spy |
Python |
采样分析 |
| async-profiler |
Java |
火焰图,无侵入 |
数据库问题排查
# MySQL 慢查询
SHOW FULL PROCESSLIST;
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
EXPLAIN SELECT * FROM orders WHERE user_id = 'U-100';
# 锁等待
SHOW ENGINE INNODB STATUS;
网络问题排查
# 连通性
nc -zv target-host 6379
# DNS
nslookup api.example.com
# 抓包
tcpdump -i eth0 -nn port 8080 -w capture.pcap
5-Why 根因分析
问题:订单接口超时
Why 1: 为什么超时?→ 数据库查询慢
Why 2: 为什么查询慢?→ 全表扫描,没有索引
Why 3: 为什么没有索引?→ 新上线的 SQL 没建索引
Why 4: 为什么没建索引?→ Code Review 没有检查 SQL
Why 5: 为什么没检查? → 没有 SQL 审查流程和工具
根因:缺少 SQL 性能审查机制
改进:建立审查规范 + 引入自动化工具
预防性实践
| 措施 |
说明 |
| Code Review |
所有代码至少 1 人审查 |
| 自动化测试 |
覆盖率 ≥ 80% |
| CI/CD |
减少人为错误 |
| 监控告警 |
问题早发现 |
| 压力测试 |
上线前评估容量 |
| 灰度发布 |
逐步放量降低影响 |
总结
问题解决的核心不是技术,而是方法论。六步流程 + 5W1H + 5-Why 三板斧,让你在面对任何线上故障时都不慌。记住:先止血、再定位、最后复盘。每次故障都是成长的燃料。