测试Nginx高频推送代理极限表现,须聚焦长连接生命周期、内存增长趋势、系统资源触顶及连接拦截真实性;核心是用hey/vegeta/ws等工具模拟真实流式流量,交叉监控rss、Active connections、error日志与ss状态,关闭proxy_buffering和access_log,排查缓冲区、文件描述符、SSL缓存等内存泄漏点。

要测试 Nginx 作为高频数据推送代理(如 SSE、WebSocket 长连接或轮询接口)在极限压力下的表现与内存占用,不能只看请求吞吐,必须聚焦“连接生命周期长、单连接持续发包、资源不及时释放”这一类典型场景。核心是验证:连接是否被正确复用或断开、内存是否随连接数线性/非线性增长、系统级资源是否触顶、Nginx 是否真正拦截超额连接而非仅返回错误。
一、明确测试目标和关键指标
高频推送场景下,重点不是 QPS,而是:
- 稳定维持的并发连接数:比如能否长期保持 5000 个长连接不崩溃;
-
内存 RSS 增长趋势:用
ps aux --sort=-%mem | grep nginx或pmap -x $(pgrep nginx)观察 worker 进程内存是否随连接数缓慢爬升或突增; -
活跃连接状态分布:通过
/nginx_status看Active connections及其子项Reading / Writing / Waiting—— 推送服务中大量应处于Writing(发数据)或Waiting(Keep-Alive 等待); -
连接泄漏迹象:
ss -s中tcp:行的orphan数持续上升,或ESTABLISHED连接数远超预期且不回落,说明连接未正常关闭。
二、构造贴近真实的压测流量
避免用短连接工具(如默认 hey -c 1000)误判。需模拟真实推送客户端行为:
- 用
hey -c 200 -n 1000 -disable-keepalive http://x/api/stream测试短连接轮询,但仅作基线对比; - 对 SSE 或长轮询,推荐用专用工具如 hey 加
-H "Accept: text/event-stream",或更合适的 vegeta 编写自定义脚本,维持连接并定时触发事件; - 若测试 WebSocket 代理,用 ws 或 Python 的
websockets库批量建连,每连接持续发送心跳+数据帧; - 所有压测中,务必加
proxy_buffering off;和proxy_http_version 1.1;+proxy_set_header Connection '';,防止 Nginx 缓存响应阻塞流式推送。
三、监控内存与连接状态的组合方式
单看一个指标易误导,必须交叉比对:
- 启动压测前,记录 baseline:
ps -o pid,vsz,rss,comm $(pgrep nginx)、ss -s | grep tcp:、curl http://127.0.0.1/nginx_status; - 压测中每 30 秒采样一次:
→ 内存:关注rss(实际物理内存),不是vsz(虚拟内存);
→ 连接:Active connections应接近你设定的并发数,Waiting占比高属正常;
→ 错误:tail -f /var/log/nginx/error.log | grep -E "(limit|close|reset|worker)",出现大量upstream prematurely closed connection或recv() failed (104: Connection reset by peer)表示后端异常断连; - 压测后观察内存是否回落:若
rss居高不下且ss -i显示大量timer:(keepalive,...,说明连接未释放或内核 keepalive 参数过长。
四、排查内存异常的常见落点
高频推送下内存飙高,常因配置或系统层疏漏:
-
缓冲区未关闭:确认
proxy_buffering off;已在对应location块中生效,否则每个长连接会独占 buffer(默认 4k × 8 = 32KB); -
日志过度写入:高频推送会产生海量 access log 行,禁用该 location 的日志:
access_log off;; -
文件描述符耗尽:检查
worker_rlimit_nofile和系统级限制(cat /proc/$(pgrep nginx)/limits | grep "Max open files"),不足时会导致新建连接失败、内存碎片化; -
SSL 会话缓存过大:若启用 HTTPS,
ssl_session_cache shared:SSL:10m;中的10m在万级连接下可能不够,可调至50m并配ssl_session_timeout 1m;; -
第三方模块干扰:如启用了
ngx_http_perl_module或某些 Lua 脚本,长连接期间变量未清理,易引发内存泄漏——压测前后用gdb -p $(pgrep nginx) -ex "info proc mappings" -ex "quit"初步定位异常内存段。


















