文件描述符耗尽会表现为连接失败、日志无法写入或进程报 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 设置分级告警。限制值应留有突发余量,但不能掩盖泄漏。