这类问题我又碰上了一次。一台 8 核 16G 的 ECS 上 nginx 从 1.18 升到 1.24,配置里 worker_processes auto,容器里看到 nginx 起了 8 个 worker,每个都带一份 Lua 模块的缓存,内存比原来多了 2G。

第一反应是「Lua 或 OpenSSL 的会话缓存在每个 worker 里各存一份」,验证下来不成立。

这类报错背后常见的原因有几处,逐个排除就行。worker_processes 按 CPU 核数起,容器里读到的核数是宿主机的;worker_connections 配得大,每个 worker 的连接池按上限预分配;worker_rlimit_nofile 设得过高,句柄表跟着变大。

先看 worker 数量和内存占用

ps -o pid,rss,cmd -C nginx | head

接着确认配置里写的进程数和连接数

grep -nE 'worker_processes|worker_connections' /etc/nginx/nginx.conf

再往下按真实核数改成固定值并调小连接数

nginx -t && nginx -s reload

剩下的就是观察重载后内存是否回落

smem -P nginx -c 'pid rss command'

改之前我把相关日志按时间截了一段存着,事后对时间线用得上。

恢复的判定其实很直接。worker 数量变为预期的 2 到 4 个,nginx 整体 RSS 下降 1G 以上,QPS 没有明显变化。

提醒一点。容器里 auto 会按宿主机核数起进程,跑在 K8s 里最好显式写数字;改完顺手把 worker_rlimit_nofile 一起核一遍。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189