Nginx不直接使用Swap,但系统Swap会换出其Worker进程,导致延迟飙升、502/504错误;需调优vm.swappiness=1、vm.vfs_cache_pressure=50,并限制MemoryMax,监控Swap使用率、MemAvailable及pgpgin/pgpgout。

Nginx 本身不直接使用虚拟内存或 Swap,但其运行环境(Linux 系统)在内存紧张时会触发 Swap,导致 Nginx 工作进程被换出,引发请求延迟飙升、超时甚至 502/504 错误。真正需要监控和调优的是系统级内存分配与 Swap 行为,而非 Nginx 配置本身。
识别 Swap 对 Nginx 的实际影响
Swap 活跃时,Nginx Worker 进程可能被页换出,造成以下可观察现象:
- 响应时间(P95/P99)突然升高,尤其在高并发短连接场景下
-
top或htop中看到SWAP列非零,或si/so(swap-in/swap-out)持续大于 0 -
dmesg | grep -i "killed process"出现 OOM Killer 终止nginx:进程的记录 -
cat /proc/meminfo | grep -E "SwapTotal|SwapFree|Cached|MemAvailable"显示 Swap 使用率 >30% 且 MemAvailable 持续低于 1GB
关键系统参数调优(避免 Swap 触发)
目标是让物理内存优先服务于 Nginx 进程,抑制内核主动换页。重点调整以下三项:
- vm.swappiness=1:大幅降低内核倾向使用 Swap 的概率(默认 60)。值为 0 表示仅在内存完全耗尽时才用 Swap;设为 1 是生产推荐值,兼顾稳定性与响应性
- vm.vfs_cache_pressure=50:减缓 inode/dentry 缓存回收速度,避免因频繁释放缓存而加剧内存压力(默认 100)
-
限制 Nginx 内存上限:通过
systemd服务配置硬性约束,防止其无节制占用
编辑/etc/systemd/system/nginx.service.d/limit.conf:[Service]<br> MemoryMax=2G<br> MemoryHigh=1.8G
执行systemctl daemon-reload && systemctl restart nginx
监控指标与告警建议
不依赖 Nginx 自身模块,应通过系统工具采集并接入 Prometheus + Grafana 或 Zabbix:
-
Swap 使用率:
node_memory_SwapUsed_bytes / node_memory_SwapTotal_bytes * 100,阈值设为 20% -
内存可用率:
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100,低于 15% 即预警 -
每秒换入/换出页数:
node_vmstat_pgpgin和node_vmstat_pgpgout,持续 >100 表示 Swap 频繁活动 -
Nginx Worker RSS 增长趋势:用
ps -o pid,rss,comm -C nginx --sort=-rss定期采样,单个 Worker RSS 超过 300MB 可能存在内存泄漏或缓存未控
静态资源服务特别注意事项
当 Nginx 充当纯静态文件服务器(如大量小图、JS/CSS)时,sendfile on 和 tcp_nopush on 会显著减少用户态拷贝,但也会增加 page cache 占用。需注意:
- 确保
/proc/sys/vm/dirty_ratio不设过高(建议 ≤ 20),防止脏页堆积触发同步刷盘阻塞 Nginx - 若静态资源总量远超物理内存(如 100GB 文件,仅 16GB RAM),应关闭
open_file_cache或严格限制max和inactive时间,避免缓存元数据吃光内存 - 对高频访问的小文件(sendfile_max_chunk 512k,平衡吞吐与内存驻留


















