确认fd是否持续增长需先执行ls -l /proc/pid/fd/ | wc -l多次检测,若数值持续上升且不收敛(减3后为实际打开数),可判定泄漏;再通过ls -l软链接指向、lsof分类统计及strace/auditctl动态跟踪定位泄漏源。

确认FD是否真在持续增长
先看进程当前用了多少FD,执行:
ls -l /proc/PID/fd/ | wc -l
多次运行(间隔几秒),如果数值持续上升且不收敛,基本可判定泄漏。注意:初始值通常从3开始(0、1、2是标准输入输出错误),所以结果减3才是实际打开的资源数。
快速定位哪些文件或类型在堆积
进入 /proc/PID/fd/ 目录后,用 ls -l 查看软链接指向:
- 大量指向 /tmp/xxx (deleted) → 临时文件未 close
- 大量指向 anon_inode:sync_file 或 eventfd → 内核对象(如 Fence、eventfd)重复 dup 未释放
- 大量指向同一 socket 路径(如 socket:[1234567])→ 网络连接未正确 shutdown + close
- 大量 REG 类型且路径相同(如 /var/log/app.log)→ 日志文件反复 open 没关
用 lsof 辅助分类筛选
运行:
lsof -p PID | awk '{print $5}' | sort | uniq -c | sort -nr
这能统计每类 FD 类型(CHR、REG、DIR、IPv4、unix 等)的数量分布。若某类数量远高于业务预期(比如 REG 占 800+,但日志只该开 2–3 个),就值得重点排查。
再结合:
lsof -p PID | grep REG | head -20
看具体是哪些文件被高频打开。
动态跟踪打开/关闭行为
对可疑进程实时捕获系统调用:
- 监控关键操作:strace -e trace=open,openat,close,dup,dup2 -p PID -s 256
- 记录完整文件操作流:strace -e trace=file -f -o fd_trace.log -p PID
- 若需审计级记录(重启不丢):
sudo auditctl -a always,exit -S open,openat,close,dup,dup2 -F pid=PID
后用 ausearch -p PID 查日志
重点关注 open 成功但没对应 close 的调用对,尤其是循环或异常分支中遗漏的 close。










