测试高并发长连接下Nginx平滑重载是否平稳,关键是在真实长连接洪流中验证已有连接持续收发、新请求零丢失、后端无重试;需用wrk -k压测、在流量洪峰第90秒执行reload、抓包查RST/FIN、验证worker切换与socket释放。

测试高并发长连接下的 Nginx 平滑重载是否真正平稳,关键不是看 reload 命令快不快,而是看已有连接是否持续收发、新请求是否零丢失、后端是否无重试——这三件事必须在真实长连接洪流中验证。
一、压测环境必须模拟真实长连接行为
短连接压测完全无效,因为 reload 对短连接影响极小。必须让客户端复用 TCP 连接:
- 用 wrk -t8 -c2000 -d300s -k http://ip/test.html(-k 启用 keep-alive)
- 后端返回小静态文件(如 1KB HTML),关闭 access_log、gzip 和 sendfile 干扰
- 确保 Nginx 配置含 keepalive_timeout 60s; 和 keepalive_requests 1000;,避免连接被 timeout 强制关闭
- 客户端请求头必须带 Connection: keep-alive(wrk 默认满足,curl 需显式加 -H "Connection: keep-alive")
二、reload 必须插在流量洪峰里执行
不能 reload 后再开压,也不能等压测结束才操作。要制造“边扛压、边换配置”的对抗场景:
- 启动 wrk 持续压测(建议 QPS ≥1.5 万,接近线上峰值 70%)
- 在压测运行到第 90 秒时,执行 time nginx -s reload,记录是否稳定在毫秒级(通常
- 连续做 5–10 次 reload(间隔 30–60 秒),观察是否出现累积性退化
三、核心指标必须实时盯住
仅看日志或进程 PID 不够,要结合多维度信号交叉判断:
- 连接连续性:用 ss -s 或访问 /nginx_status,确认 Active connections 是否无断崖式下跌(允许小幅波动,但不能归零或骤降 >30%)
- 请求成功率:wrk 输出中的 Non-2xx or 3xx responses 是否为 0;同时检查 error.log 有无 connect() failed (111: Connection refused) 或 upstream prematurely closed connection
- 连接行为合规性:用 tcpdump -i any port 80 -w reload.pcap 抓包,在 reload 瞬间检查已建立连接是否发出 RST/FIN —— 正常应只有数据包,无异常中断信号
- worker 切换干净度:reload 前后执行 ps aux | grep nginx | grep 'worker',确认旧 worker PID 是否在 worker_shutdown_timeout(建议设为 10s)内退出;用 lsof -p [old_pid] | grep sock 验证旧进程是否还持有 socket
四、常见卡点与快速定位方法
一旦发现丢请求或连接中断,按顺序排查:
- 文件描述符不足:检查 cat /proc/$(pgrep nginx)/limits | grep "Max open files",确保 worker_rlimit_nofile ≥ worker_connections(建议统一设为 65535)
- 旧 worker 拖尾过长:若旧进程超 15 秒不退出,重点查 upstream 设置 —— proxy_read_timeout 过长、proxy_ignore_client_abort off 未设,或后端响应慢导致连接无法释放
- 内核连接队列溢出:执行 netstat -s | grep -i "listen overflows",若数值增长,说明 net.core.somaxconn 或 Nginx 的 listen ... backlog= 设置太小











