postpone_output 是 Nginx 在 TCP 层实现的“攒包”优化机制,通过缓存输出直至达指定字节数(默认1460)再合并发送,降低系统调用与网络碎片,需配合 output_buffers 和 sendfile 使用,对非零拷贝场景效果显著。

postpone_output 是 Nginx 在 TCP 层做的一层“攒包”优化,核心目标是减少小报文频繁发送带来的系统调用开销和网络碎片,尤其对静态文件(如 CSS、JS、图片)的传输效果明显。
它不改变业务逻辑,也不依赖应用层配合,而是由 Nginx 主动控制内核发送时机,让多个小响应块合并成一个更接近 MSS(通常 1460 字节)的 TCP 报文再发出,从而降低 send() 系统调用次数和 ACK 往返压力。
以下是你实际配置和使用的要点:
默认值已合理
postpone_output 1460;是默认设置,对应典型以太网 MTU 下的 TCP 载荷上限。多数静态场景下无需修改,直接启用sendfile on配合即可生效。仅对非 sendfile 场景敏感
当sendfile off或传输内容无法走零拷贝路径(例如带 gzip 压缩、header 修改、sub_filter 替换等),Nginx 会退回到用户态读取+多次send()的方式。此时postpone_output才真正起作用——它会缓存输出直到累积 ≥ 指定字节数,或遇到 flush 标记、连接关闭等触发点。不能单独启用,需配合缓冲区策略
它依赖output_buffers提供的内存缓冲空间。若output_buffers 1 32k;,表示最多用 32KB 缓冲区暂存待发数据;postpone_output 1460则告诉 Nginx:“别急着发,等够 1460 字节再推”。二者协同,才能在不增加延迟的前提下提升吞吐。注意延迟权衡
设为过大(如postpone_output 8192)可能导致首字节时间(TTFB)轻微上升,尤其对小响应(如 200 字节 HTML)。生产环境建议保持默认 1460,除非压测确认小报文过多且 TTFB 不敏感。验证是否生效
可用tcpdump抓包观察:对比开启/关闭postpone_output时,相同静态资源(如/style.css)的 TCP 分段数量。优化后应看到更少的「小包 + 大包」组合,更多单次完整传输。
一句话总结:postpone_output 是 Nginx 对小响应体的“智能攒发”机制,配合默认 output_buffers 和 sendfile on,就能在静态传输中自然减少系统调用和网络开销,无需代码改动,也不影响语义。

















