Too many open files代码排查思路

2 篇文章 0 订阅
1 篇文章 0 订阅

项目运行一段时间就会出现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等的连接问题

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

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

 

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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值