proxy_buffers 不直接控制内存分页,但配置不当会加剧内核内存压力,间接引发频繁 page fault 甚至 swap;关键在于稳定缓冲区分配、提升复用率、避免抖动和临时文件落盘导致的 page cache 污染。

proxy_buffers 本身不直接控制内存分页(page fault 或 page-out),但它配置不当会显著加剧内核内存压力,间接诱发频繁的 minor/major page fault,甚至触发 swap —— 尤其在大流量反向代理场景下。
关键不在“调大就省分页”,而在于让缓冲区分配更稳定、复用更高效、避免抖动式内存申请与临时文件落盘带来的 page cache 污染。
明确 proxy_buffers 与内存分页的关系
-
proxy_buffers number size是 per-request 的预分配内存池:每个活跃请求独占一组 buffer(如16 128k= 单请求最多用 2MB)。 - Nginx 在收到后端数据时,按需从该池中分配 buffer;请求结束即释放(长连接下受 keepalive 影响)。
- 若设置过小 → 频繁分配/释放小块内存 → 增加 slab 分配压力、触发更多 minor page fault。
- 若设置过大 → 单请求吃掉大量 RSS 内存 → worker 进程 RSS 快速上涨 → 挤占系统空闲内存 → 内核被迫回收 page cache 或换出匿名页(swap)→ 引发 major page fault 和 I/O 等待。
所以,“减少内存分页”本质是降低内存分配抖动 + 抑制 RSS 非线性增长 + 避免 page cache 脏写干扰。
按响应特征设 buffer 数量与大小,稳住内存脚印
目标:让典型响应体完整落在内存中,避免 fallback 到临时文件,同时防止单请求内存开销失控。
中小响应(API/HTML/JSON,平均 50–300KB)
proxy_buffers 8 256k(总量 2MB)
✔ 够覆盖 95% 接口响应
✔ 单请求 RSS 增长可控( ❌ 避免8 4k(默认)—— 小包频繁切 buffer,加剧分配抖动-
大响应(报表导出、镜像回源,10–100MB)
proxy_buffers 32 256k(总量 8MB),同步:- 控制并发连接数(如
limit_conn addr 100) - 或启用流式转发(
proxy_buffering off)
✔ 减少因 buffer 不足导致的writing to temp file→ 规避 page cache 回写风暴
❌ 禁止proxy_buffers 64 4m→ 单请求 256MB,3 个并发即可触发 OOM Killer
- 控制并发连接数(如
高频小包(WebSocket 心跳、IoT 上报)
proxy_buffers 16 16k(总量 256KB/连接)
✔ 单块匹配常见消息体积(避免跨 buffer copy)
✔ 总量适中,5000 连接 ≈ 1.2GB RSS,可预期、可监控
配合 proxy_busy_buffers_size,防“忙区”卡死引发假分页
proxy_busy_buffers_size 决定多少已收未发数据能驻留内存。设错会导致:
- 太小(如默认 8k) → 很快填满“忙区” → Nginx 暂停读后端 → 后端 TCP 窗口收缩 → 触发重传 + 内核 socket 缓冲区反复填充/清空 → 增加 page fault
- 太大(> 总量 2/3) → 空闲 buffer 不足 → 新请求无法及时分配 buffer → 退化为同步阻塞或 fallback 落盘
✅ 推荐值:proxy_buffers 总量的 1/4 至 1/2,且 ≥ 单块大小
例如:
-
proxy_buffers 8 256k(2MB)→proxy_busy_buffers_size 512k -
proxy_buffers 16 128k(2MB)→proxy_busy_buffers_size 1m
该设置能让“收-发”流水线平滑运转,减少因阻塞导致的内核调度与内存状态震荡。
禁用临时文件 + 对齐系统内存策略,切断 swap 诱因
即使 buffer 配置合理,若落盘行为失控,仍会污染 page cache,拖慢内存回收:
-
proxy_max_temp_file_size 0:超限直接返回 502,不写磁盘 -
proxy_temp_path /dev/shm/nginx_temp 1 2:如必须落盘,强制走 tmpfs(内存盘),避开磁盘 I/O 对 page cache 的干扰 -
vm.swappiness=1(sysctl):抑制内核主动换出匿名页,让 RSS 压力优先通过回收 page cache 缓解 -
proxy_buffering off用于流式场景:此时所有 buffer 参数失效,零落盘、零 swap 风险,但需配套proxy_http_version 1.1和延长proxy_read_timeout
不复杂但容易忽略











