应通过 sysstat 的 sar -v 命令采集 /proc/sys/fs/file-nr 等内核指标,结合 nginx 进程 fd 实时统计(如 ls -l /proc/pid/fd/ | wc -l),识别 file-nr 缓慢爬升或周期性尖峰;若 nginx fd 占比超 60% 且持续接近 ulimit,则需调优 fs.file-max、systemd limitnofile 及 nginx worker_rlimit_nofile。

要分析 Nginx 文件描述符(file descriptor,简称 fd)的使用趋势,sysstat 是一个轻量但非常有效的工具集,尤其适合长期观测系统级句柄消耗模式。它不直接监控 Nginx 进程内部 fd,而是通过内核暴露的统计信息(如 /proc/sys/fs/file-nr 和进程级 /proc/PID/fd/)采集数据,再结合历史采样形成趋势视图。
确认 sysstat 已启用并配置合理采样频率
sysstat 默认可能未开启数据收集,需手动启用并调整粒度:
- 编辑
/etc/default/sysstat,将ENABLED="false"改为ENABLED="true" - 修改
/etc/cron.d/sysstat或/etc/sysconfig/sysstat,把采样间隔从默认的 10 分钟缩短为 1–2 分钟(高负载或调优阶段建议设为*/2 * * * *) - 重启服务:
sudo systemctl restart sysstat,并检查是否开始写入日志:ls -lt /var/log/sa/sa*
用 sar 提取文件句柄关键指标
sar -v 是核心命令,输出中重点关注三列:
-
file-nr:当前已分配的文件句柄总数(对应
/proc/sys/fs/file-nr的第一个值) - inode-nr:已使用的 inode 数,间接反映打开文件/目录压力
- pty-nr:伪终端数,若异常升高可能暗示 CGI、SSH 或调试连接泄漏
例如执行:sar -v 2 5 每 2 秒采一次,共 5 次,可快速观察突增;长期趋势则用:sar -v -f /var/log/sa/sa$(date -d yesterday +%d) 查看昨日数据。
关联 Nginx 进程与系统 fd 使用峰值
sar -v 只给全局视图,需配合其他命令定位是否为 Nginx 主导:
- 查 Nginx 主进程 PID:
pgrep -f "nginx: master process" - 实时统计其 fd 数:
ls -l /proc/<pid>/fd/ 2>/dev/null | wc -l</pid> - 对比同一时刻
sar -v的file-nr值——若 Nginx 占比持续超 60%,说明它是主要消耗者 - 进一步检查是否有大量
socket:[...]或anon_inode:[eventpoll],这通常对应 keepalive 连接或 epoll 实例,属正常;但若出现大量pipe:或重复REG文件,则提示 upstream 或日志轮转异常
结合趋势判断是否需调优 ulimit 和 fs.file-max
仅看瞬时值容易误判,sysstat 的价值在于发现“缓慢爬升”或“周期性尖峰”:
- 若
file-nr日均最大值稳定在fs.file-max × 70%附近,且 Nginx fd 占比高,应提升fs.file-max(sysctl -w fs.file-max=2097152)并持久化 - 若 Nginx worker 进程 fd 数频繁接近
ulimit -n设置(如始终卡在 1024),需在systemdservice 文件中添加LimitNOFILE=65536,再重载启动 - 注意:Nginx 配置中
worker_rlimit_nofile必须 ≤ 系统级ulimit,否则启动时会静默降级并报 warning
不复杂但容易忽略的是时间对齐——确保 sar 时间戳与 Nginx error.log 中的 timestamp 时区一致,否则趋势归因会出错。











