加权轮询动态平滑调整的关键是验证请求序列分布与节点恢复/权重变更后的渐进流量承载。需通过固定权重统计、健康检查触发effectiveWeight变化、避免reload的热更新测试及灰度对照四方面验证,重点观察变化过程而非静态结果。

直接测试加权轮询的权重动态平滑调整,关键不在“看配置写了多少”,而在于验证请求分发序列是否符合平滑预期,以及节点恢复或权重变更后流量是否渐进承载。Nginx 默认的 weighted round-robin 不保证单次请求序列平滑(比如权重 5:1 可能连续打 5 次到高权节点),但结合健康检查机制,可让 effectiveWeight 自动升降,实现事实上的平滑过渡。测试要围绕这两个层面展开。
一、验证请求序列是否接近平滑分布
用固定权重配置启动后,不依赖日志人工数,而是批量发送请求并统计实际分发结果:
- 准备一个轻量健康接口(如
/health),所有后端都返回 200,响应极快,排除延迟干扰 - 用脚本循环发起 N 次请求(N ≥ 总权重和的 3–5 倍),例如权重为
server A weight=4; B weight=2; C weight=1,总权重=7,建议发 35–70 次 - 记录每次请求落到哪个 upstream server(可通过 access_log 中
$upstream_addr字段提取) - 统计各节点实际请求数,再观察请求时间戳序列:是否出现明显集中爆发(如连续 4 次 A),还是穿插分布(如 A,B,A,C,A,B,A…)
注意:纯开源 Nginx 无法做到理论级 SWRR 序列(如严格按 GCD 调度周期),但若多次测试中 A 的占比稳定在 ~57%(4/7)、B 在 ~29%(2/7)、C 在 ~14%(1/7),且无单节点长时间空闲或持续过载,则视为权重生效、长期比例可控。
二、模拟节点故障与恢复,验证 effectiveWeight 平滑回升
这才是真正检验“动态平滑”的核心场景:
- 给每个 server 配置健康检查:如
max_fails=2 fail_timeout=5s - 手动停掉某节点(如 B),持续发请求约 10 秒,确保它被标记为不可用(
effectiveWeight逐步降到 0) - 重启该节点,立即开始发请求(不 reload 配置!)
- 盯住 access_log 和自定义计数(如用
log_format记录$upstream_addr和响应状态),观察接下来 30–60 秒内 B 接收的请求数变化趋势
预期行为:B 刚恢复时请求极少(可能前 5 秒只分到 1–2 次),随后缓慢增加(如第 10 秒起每 5 秒多 1–2 次),1–2 分钟后趋于稳定在其权重占比。这说明 effectiveWeight 正在随成功响应自动回升,而非“一上线就满负荷”。若一恢复就立刻承接大量请求,说明健康检查未生效或配置有误。
三、验证权重热更新后的流量迁移节奏
修改 weight 后 reload 是常见操作,但 reload 会重置所有 effectiveWeight,失去平滑性。要测“动态调整”,应避免 reload:
- 先用
max_fails/fail_timeout配置好被动检查,确保effectiveWeight机制就绪 - 不改配置,而是临时让某个节点响应变慢或偶发超时(如用
sleep 2模拟延迟),触发其effectiveWeight下降 - 再让它恢复正常,观察请求占比是否随
effectiveWeight回升而自然增长 - 对比:同一节点,手动加
down标记后,它完全不出现在调度中;而仅靠健康检查衰减,它仍有机会被低概率选中——这种“带伤上岗”的渐进过程,才是平滑的关键特征
四、辅助验证:用 map + 请求头做灰度对照组
如果已配置了基于 header 的灰度路由(如 map $http_x_test_user $route_to_green { "true" 1; }),可同步发起两类请求:
- 普通请求:走加权轮询,观察整体分布
- 带
X-Test-User: true的请求:强制打到新节点,确认它确实可用、延迟正常
这样既能验证权重分流逻辑未被 map 干扰,又能确保绿版在小流量下真实可用——为后续全量切流提供双重信心。
不复杂但容易忽略:平滑不是靠一次配置达成的,而是健康检查、有效权重机制、不干预调度状态三者共同作用的结果。测试时少 reload,多观察,重点看“变化过程”而非“静态结果”。


















