要测试nginx轮询在不同并发量下的均匀度,需分三层验证:低并发(-c 1)验证配置纯净性,中并发(-c 10~50)测真实负载偏差(≤±3%),高并发(-c 100+)看全局标准差;全程禁用weight/ip_hash/keepalive,统一健康检查,并通过nginx与后端双日志交叉统计频次。

要测试 Nginx 轮询在不同并发量下的均匀度,不能只看“是否轮着走”,关键得区分并发行为对轮询序列的真实影响——高并发会放大 worker 进程独立计数、连接复用、健康检查等隐性因素,导致短期分布失真。真正有效的测试,是分层控制变量、按并发档位采集日志、再做频次归因分析。
明确三类并发场景对应的不同验证逻辑
轮询本身不感知并发,但 Nginx 的请求分发机制在不同并发下表现不同:
- 低并发(-c 1):单连接串行请求,最贴近理论轮询顺序,适合验证基础配置是否干净(无 weight/ip_hash/keepalive 干扰)
- 中并发(-c 10~50):多个 client 同时发起短连接,反映真实轻负载场景,此时需关注各后端 access.log 总请求数的相对偏差(目标 ≤±3%)
- 高并发(-c 100+):worker 进程竞争明显,单个 worker 可能连续调度同一后端;此时应统计所有 worker 共同服务的全局分布,而非单次响应顺序
每档并发都必须统一控制干扰项
否则数据不可比。每次换并发参数前,务必确认以下配置已重置:
- upstream 中所有 server 行不含 weight、backup、down、max_fails 等修饰;只保留 IP:port 格式
- 彻底删除 ip_hash、hash $arg_id、least_conn 等指令(注释也不行)
- 在 upstream 块中显式设置 keepalive 0,禁用连接池,避免复用干扰
- 所有后端 server 使用一致的健康检查参数,例如统一加 max_fails=2 fail_timeout=15s
用日志+脚本做跨并发档位对比分析
别依赖 ab 或 wrk 的终端输出,直接从 Nginx 和后端双端日志提取原始分配证据:
- 在 Nginx 的 http 块中定义带后端标识的日志格式:
log_format rr_log '$remote_addr - $upstream_addr [$time_local] "$request" $status $upstream_response_time';
并在 location 中启用:
access_log /var/log/nginx/rr_test.log rr_log; - 每台后端服务返回唯一标识头,例如 X-Server-ID: node-01,便于 curl 批量采集
- 对每个并发档位(如 -c 1/-c 10/-c 50/-c 200),分别执行:
ab -n 1000 -c X http://nginx-ip/
完成后立即收集:
awk '{print $4}' /var/log/nginx/rr_test.log | sed 's/[,;]//g' | sort | uniq -c | sort -n - 同时在后端服务器上统计各自 access.log 行数,交叉验证一致性
判断均匀度是否合格的实用标准
不是看“绝对相等”,而是结合并发档位看偏差是否在合理区间:
- -c 1 场景:1000 次请求,3 台后端理想值为 333/333/334;允许单台浮动 ±5 次(即 328~338),超出需查配置是否残留 weight
- -c 10~50 场景:允许总请求数偏差 ≤±3%,例如 1000 次中某台为 360 次(+6.7%),就要检查该后端是否因超时被临时摘除
- -c 100+ 场景:重点看标准差(stddev)。3 台计数若为 [310, 345, 345],标准差 ≈15,属正常;若为 [220, 390, 390],标准差 ≈85,说明有节点被持续规避,应查 max_fails 是否触发或网络抖动











