首页/网络/网络排障速查/故障复现与最小化
排查流程与方法36 条

故障复现与最小化

能稳定复现的故障才有资格谈根因:把触发条件、路径、参数最小化到「一条命令触发」,再去掉无关变量,复现步骤本身就是排障地图。

网络排障速查网络更新于 2026-10-13

复现是排障的地图

能稳定复现的故障才有资格谈根因。复现的价值不在「重现一次」,而在把触发条件固定下来:什么源、什么目标、什么协议与参数、多长时间出现一次。条件一旦可重放,就可以做对照实验——改一个变量看现象是否变化,这是把猜测变成结论的唯一路径。复杂度要往下压,直到剩下一条可复制的命令。

基本信息

必须记录的要素时间、源、目标、协议端口、参数、频率与影响面
目标让故障在几分钟内可重放,而非「偶尔出现」
产物一条可复制的最小复现命令,附失败率统计
原则一次只改一个变量,改前留基线
不可复现时长时低干扰监测 + 分卷抓包 + 日志留档,等待复现

典型使用场景

  • 用户报「偶尔打不开」:先用循环请求把偶发变成可测量的失败率
  • 修改疑似相关配置后验证:同一复现命令前后对比成功率
  • 与厂商或云平台交涉:给出对方能照做的复现步骤,比描述现象有效
  • 跨环境差异分析:同一命令在正常环境与异常环境各跑一遍
  • 为复盘与回归测试留素材:复现脚本本身就是验证用例

复现记录与循环触发(Linux)

复现记录与循环触发(Linux)
for i in $(seq 1 20); do   # 20 次连续触发,统计失败率
  curl -s -o /dev/null -w "%{http_code} %{time_total}\n" --connect-timeout 5 https://<目标>/
  sleep 0.5
done
# 分离阶段耗时,区分 DNS、建连、首字节:
for i in $(seq 1 10); do
  curl -s -o /dev/null -w 'dns=%{time_namelookup} conn=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} code=%{http_code}\n' https://<目标>/
done
# 复现同时抓包留证(分卷防止写满磁盘):
tcpdump -i eth0 -nn -s 0 -C 50 -W 10 -w /tmp/repro.pcap 'host <目标IP> and tcp port 443'

复现记录要素

字段写什么为什么
触发动作完整命令与参数,不用「访问页面」这类描述别人要能照着做一遍
失败率20 次中失败几次、失败时的耗时分布区分偶发与必现,量化改善
环境系统版本、客户端与目标地址、是否经代理换环境不复现时能解释原因
时间窗精确到秒的开始与结束,附抓包文件名事后与日志、抓包对齐
无法复现时退一步:用监控与长时日志「等待复现」,同时挂上低频抓包(-C 分卷限制总量)长期取证,别在生产上高频重试。
复现要控制影响面:优先在单台客户端、单个实例上做;高频循环请求本身可能触发限流或重试风暴,把偶发故障放大成事故。

易错点

  • 在生产直接高频复现,重试风暴把小故障放大成容量事故
  • 复现成功但没记「环境 + 版本 + 参数」,换环境后无法解释
  • 只复现现象不记录失败率,改完配置无法判断是否真的好转
  • 多个变量一起改,现象消失也说不清是哪个起了作用
  • 只写「访问某页面失败」这类描述,交接后别人无法重放

数据来源与参考

  • SRE 实践:可复现性是根因分析的前提
  • curl 手册:-w 输出格式变量

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌