Too many open files代码排查思路

项目运行一段时间就会出现Too many open files的问题:

15-Feb-2019 10:29:32.550 SEVERE [http-nio-10.0.33.33-10080-Acceptor-0] org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed
 java.io.IOException: Too many open files
    at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
    at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:482)
    at java.lang.Thread.run(Thread.java:748)

网上查了很多资料,让增加进程的 max open file数量,但是linux默认一个进程max open file的数量是1024,超过1024会告警,不会报错,说白了就是允许open file数量超过1024,超过65535才会报错(65535是系统设置的max open file数量,通过cat /etc/security/limits.conf查看)

最重要的是linux默认的配置完全能满足我们日常使用,Too many open files的问题只有在这个项目中才会出现,所以我基本定位到代码bug的问题了

第一步
ps -ef | grep java查看

lsof -p 进程id | wc -l    查看当前进程id的open file(句柄)数量

lsof -p  进程id     打开的具体文件::::,下图是执行命令返回的结果,发现有n多个sock连接未关闭(可以使用lsof -p  进程id   -> a.txt将内容输出到文件中),所以排查的思路就是所有webSocket,udp,tcp等的连接问题

Too many open files代码排查思路_第1张图片

第二步 单独部署一套项目,防止其他人干扰,多次点击界面,特别是有websocket连接的界面,使用lsof -p 进程id | wc -l实时查看open file数量,  没有问题

第三步 突然想到项目运行一段时间才会有问题,一定是有定时任务调用的接口出了问题. 多次调用有sock连接的接口,发现有一个接口多次调用,lsof -p 进程id | wc -l输出结果不断增大,至此找到了有问题的代码,解决掉就ok了

 

最后想说一句话和大家共勉,编程是个严肃的事情,我们一定要谨言慎行啊,不要给自己挖坑,坑好挖,不好填啊

 

你可能感兴趣的:(linux,java,tomcat)