Linux 下文件描述符泄漏排查:从 lsof 到 strace 的实战文件描述符

现象:进程卡顿、日志报错"Too many open files"

某天线上服务突然响应变慢,查看应用日志发现大量 java.io.IOException: Too many open files 错误。虽然重启能临时恢复,但几小时后再次出现,显然存在文件描述符泄漏。

定位:用 lsof 和 /proc 统计 FD 分布

  1. 确认当前进程 FD 数量ls /proc/$(pgrep -x myservice)/fd | wc -l,发现已接近 4 万(系统 ulimit -n 为 65535)。
  2. 按类型统计 FDsudo lsof -p $(pgrep -x myservice) | awk '{print $5}' | sort | uniq -c | sort -rn,发现大量 REG(普通文件)和 sock(socket)。
  3. 追踪未释放的 socket 连接sudo lsof -i -p $(pgrep -x myservice),发现大量 CLOSE_WAIT 状态的 TCP 连接,目标端口是下游 Redis 集群。
  4. 确认代码逻辑 :查看源码,发现每次从连接池获取连接后,在异常处理分支中缺少 finally { client.close() },导致连接未归还或关闭。

修复:补齐 finally 块 + 连接池超时配置

  1. 代码修复 :在所有 try-catch 后添加 finally { if (client != null) client.close(); },确保无论是否异常都能释放连接。
  2. 连接池优化 :设置 ``maxTotal=50``、``maxIdle=10``、``minEvictableIdleTimeMillis=30000,避免空闲连接残留。
  3. 监控告警 :增加 ``/proc/.../fd`` 数量监控,当超过 50000 时自动告警。

复盘:从套路到预防

文件描述符泄漏的经典模式是:打开资源 → 异常/忘记关闭 → FD 累积 → 极限触发 。排查时牢记三板斧:``ulimit -n`` 看限制 → ``lsof`` 看类型 → ``strace -e trace=open,close`` 实时追踪调用。更根本的预防措施包括:强制代码检查中要求所有 I/O 资源使用 try-with-resources(Java)或 with 语句(Python),并在 CI 中集成 FD 泄漏检测工具(如 Valgrind 的 fd 相关检查)。

相关推荐
小李独爱秋7 个月前
你真的会用lsof吗?一个被低估的神器级指令(对比netstat & ss)
linux·运维·服务器·操作系统·apache·lsof
遇见火星9 个月前
Linux性能调优:使用strace来分析文件系统的性能问题
linux·运维·服务器·strace
帅大大的架构之路10 个月前
lsof命令的基础用法及底层原理
lsof
cui_win1 年前
Linux问题排查-找到偷偷写文件的进程
linux·运维·服务器·进程·lsof
孤城2862 年前
Linux下lsof命令使用
linux·运维·服务器·netstat·lsof
岁月标记2 年前
lsof 命令
lsof
智驾2 年前
【Linux 命令】内核、驱动调试手段总结
linux·perf·strace·itrace·ptrace
威迪斯特3 年前
Linux系统运维命令:终止监听在 TCP端口80上的所有进程(使用lsof,grep,awk组合命令, 终止监听在 TCP某个端口上的所有进程)
linux·运维·服务器·tcp/ip·grep·awk·lsof
云满笔记3 年前
Linux 调试 (objdump/strace/strings)
debug·objdump·dev·strace·strings