直接分析$upstream_response_time分布并按$upstream_addr分组统计p95、p99及超时占比,可定位异常节点;需确保日志中二者严格一一对应,结合$upstream_status、$request_uri等交叉验证,并观察重试模式确认顽固故障。

直接看 $upstream_response_time 的分布,再按 $upstream_addr 拆开对比,就能快速揪出拖慢整体响应的那台异常节点——它就是集群里的“害群之马”。
先确保日志里有真实、可对齐的时间和地址
必须同时记录 $upstream_response_time 和 $upstream_addr,且二者严格一一对应。Nginx 会把一次请求中所有重试的耗时与目标地址并列输出,例如:
10.0.2.8:8080 0.012, 10.0.2.9:8080 0.845, 10.0.2.8:8080 3.210-
10.0.2.7:8080 -(表示连接失败)
如果只记时间不记地址,或地址字段被截断、格式混乱,就完全无法归因到具体机器。
用分组统计暴露离群节点
别算平均值,要按 IP 分组统计 P95、P99 和超 1s 请求占比:
- 用 awk 或日志分析工具提取每条记录中的
$upstream_addr和$upstream_response_time(跳过“-”) - 对每个 IP 统计:总请求数、超 500ms 数、超 1s 数、P95 值
- 排序后发现某台(如
10.0.2.5:8080)P95 是 1.8s,其余都在 120ms 内 → 它就是嫌疑最大者
交叉验证确认是否真有问题
单看延迟高还不够,要叠加其他维度排除干扰:
- 查 $upstream_status:如果该节点 502/504 高发,可能是进程挂了或健康检查没生效
- 看 $request_uri:是否集中在某个接口(如
/api/v2/report)?说明是业务逻辑问题,不是整机故障 - 比 $upstream_connect_time 和 $upstream_header_time:若建连耗时长,可能是网络或防火墙问题;若 header_time 长但 connect_time 短,大概率是后端处理卡在首字节生成
观察重试行为锁定顽固故障
害群之马常表现为“反复失败+重试拉长整体耗时”:
- 日志中出现大量类似
10.0.2.4:8080 -, 10.0.2.6:8080 0.021的模式 → 第一次总是打到坏节点,失败后才切到好节点 - 这种节点即使只占集群 1/8,也可能贡献 30% 的超时请求,因为它把每次失败都“传染”给了重试链路
- 此时应检查 upstream 配置中的
max_fails和fail_timeout是否合理,避免坏节点长期滞留











