验证 worker_connections 实际FD消耗需比对Nginx真实FD占用与系统三层限制:内核file-max、用户ulimit-n、nginx worker_rlimit_nofile;用lsof统计socket连接数,结合压测与stub_status观察Active connections及错误日志是否出现"Too many open files"。

测试 worker_connections 对系统文件描述符(FD)的实际消耗,不能只看配置值,而要验证“Nginx 真的用到了多少、系统是否真能撑住”。核心思路是:**在可控负载下,比对 Nginx 进程真实打开的 FD 数量与系统限制、理论上限之间的关系**。
确认当前系统和 Nginx 的 FD 限制链
先理清三层限制,它们共同决定实际可用 FD 上限:
-
内核总上限:
cat /proc/sys/fs/file-max—— 建议 ≥worker_processes × worker_connections × 1.3 -
用户级限制:
ulimit -n(以 Nginx 启动用户执行),或查/etc/security/limits.conf中对应用户的nofile设置 -
Nginx 进程声明:检查
nginx.conf主块是否有worker_rlimit_nofile 65536;,且该值 ≥worker_connections
获取 Nginx 进程真实的 FD 占用数
运行中直接统计最可靠。用以下命令查主进程和所有 worker 进程的 FD 总数:
-
lsof -p $(pgrep nginx) | wc -l(粗略总数,含重复和非连接类 FD) - 更精准方式:只统计 socket 类型连接
lsof -p $(pgrep nginx) -a -i -sTCP:ESTABLISHED | wc -llsof -p $(pgrep nginx) -a -i -sTCP:TIME_WAIT | wc -l - 监控指标(如 Prometheus):
nginx_process_open_fds直接反映进程当前打开的 FD 数
构造可比负载并观察变化
不要依赖空闲状态,需施加稳定连接压力:
- 用
ab或wrk模拟长连接(-H "Connection: keep-alive")或短连接(默认),例如:wrk -t4 -c2000 -d30s http://your-site/ - 在压测过程中,实时执行:
watch -n 1 'lsof -p $(pgrep nginx) | wc -l'
同时观察nginx_stub_status中的Active connections值 - 对比关系:
若Active connections ≈ 1800,但lsof 统计 FD > 3000,说明除客户端连接外,还有 upstream、日志、SSL 缓存等额外开销
验证是否触达瓶颈的关键信号
真正消耗到位的表现不是数字变大,而是出现资源受限迹象:
- 错误日志中出现:
accept() failed (24: Too many open files)或worker_connections are not enough -
cat /proc/$(pgrep nginx)/limits | grep "Max open files"显示Max open files的Soft Limit小于worker_connections - 压测时
Active connections卡在某个值不再上升,且Waiting高、响应延迟突增











