Linux 命令行下用 strace 定位文件描述符泄漏:一次真实性能优化strace
背景与问题在生产环境运行的一个 Java 服务每隔几天就会出现Too many open files异常重启后恢复。起初怀疑是代码里的InputStream未关闭但反复排查无果。于是我们决定用 Linux 命令行工具strace从系统调用层面定位根因。优化前盲目猜测与临时扩容最初的做法是临时调大ulimit -n到 65535缓解症状在代码里增加日志打印打开文件的地方用lsof -p pid查看文件描述符但数量上千无法快速定位。这种方式治标不治本而且每次都要等几天才能复现。我们决定用strace实时跟踪系统调用看看到底是哪个文件被反复打开而没有关闭。优化后用 strace 精准定位1. 附加到进程strace -p pid -f -e traceopen,openat,close -o /tmp/strace.log解释-p指定进程-f跟踪子线程-e traceopen,openat,close只跟踪文件打开与关闭的系统调用输出到日志文件。2. 分析日志运行几分钟后我们写了个小脚本统计每个路径的打开次数与未关闭次数awk /open/ {print $NF} /tmp/strace.log | sort | uniq -c | sort -nr | head -20结果发现一个可疑的路径/tmp/tmpfile_XXXXXX被打开了 1000 多次但 close 调用很少。我们立刻搜索代码发现是一个临时文件工具类在异常分支中没有删除和关闭。3. 验证修复修复代码后重新用strace跟踪确认打开和关闭次数基本平衡。再观察一周未再出现异常。性能对比与结论优化前每次故障需要重启服务影响业务优化后通过 strace 在几分钟内定位根因修复后系统稳定。更重要的是我们学会了用系统调用跟踪工具来排查资源泄漏而不是盲目调参。关键点strace是 Linux 下诊断系统调用问题的利器结合awk统计可以快速找出异常行为优化思路应从“治标”转向“治本”。如果你也遇到类似问题不妨试试 strace它比猜测高效得多。