文件描述符耗尽排查:从 Too many open files 找到泄漏点

系统化检查进程、用户与内核三层文件描述符限制,并定位连接或文件句柄泄漏。

文章目录 · 4 节

文件描述符耗尽会表现为连接失败、日志无法写入或进程报 Too many open files。临时调大限制只能缓解症状,关键是确认达到哪一层限制以及句柄为何不释放。

判断耗尽范围

cat /proc/sys/fs/file-nr
cat /proc/sys/fs/file-max
ulimit -n
cat /proc/$PID/limits | grep -i 'open files'
ls /proc/$PID/fd | wc -l

系统 file-nr 接近上限说明是全局压力;单进程 FD 数接近其 soft limit,则重点检查该服务。systemd 管理的进程还要查看 unit 中的 LimitNOFILE

识别句柄类型

lsof -p $PID | awk '{print $5}' | sort | uniq -c | sort -nr
lsof -p $PID +L1
ss -tanp | grep "pid=$PID," | head

大量 REG 常见于文件未关闭,大量 IPv4/IPv6 可能是连接池或超时配置问题。+L1 可发现文件已删除但仍被进程持有的情况。

修复原则

  • 先保留 lsof、连接状态和增长曲线证据
  • 必要时限流或滚动重启,避免全局耗尽
  • 调整限制时同时修改 systemd 或容器运行参数
  • 在代码层补充 close、超时与连接池回收测试

收尾清单

确认 FD 数在稳定负载下不再单调增长,并为进程使用率和系统 file-nr 设置分级告警。限制值应留有突发余量,但不能掩盖泄漏。