mina高并发短连接导致java.io.IOException: Too many open files解决方案

   这几天在解决一个用mina开发的高并发通信过程中产生的一个bug。

   模拟场景为:

   通过定时触发启动线程模拟高并发短连接测试,测试的服务端有2个,一个是服务有起,一个没起,客户端和服务端均在同一服务器上。执行一段时间后linux主机上通过lsof命令查看,发现有递增的文件句柄,pipe和eventpoll。

   抛出的异常如下:

 

Java代码  收藏代码
  1. 2012 - 10 - 13   10 : 09 : 48  -org.apache.mina.core.service.SimpleIoProcessorPool.<init>(SimpleIoProcessorPool.java: 197 )  
  2.  Failed to create a new  instance of org.apache.mina.transport.socket.nio.NioProcessor: null   
  3. java.lang.reflect.InvocationTargetException  
  4.         at sun.reflect.GeneratedConstructorAccessor110.newInstance(Unknown Source)  
  5.         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27 )  
  6.         at java.lang.reflect.Constructor.newInstance(Constructor.java:513 )  
  7.         at org.apache.mina.core.service.SimpleIoProcessorPool.<init>(SimpleIoProcessorPool.java:180 )  
  8.         at org.apache.mina.core.service.SimpleIoProcessorPool.<init>(SimpleIoProcessorPool.java:112 )  
  9.         at org.apache.mina.core.polling.AbstractPollingIoConnector.<init>(AbstractPollingIoConnector.java:93 )  
  10.         at org.apache.mina.transport.socket.nio.NioSocketConnector.<init>(NioSocketConnector.java:56 )  
  11.         at com.develop.webplatform.funnel.client.JobClient.sendMessage(JobClient.java:39 )  
  12.         at com.develop.webplatform.funnel.client.JobClient.sendJob(JobClient.java:126 )  
  13.         at com.develop.webplatform.funnel.extend.JobExecRemotelyBySocket.execJobByTask(JobExecRemotelyBySocket.java:66 )  
  14.         at com.develop.webplatform.funnel.JobManager.execJobByTask(JobManager.java:27 )  
  15.         at com.develop.webplatform.quartz.job.TaskJob.executeInternal(TaskJob.java:38 )  
  16.         at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86 )  
  17.         at org.quartz.core.JobRunShell.run(JobRunShell.java:223 )  
  18.         at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549 )  
  19. Caused by: org.apache.mina.core.RuntimeIoException: Failed to open a selector.  
  20.         at org.apache.mina.transport.socket.nio.NioProcessor.<init>(NioProcessor.java:61 )  
  21.         ... 15  more  
  22. Caused by: java.io.IOException: Too many open files  
  23.         at sun.nio.ch.IOUtil.initPipe(Native Method)  
  24.         at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:49 )  
  25.         at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:18 )  
  26.         at java.nio.channels.Selector.open(Selector.java:209 )  
  27.         at org.apache.mina.transport.socket.nio.NioProcessor.<init>(NioProcessor.java:59 )  
  28.         ... 15  more  

 

    原代码中,关于客户端连接的代码如下:

 

Java代码  收藏代码
  1. final  NioSocketConnector connector =  new  NioSocketConnector();  
  2.         final  String[] result =  new  String[ 1 ];  
  3.         connector.getFilterChain().addLast("codec" ,  
  4.                 new  ProtocolCodecFilter( new  ObjectSerializationCodecFactory()));  
  5.         connector.setHandler(handler);  
  6.   
  7.         //设置超时   
  8.         connector.setConnectTimeoutMillis(defaultConnectTimeOut);  
  9.         ConnectFuture connectFuture = connector.connect(address);  
  10.         connectFuture.awaitUninterruptibly();   //同步,等待,直到连接完成   
  11.         if  (connectFuture.isDone()) {  
  12.             if  (!connectFuture.isConnected()) {  //若在指定时间内没连接成功,则抛出异常   
  13.                 logger.info("fail to connect "  + logInfo);  
  14.   
  15.                 throw   new  Exception();  
  16.             }  
  17.         }  

 

         经过分析,导致主机文件句柄泄露的原因为,客户端发起服务端连接时,会请求系统分配相关的文件句柄,在原代码中,仅仅判断是否连接成功,而未对连接失败进 行资源释放,从而造成文件句柄泄露。当总的文件句柄数超过系统设置值(ulimit -n 查看同一个进程允许的最大文件句柄数),则抛出异常“java.io.IOException: Too many open files",导致无法创建新的连接,服务器挂掉。

      更改后的代码如下:

 

Java代码  收藏代码
  1. final  NioSocketConnector connector =  new  NioSocketConnector();  
  2.         final  String[] result =  new  String[ 1 ];  
  3.         connector.getFilterChain().addLast("codec" ,  
  4.                 new  ProtocolCodecFilter( new  ObjectSerializationCodecFactory()));  
  5.         connector.setHandler(handler);  
  6.   
  7.         //设置超时   
  8.         connector.setConnectTimeoutMillis(defaultConnectTimeOut);  
  9.         ConnectFuture connectFuture = connector.connect(address);  
  10.         connectFuture.awaitUninterruptibly();   //同步,等待,直到连接完成   
  11.         if  (connectFuture.isDone()) {  
  12.             if  (!connectFuture.isConnected()) {  //若在指定时间内没连接成功,则抛出异常   
  13.                 logger.info("fail to connect "  + logInfo);  
  14.                 connector.dispose();    //不关闭的话会运行一段时间后抛出,too many open files异常,导致无法连接   
  15.   
  16.                 throw   new  Exception();  
  17.             }  
  18.         } 
mina高并发连接导致java.io.IOException: Too many open files解决方法 这几天在实习的公司给一个项目搞测试,主要测试项目部署在Linux Server上的并发访问,即所谓的压力测试; 模拟网关,建立大量并发连接,用的是apache的mina建立的NioSocketConnector(); 在多线程的模式下,开启了1000个连接,结果抛出异常“java.io.IOException: Too many open files",导致无法创建新的连接,服 阅读详情

相关推荐

手机拍照对焦快准狠的秘密:一文看懂PDAF、Dual Pixel和Super PD的区别

本文深入解析手机拍照中的三种主流相位检测自动对焦(PDAF)技术:Shield Pixel、Super PD和Dual Pixel。通过对比它们的原理、优缺点及实际表现,帮助读者理解不同技术的对焦速度、暗光表现和画质影响,从而做出更明智的购机选择。

weixin_26985923的博客 458

java.io.Exception: 打开的文件过多(too many open files)解决办法

从头分析下"打开的文件过多(too many open files)"出现的原因以及各种解决办法

甘蓝的专栏 5052

Emotion-LLaMA实战指南:从零构建多模态情感识别系统(附Python代码)

本文提供了Emotion-LLaMA多模态情感识别系统的实战指南。通过详细的步骤,指导读者从零搭建开发环境、运行本地Demo、理解模型架构,并完成数据处理与模型训练。该创新模型融合视觉、听觉与文本信息,实现更精准、接近人类理解的情感分析与推理,并附有完整的Python代码实现。

weixin_29094775的博客 383

解决:org.apache.catalina.connector.ClientAbortException: java.io.IOException: 断开的管道

对“org.apache.catalina.connector.ClientAbortException: java.io.IOException: 断开的管道”异常的分析和处理

拾年一剑 的专栏 2万+

Android平台中调用串口功能时报错:java.io.IOException: read failed: EBADF (Bad file descriptor)

Android平台中调用串口功能时返回错误: java.io.IOException: read failed: EBADF (Bad file descriptor)

shiruiyiruo的博客 7431

Mina 高并发短连接导致java.io.IOException: Too many open files解决方案

转自:http://xmdxzyf.iteye.com/blog/1698819   这几天在解决一个用mina开发的高并发通信过程中产生的一个bug。    模拟场景为:    通过定时触发启动线程模拟高并发短连接测试,测试的服务端有2个,一个是服务有起,一个没起,客户端和服务端均在同一服务器上。执行一段时间后linux主机上通过lsof命令查看,发现有递增的文件句柄,pipe和eve...

xuxujing的专栏 649

java.io.IOException: Too many open files问题

在开发linux在线服务器的时候经常会遇会句柄泄露的问题。因为在linux系统设计里面遵循一切都是文件的原则,即磁盘文件、目录、网络套接字、磁盘、管道等,所有这些都是文件,在我们进行打开的时候会返回一个fd,即是文件句柄。如果频繁的打开文件,或者打开网络套接字而忘记释放就会有句柄泄露的现象。在linux系统中对进程可以调用的文件句柄数进行了限制,在默认情况下每个进程可以调用的最大句柄数是1024个...

liyuguanguan的博客 2万+

Jetty - linux -Too many open files

今天碰到个问题,jetty系统跑的时候点击页面突然报 internal server error 错,翻了一下日志,发现很多jsp not found的错误: 2013-11-28 04:29:16,500 WARN [SymmetricDS] [log] [1002316844@qtp-718123118-23] /xx/xx/xx/xx/xx/xx-wizard.do org.apach...

麦芽面包 (源码:咖啡:红茶) 285

java.io.IOException: Too many open files

今天后台服务器(Linux) 在转音源的时候 报java.io.IOException: Too many open files在网上查了一些资料 记录如下:打开的文件过多,一般来说是由于应用程序对资源使用不当造成,比如没有及时关闭Socket或数据库连接等。但也可能应用确实需要打开比较多的文件句柄,而系统本身的设置限制了这一数量。 异常 1  java.net.SocketException:...

zhf6998729的博客 442

最常用的1000个Java类 (附代码示例)

分析Github 3000个开源项目,粗略统计如下。括号内的数字是使用频率 0-3000. 下面的列表显示不全,完整的请看完整列表。 1. java.util.List    (2889)  2. java.util.ArrayList    (2831)  3. java.io.IOException    (2813)  4. java.util.Map    (2

杨飞@益术 2461

tomcat环境下服务器文件句柄耗尽(Too Many Open Files)的问题排查

转载注明出处,谢谢~ http://blog.csdn.net/shootyou 前段时间帮助公司解决了一次tomcat环境服务器的异常,今天有时间过来总结一下。 问题的表现: tomcat服务在重启之后,短时间内会承受大量访问,由于这个时候缓存还没建立,每次访问都将消耗一定资源(数据库连接或者文件IO),并发量在2000左右的时候tomcat服务开始抛出大量Too Many

冷月宫主的专栏 1021

java.io.IOException: 打开的文件过多(Too many open files

一、环境描述:        部署到linux下的tomcat二、现象:        刚部署完后可以对项目进行访问,后台没有报错,间隔两天后,无法访问项目,日志中报错。三、错误日志如下:20-Nov-2017 10:07:15.210 SEVERE [http-nio-8081-Acceptor-0]org.apache.tomcat.util.net.NioEndpoint$Acceptor....

冰山上的来客的博客 1万+

RADStudio12.1(DELPHI12.1)注册工具

RADStudio12.1(DELPHI12.1)注册工具

上一篇: Spring Bean的5种作用域
下一篇: Java获取系统信息(cpu,内存,硬盘,进程等)的相关方法
Snoopy7713
博客等级 码龄21年 17粉丝 681原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值