RHEL-Like
1 基础知识
1.1 错误提示
java.io.IOException: Too many open files at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method) ~[na:1.8.0_65] at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422) ~[na:1.8.0_65] at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250) ~[na:1.8.0_65] at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:446) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12] at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:70) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12] at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:95) ~[tomcat-embed-core-9.0.12.jar!/:9.0.12] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_65]
1.2 原因分析
“Too many open files”是Linux系统中常见的错误
从字面意思是说程序打开的文件数过多
files不仅仅是文件的意思,它包括打开的通讯链接(比如socket)、在监听的端口等等(也称句柄,英文称handle)
此错误常称为句柄数超出系统限制
引起的原因是进程某时刻开启的句柄超过系统限制
2 解决方案
2.1 找出程序进程号
pgrep -u api java
以上参数“-u”后面跟程序的运行用户“api”,命令输出如下,
17656
2.2 查询当前进程的输出数量
lsof -p 17656 | tee ~/openfiles.log | wc -l
2.3 查询当前系统的允许打开的句柄
su - api
以上切换到程序运行用户后,使用如下命令查询,
ulimit -a | grep "open files"
可见如下输出,
open files (-n) 2048
2.4 修改允许用户打开的句柄
su - root vim /etc/security/limits.d/31-imapi.conf
加入如下设置
api soft nofile 600000 api hard nofile 600000
2.5 确认用户打开的句柄
su - api ulimit -a | grep "open files"
可见如下输出,
open files (-n) 600000
没有评论