proxy_buffers采用每请求独占缓冲区、按需分配、请求结束即释放的轻量模型,不支持跨请求复用;其内存复用效率取决于buffer规格与后端响应节奏匹配度,合理配置可降低slab分配抖动、减少page fault并稳定rss。

proxy_buffers 的缓存与内存复用不是靠“自动回收”或“全局池共享”,而是基于每个请求独占缓冲区、按需分配、请求结束即释放的轻量模型。它不维护跨请求的 buffer 复用逻辑,但通过合理配置可显著降低内存抖动、提升 slab 分配效率,间接实现稳定内存 footprint。
每个请求独占一组 buffer,生命周期绑定请求
Nginx 为每个启用 proxy_buffering 的 upstream 请求,在建立连接时预分配 proxy_buffers number size 指定数量的内存块(例如 16 128k → 16 块 × 128KB = 2MB)。这些 buffer 属于该请求上下文,仅用于接收后端响应体数据。请求结束(响应完整发出、连接关闭或超时)后,整组 buffer 立即归还给系统 —— 不进入通用内存池复用,也不跨请求保留。
- 长连接(keepalive)下,若同一连接发起新请求,会重新分配新 buffer 组,旧 buffer 已释放
- 无 keepalive 时,TCP 连接关闭即触发 buffer 归还
- buffer 分配由 nginx 内存管理器(slab allocator)完成,单位是固定大小的 block,避免 malloc/free 频繁调用
内存复用依赖“稳定规格”而非“跨请求共享”
真正影响内存复用效率的,是 buffer 块大小是否匹配后端实际推送节奏和响应体分布。一旦规格对齐,就能减少因频繁切块、重分配导致的内存碎片与 page fault:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 后端按 64KB 分块返回 JSON 流 → 设
proxy_buffers 16 64k,每块刚好填满,避免跨块 copy 或小块频繁申请 - 若设成
8 4k(默认),一个 64KB 响应需分配 16 次小 buffer,触发多次 slab 分配,增加 minor page fault - 若设成
4 1m,单块过大,小响应(如 10KB)只用 1/100,浪费 RSS,且易挤占 worker 总内存
busy 区控制“已收未发”数据驻留,影响并发吞吐稳定性
proxy_busy_buffers_size 并非独立内存池,而是从当前请求的 buffer 总量中划出的“忙区”上限。它决定 Nginx 能否继续从后端读取数据:
- 已接收但尚未发送给客户端的数据,只能占用 ≤ busy 区额度;超出则暂停读上游,防止压垮客户端或耗尽 buffer
- 该值必须 ≥ 单块 buffer 大小(否则刚写满一块就停读),推荐设为总量的 1/4~1/2(如总量 4MB → 设 1M~2M)
- 设太小会导致后端 write() 阻塞、TCP 窗口收缩、重传增多,间接加剧内核 socket 缓冲区翻页压力
禁用落盘是减少 page cache 污染的关键一环
当响应超出内存 buffer 总量,默认行为是写临时文件(/var/lib/nginx/proxy/...),这会引发两类内存问题:
- 写磁盘触发 page cache 脏页积累,与业务 page cache 争抢内存,可能被内核主动回收
- 小块写入(默认
proxy_temp_file_write_size 8k)造成大量 write() 系统调用,增加内核路径开销
更优做法是:proxy_max_temp_file_size 0(超限直接 502),配合足够大的 proxy_buffers 总量,把流量“兜住”在内存里 —— 此时所有数据流转都在用户态 buffer 完成,不触碰内核 page cache,RSS 可预期、无抖动。










