nginx代理缓冲区吞吐极限测试需构造带宽错配环境:后端快而客户端慢(如用tc限速至10mbps)才能暴露proxy_buffering的真实行为,因其表现取决于后端响应速度、客户端接收能力与链路带宽的动态博弈。

测试 Nginx 代理缓冲区在不同网络带宽下的吞吐极限,核心不是调大 buffer 参数就完事,而是要让缓冲行为真实暴露在带宽受限、收发不对等、流控变化的链路中——因为 proxy_buffering 的实际表现,高度依赖后端响应速度、客户端接收能力与中间链路带宽三者的动态博弈。
明确缓冲区参与的关键路径
Nginx 的代理缓冲(由 proxy_buffering on 控制)只在以下场景生效:
- 后端返回响应体(body)时,Nginx 将其暂存在内存/临时文件中,再分块发给客户端;
- 客户端接收慢(如低带宽、高延迟、小窗口)、而上游响应快(如本地 fastcgi 或短距后端),缓冲区才会积压、触发写磁盘或阻塞 upstream;
- 若客户端带宽充足、TCP 窗口大、RTT 低,缓冲区往往“一闪而过”,测不出压力。
构造可控带宽差异的测试环境
必须人为制造“后端快 → 客户端慢”或“客户端快 → 后端慢”的错配,才能压出缓冲区行为:
- 用
tc在客户端或 Nginx 主机上限速:例如tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms模拟 10Mbps 下行瓶颈; - 后端服务部署在局域网内(如 127.0.0.1 或同交换机),确保响应延迟
- 避免使用
127.0.0.1回环压测客户端,它绕过 TCP 栈限速逻辑;改用另一台物理机或容器,并在其网卡上施加限速。
观测缓冲区是否成为瓶颈的指标
运行压测时,重点盯这些信号,而非单纯看 QPS:
-
proxy_buffer_size和proxy_buffers是否频繁写临时文件?查error_log中是否有upstream sent too big header或could not be buffered; - Nginx worker 进程 RSS 内存是否随并发线性上涨?超过
proxy_buffers × buffer_size总和,说明缓冲区溢出到磁盘或触发紧急分配; - 用
ss -i查连接的rcv_wnd(接收窗口)和retrans(重传):若客户端窗口持续 - 对比开启/关闭
proxy_buffering时的 P95 延迟:开启后延迟明显升高(尤其在低带宽下),即缓冲区正在排队等待慢客户端。
推荐压测组合与验证命令
不追求最大数字,而要看到缓冲行为拐点:
- 用
wrk -t4 -c200 -d60s --latency http://nginx-ip/large-file-10m(服务一个 10MB 静态响应或模拟后端快速吐 10MB); - 同时在客户端侧运行:
while sleep 1; do echo "$(date +%T) $(awk '/^MemFree:/ {print $2}' /proc/meminfo) KiB"; done观察系统内存压力; - 在 Nginx 侧开启
error_log /var/log/nginx/buffer_test.log info;,并设置proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 8 64k;; - 逐步将客户端带宽从 100Mbps 降至 5Mbps,记录每档下:P95 延迟跳变点、error.log 中 buffer 相关 warn 行数、
cat /proc/net/nf_conntrack | grep :80 | wc -l(确认连接未卡死)。
不复杂但容易忽略。











