监控Nginx文件描述符占用走势需定期采集worker进程的/proc//fd/数量并打点记录,推荐用pgrep -f "nginx: worker process"获取PID,每20秒统计一次FD数、带时间戳写入日志,再通过awk聚合或Prometheus+Grafana可视化趋势。

监控 Nginx 文件描述符(File Descriptor, FD)占用走势,核心是定期采集 nginx 工作进程的 FD 使用量(通过 /proc/ 目录统计),结合时间戳存入日志或时序数据库,再用脚本或工具绘图分析趋势。下面给出一个轻量、可直接运行的自动化方案。
获取 Nginx 主进程与工作进程 PID
Nginx 启动后,主进程(master)会派生多个工作进程(worker)。FD 占用主要在 worker 进程上,因此需先准确识别所有 worker PID:
- 推荐用
pgrep -f "nginx: worker process"(兼容大多数部署方式) - 避免仅依赖
pidof nginx或/var/run/nginx.pid,因该文件只记录 master PID,且可能滞后或失效 - 若使用 systemd,也可用
systemctl show --property MainPID nginx | cut -d= -f2获取 master PID,再用ps --ppid获取 worker-o pid=
统计每个 worker 的 FD 数量并打点记录
对每个 worker PID,执行 ls -1 /proc/ 得到当前 FD 数。建议每 10–30 秒采集一次,输出带时间戳的结构化行:
monitor_nginx_fd.sh):#!/bin/bash
LOG="/var/log/nginx_fd_usage.log"
while true; do
now=$(date '+%Y-%m-%d %H:%M:%S')
pids=$(pgrep -f "nginx: worker process" 2>/dev/null)
if [ -n "$pids" ]; then
for pid in $pids; do
fd_count=$(ls -1 "/proc/$pid/fd/" 2>/dev/null | wc -l 2>/dev/null)
echo "[$now] PID:$pid FD:$fd_count" >> "$LOG"
done
else
echo "[$now] WARN: no nginx worker found" >> "$LOG"
fi
sleep 20
done
聚合统计与趋势可视化(可选增强)
原始日志适合排查,但看走势需聚合。可用简单命令快速生成分钟级汇总:
- 按分钟统计平均 FD 占用:
awk '{print substr($1,2), $2, $4}' /var/log/nginx_fd_usage.log | awk -F'[: ]' '{key=$1"-"$2"-"$3" "$4":"$5} {sum[key]+=$6; cnt[key]++} END {for (k in sum) print k, sum[k]/cnt[k] | "sort"}' - 导出为 CSV 后用
gnuplot或 Python(matplotlib + pandas)画折线图 - 生产环境建议接入 Prometheus:用
node_exporter的process_open_fds指标(配合process_name为nginx的 job),再配置 Grafana 面板
设置开机启动与日志轮转
确保监控长期运行:
- 用 systemd 管理:新建
/etc/systemd/system/nginx-fd-monitor.service,启用systemctl enable --now nginx-fd-monitor - 为日志添加 logrotate 规则(如每日轮转、保留 7 天),防止磁盘占满
- 加简单健康检查:脚本开头检测
/proc/sys/fs/file-nr中已分配 FD 总数是否接近系统上限(cat /proc/sys/fs/file-max),超 85% 可发告警











