linux_sysctl_fs_file_nr监控项

发布于:2025-04-06 ⋅ 阅读:(21) ⋅ 点赞:(0)

在 Linux 系统中,/proc/sys/fs/file-nr 文件提供了当前系统打开文件句柄的信息。如果监控到文件打开数较高,可能会影响系统性能,甚至导致无法打开新文件(达到文件句柄上限)。以下是分析和解决该问题的步骤: 

1. 理解 /proc/sys/fs/file-nr

/proc/sys/fs/file-nr 文件包含三个数字,分别表示:

  1. 已分配的文件句柄数:当前系统已分配的文件句柄数量。
  2. 未使用的文件句柄数:已分配但未使用的文件句柄数量。
  3. 最大文件句柄数:系统允许的最大文件句柄数(由 fs.file-max 定义)。

例如:

cat /proc/sys/fs/file-nr1234 0 100000
  • 已分配的文件句柄数:1234
  • 未使用的文件句柄数:0
  • 最大文件句柄数:100000 

2. 检查文件句柄使用情况

查看当前文件句柄总数
cat /proc/sys/fs/file-nr | awk '{print $1}'
查看最大文件句柄数
cat /proc/sys/fs/file-max
查看当前文件句柄使用率
used=$(cat /proc/sys/fs/file-nr | awk '{print $1}')max=$(cat /proc/sys/fs/file-max)echo "scale=2; $used / $max * 100" | bc

如果文件句柄使用率接近 100%,则需要进一步分析。 

3. 分析文件句柄的使用者

查看每个进程打开的文件句柄数
lsof | awk '{print $1}' | sort | uniq -c | sort -nr
查看打开文件句柄最多的进程
lsof | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10
查看指定进程打开的文件句柄
lsof -p <PID>

4. 检查文件句柄限制

查看系统级别的文件句柄限制
cat /proc/sys/fs/file-max
查看用户级别的文件句柄限制
ulimit -n
查看所有用户的文件句柄限制
cat /etc/security/limits.conf | grep nofile

 

5. 解决方法

临时调整文件句柄限制
# 系统级别echo 200000 > /proc/sys/fs/file-max# 用户级别ulimit -n 200000
永久调整文件句柄限制
  1. 修改 /etc/sysctl.conf

    fs.file-max = 200000

    然后执行:

    sysctl -p
  2. 修改 /etc/security/limits.conf

    * soft nofile 200000* hard nofile 200000
  3. 修改 systemd 服务的文件句柄限制(如果适用): 编辑 /etc/systemd/system.conf

    DefaultLimitNOFILE=200000

    然后重启 systemd:

    systemctl daemon-reload
优化应用程序
  • 检查是否有文件句柄泄漏(如未正确关闭文件)。
  • 减少不必要的文件打开操作。
  • 使用连接池或缓存减少文件打开次数。 

6. 监控和预防

监控文件句柄使用情况

使用监控工具(如 Prometheus、Grafana、Zabbix)持续监控文件句柄使用情况。

设置告警

当文件句柄使用率超过一定阈值(如 80%)时,触发告警。

定期清理

定期检查并清理不必要的文件句柄。 

7. 示例:文件句柄泄漏排查

如果怀疑某个进程存在文件句柄泄漏,可以执行以下步骤:

  1. 监控进程的文件句柄数:
    watch -n 1 "lsof -p <PID> | wc -l"
  2. 检查代码中是否正确关闭文件句柄。
  3. 使用工具(如 valgrind)检测内存和文件句柄泄漏。 

总结

文件句柄数较高可能是由于应用程序未正确关闭文件、文件句柄泄漏或系统配置不足。通过分析文件句柄的使用者、调整文件句柄限制以及优化应用程序,可以有效解决该问题。如果问题仍然存在,建议进一步排查应用程序或联系相关技术支持。