Linux进程FD泄漏排查_FD增长定位方法

3次阅读

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

Linux进程FD泄漏排查_FD增长定位方法

确认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_fileeventfd → 内核对象(如 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。

text=ZqhQzanResources