直接监控 nginx worker 进程实际打开的文件描述符数比调大配置更可靠,需通过 /proc/pid/limits 和 /proc/pid/fd/ 查软硬限制与实时占用,超 85% 应预警,并结合 prometheus、nginx_stub_status 和 file-nr 等指标综合分析瓶颈。

直接看 Nginx worker 进程实际打开的文件描述符数量,比单纯调大配置更可靠。瓶颈不是“设没设”,而是“用没用满”——等报 Too many open files 错误时,服务已经受损了。
查真实占用:从进程层面抓当前值
别依赖 ulimit -n 或配置文件,要读运行中 worker 的实际限制与使用量:
- 查当前 worker 进程的软硬限制:
cat /proc/$(pgrep -f "nginx: worker" | head -n1)/limits | grep "Max open files"
关注 Soft Limit 是否是你预期值(如 131072),否则配置未生效 - 查该 worker 当前已打开的 fd 数:
ls -l /proc/$(pgrep -f "nginx: worker" | head -n1)/fd/ 2>/dev/null | wc -l
这个数字就是真实占用,持续接近 Soft Limit 的 85% 就该预警 - 批量检查所有 worker:
for pid in $(pgrep -f "nginx: worker"); do echo "PID $pid: $(ls -l /proc/$pid/fd/ 2>/dev/null | wc -l)"; done | sort -k3 -nr
结合监控指标建立预警阈值
单次查询只能看瞬时状态,需长期观测趋势才能预判瓶颈:
- 把每个 worker 的
fd count接入 Prometheus + Grafana,设置告警规则:
当任意 worker 的 fd 使用率 > 85% 持续 2 分钟,触发中等级别告警 - 关联监控
nginx_stub_status中的Active connections和Waiting:
若 fd 占用高但Waiting也高,说明 keepalive 连接堆积,可能因 timeout 设置过长或客户端异常;
若 fd 占用高而Reading突增,可能是慢请求或 SSL 握手卡顿,导致 fd 长期不释放 - 定期统计全系统句柄总用量:
cat /proc/sys/fs/file-nr返回三列:已分配、已使用、最大上限
第二列 / 第三列 > 70%,说明全局资源紧张,不只是 Nginx 的问题
识别隐性句柄消耗源
很多 fd 占用不来自 client 连接,而是配置不当引发的“静默泄漏”:
-
日志缓冲未启用:access_log 没加
buffer=64k flush=5s,每次写日志都 open/write/close,快速耗尽 fd - upstream 连接未复用:proxy_http_version 设为 1.0、或 proxy_set_header Connection '' 被误删,导致后端连接无法 keepalive
- open_file_cache 配置过激:max 值设得过大(如 2M)但 inactive 时间太短(如 10s),缓存频繁失效重载,反复 open 文件
- SSL 会话缓存未启用或过小:ssl_session_cache shared:SSL:10m 不够用,高频 TLS 握手会额外占用 fd
日常巡检建议
每周执行一次轻量检查,比等故障更省事:
- 确认四层限制对齐:/etc/security/limits.conf、PAM、systemd override、nginx.conf 中的
worker_rlimit_nofile是否一致且生效 - 用
ss -s查看当前 ESTAB 连接数,对比worker_connections × worker_processes,若比例长期 > 0.9,说明并发逼近上限 - 检查 error.log 是否有
open() "/xxx" failed (24: Too many open files)—— 这是最后防线,别等到它出现才行动











