我已经从 RHEL 6.9 迁移到 RHEL 7.4,以前在 6.9 上运行良好的相同应用程序现在遇到了“打开文件过多”的问题。
在两个环境中,ulimits 设置为相同的值。使用“lsof”命令验证后,我注意到同一组文件描述符由不同“任务”下的进程打开。例如,在 RHEL 6.9 中只需要 4 个文件描述符的进程在 RHEL 7.4 中使用了大约 350+ 个文件描述符
因此,任何打开多个文件的过程都会在几分钟内遇到“打开文件过多”错误。
有人能指导我如何正确调试/修复此问题吗?
答案1
首先,您可能需要检查当前的最大文件描述符数量并确保它是一个合理的值。这个问题详细回答了如何做到这一点。
简而言之,你可以使用以下命令检查最大全局 FD 数量/proc/sys/fs/file-max
,或者检查 shell 的最大 FD 数量bash 的ulimit
命令。
一旦您验证了这一点,您可能会对哪些进程正在消耗您的所有文件描述符感兴趣。这个答案详细说明了一个 shell 脚本,您可以使用该脚本枚举前 10 个正在运行的进程所消耗的 FD 数量。问题中的脚本复制到此处:
find -maxdepth 1 -type d -name '[0-9]*' \
-exec bash -c "ls {}/fd/ | wc -l | tr '\n' ' '" \; \
-printf "fds (PID = %P), command: " \
-exec bash -c "tr '\0' ' ' < {}/cmdline" \; \
-exec echo \; | sort -rn | head
这应该能帮助你找到机器上的哪个服务正在消耗你的 FD。希望这能有所帮助,如果你有任何问题,请告诉我。