Mina的大量连接问题
2016-02-20 22:32
597 查看
最近用到了Mina,发现在CentOS6.2 上,当接收到400个来自客户端的TCP连接的时候,新的TCP的连接能建立成功
但是新建立的TCP连接收到的数据,不能再抛给应用层,而一直堵在缓冲区,如下
使用命令:netstat -nat |grep 65534
![](http://img.blog.csdn.net/20160220221221139?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
因为TCP的三次握手是操作系统控制的,所以新的TCP连接能够建立成功。
为什么会这样呢?当找到了真正的原因,只能感叹,作为一个java 使用者,比起c 的使用者,真是苦逼
因为Mina使用的是selector,而在java里,实现的selector会为每一个新的连接,使用2个PIPE(管道)来发送数据
所以当我开辟了400个连接的时候,已经使用了800个管道,而管道的建立在Linux里会占用“文件描述符”
而默认的文件描述符是1024个,所以当有新的连接来到时,可能文件描述符就不够用了
可能你们要问,1024/2=512,应该是能建立512个socket才对啊?
可是事实上不是如此,因为程序本身使用了一些文件描述符和数据库的连接,
然而java 虚拟机也使用了一些PIPE来控制其它事情吧
所以通过lsof可以查看,你的进程到底使用了多少文件描述
lsof -p PID
![](http://img.blog.csdn.net/20160220222607821?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
最后,通过改变用户能够使用的最大文件描述符的个数,方法如下:
vi /etc/security/limits.conf
加上:
* soft nofile 65534
* hard nofile 65534
该问题就迎刃而解了
所以,当我跑3000个客户端的实时连接,也没有任何问题了
但是新建立的TCP连接收到的数据,不能再抛给应用层,而一直堵在缓冲区,如下
使用命令:netstat -nat |grep 65534
因为TCP的三次握手是操作系统控制的,所以新的TCP连接能够建立成功。
为什么会这样呢?当找到了真正的原因,只能感叹,作为一个java 使用者,比起c 的使用者,真是苦逼
因为Mina使用的是selector,而在java里,实现的selector会为每一个新的连接,使用2个PIPE(管道)来发送数据
所以当我开辟了400个连接的时候,已经使用了800个管道,而管道的建立在Linux里会占用“文件描述符”
而默认的文件描述符是1024个,所以当有新的连接来到时,可能文件描述符就不够用了
可能你们要问,1024/2=512,应该是能建立512个socket才对啊?
可是事实上不是如此,因为程序本身使用了一些文件描述符和数据库的连接,
然而java 虚拟机也使用了一些PIPE来控制其它事情吧
所以通过lsof可以查看,你的进程到底使用了多少文件描述
lsof -p PID
最后,通过改变用户能够使用的最大文件描述符的个数,方法如下:
vi /etc/security/limits.conf
加上:
* soft nofile 65534
* hard nofile 65534
该问题就迎刃而解了
所以,当我跑3000个客户端的实时连接,也没有任何问题了
相关文章推荐
- Experimental Educational Round: VolBIT Formulas Blitz(F)排列组合
- Agent admitted failure to sign using the key
- OpenJudge百炼习题解答(C++ )--题4112:情报破译-Cryptanalysis
- 实习生面试题目
- ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构
- JavaScript实现的网页放大镜效果
- JavaScript实现的网页放大镜效果
- Experimental Educational Round: VolBIT Formulas Blitz(D)数学
- CI
- ANDROID_MARS学习笔记_S03_007_GoogleMap1
- 测试例子啊啊啊
- 在Dephi中使用TStream读写数据的技巧
- javascript event(事件对象)详解
- 获取网路图片
- 产品会不停迭代
- 自定义用户注册地区键盘(封装)3
- Android.mk文件分析
- iOS编程基础之环境篇
- CentOS系统下安装 LNAM环境
- Dll注入技术之远程线程注入