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.         } 
java.io.Exception: 打开的文件过多(too many open files)解决办法 从头分析下"打开的文件过多(too many open files)"出现的原因以及各种解决办法 阅读详情

相关推荐

mina socket 通信 java.io.IOException: Too many open files Failed to open a selector

java.io.IOException: Too many open files Failed to open a selector Failed to create a new instance of org.apache.mina.transport.socket.nio.NioProcessor:null 修改之后: public void init() { NioSocketConnector connector = new NioSocketConnector(); conn

纯洁的明依 2034

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

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

拾年一剑 的专栏 2万+

PLC作为Modbus TCP客户端

PLC作为Modbus TCP客户端,Modbus Slave作为服务器

soledad_chao的博客 4378

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

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

shiruiyiruo的博客 7439

MIC(Maximal Information Coefficient)最大互信息系数

MIC(Maximal Information Coefficient)最大互信息系数是一种用于衡量两个变量之间相关性的统计量。它扩展了传统的互信息(MI)和条件互信息(CMI)的概念,具有更广泛的应用范围。MIC能够捕获包括功能性和非功能性的广泛的关联,具有普遍性和公平性。普遍性意味着在足够的样本量下,MIC能够捕捉到广泛的相关关系,而不仅仅局限于特定的功能类型;公平性则意味着MIC对不同类型的包含同等噪声的关系给出了相似的分数。需要注意的是,虽然MIC具有很多优点,但它也有一些局限性。

qlkaicx的博客 4604

Matlab安装Embedded Coder Support Package for Texas Instruments C2000 Processors教程

Matlab安装Embedded Coder Support Package for Texas Instruments C2000 Processors

m0_69133594的博客 2824

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

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

xuxujing的专栏 653

英雄联盟(MOBA)完整制作教程

这是一份从零到上线、可落地的 LOL 风格 MOBA 游戏开发全流程教程,覆盖策划、美术、程序、测试、运营全环节,适合独立团队或学习参考。

qq_35779316的博客 538

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

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

liyuguanguan的博客 2万+

【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。

qq_35635374的博客 2600

机器学习实战——疫情数据分析与预测

机器学习如何做到疫情可视化——疫情数据分析与预测实战 本文将带领大家爬取11个国家以及中国31个省(自治区、直辖市)在2022.0101-2022.06.19的新冠疫情数据。并且采用机器学习模型对2022.6.20-2022.6.30每一天的全国确诊人数、死亡人数、治愈人数进行预测,**做出疫情可视化图形并且求出最终的相关系数R2!...

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 10万+

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

这几天在实习的公司给一个项目搞测试,主要测试项目部署在Linux Server上的并发访问,即所谓的压力测试; 模拟网关,建立大量并发连接,用的是apache的mina建立的NioSocketConnector(); 在多线程的模式下,开启了1000个连接,结果抛出异常“java.io.IOException: Too many open files",导致无法创建新的连接,服

cruise技术博客 5216

基于PyTorch+Transformer实现谣言检测系统

本项目使用基于`PyTorch+Transformer`的谣言检测模型,将文本中的谣言事件进行连续向量化,通过一维卷积神经网络的学习训练来挖掘表示文本深层的特征,避免了特征构建的问题,并能发现那些不容易被人发现的特征,从而产生更好的效果。

优快云 精品推荐 6349

MINA java.io.IOException: Too many open files

这个问题,本来应该在文档中进行提示和重点说明的内容,但是框架本身并没有提示,NIOsocketconection和session需要手动进行关闭的问题。这个问题并不是高并发才会产生的,只要持续一段就会发生这个问题,默认1024的文件描述符很快就会保罗问题。参考  http://blog.csdn.net/w93223010/article/details/9027605        https:...

chengzhaoan2010的专栏 798

scratch绘制旋转彩球 2023年9月电子学会图形化编程scratch编程等级考试四级真题和答案解析

​ scratch绘制旋转彩球 2023年9月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 1、准备工作 (1)删除小猫角色,从角色库选择Ball角色; (2)默认空白背景。 ​

青少年编程学习指导 1367

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java mina 大文件传输_mina通信,对于高并发的产生:java.io.IOException: Too many open files(打开文件句柄过多问题)...

起因:由于业务系统有多个定时任务定时访问银行端,银行每天也有大量业务访问业务系统,都是通过mina通信,部署在测试环境的系统每过一两天打开句柄过万,生产的也是一周左右不重启业务系统就会爆掉。一开始并不清楚到底是哪方面原因导致句柄增长这么快,因为这是一个老系统,经过多次升级,大量的并发、多线程,所以只好做了一个定时任务,每周重启生产业务系统。说明:业务系统和银行之间的通信是通过c写的转换平台转发双方...

weixin_39640444的博客 514

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mina通信,对于高并发的产生:java.io.IOException: Too many open files(打开文件句柄过多问题)...

为什么80%的码农都做不了架构师?>>> ...

weixin_33840661的博客 751

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Apache NIO 框架 Mina 使用中出现 too many open files 问题的解决办法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33859231的博客 122
上一篇: Spring Bean的5种作用域
下一篇: Java获取系统信息(cpu,内存,硬盘,进程等)的相关方法
Snoopy7713
博客等级 码龄21年 17粉丝 681原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值