前段时间有个朋友截图,服务器出现 Too many open files 的问题
这个错呢很常见,一般就是打开的文件描述达到上限了,但是这个情况我我之前也没遇到过。
问题排查
1、查看系统级别的文件描述符限制:确认系统级别的文件描述符限制,可以通过运行以下命令来查看:
ulimit -n
发现上限很高,为 655350
2、查看当前进程到底使用了多少文件描述符
lsof -p {PID}|wc -l
发现处于阻塞状态,之前我没遇到过此类情况。如果你也遇到了,可以尝试换一个命令
ls /proc/{PID}/fd|wc -l
一样的效果,发现值为 4096
3、检查进程级别的文件描述符限制:确认受影响的进程的文件描述符限制,可以通过以下命令查看:
cat /proc/{PID}/limits
发现也是 4096
原因定位
该服务的启动是通过 systemd 的方式启动,会有个 fd 默认值上限(4096),我自己写的 java 进程很少这样去启动。
如果继续维持 systemd 的方式启动,则只需要在配置文件中显性申明fd上限即可
[Service]
LimitNOFILE=655350