把测试代码 ServerAio.class,ClientAio.class 打包成 jar,丢给 linux 系统跑 server,window 跑 client
其中添加两个 shell 文件, 因为原系统装有 java6,建立个 sh 不同版本 java 共存
java8.sh
- /down/jdk1.8.0_131/bin/java $@
systeminfo.sh
- echo "系统"
- head-n1/etc/issue
- echo cpu
- cat/proc/cpuinfo |grep "model name"&&cat/proc/cpuinfo |grep "physical id"
- echo "内存"
- cat/proc/meminfo |grepMemTotal |awk 'BEGIN{sum=0} !/^d/{sum=$2} END{print "Memtotal is:",sum/1024,"M"}'
jdk:
java version "1.8.0_131"Java(TM) SE Runtime Environment (build 1.8.0_131-b11)Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
system:
系统 CentOS release 5.5 (Final)cpumodel name : Intel(R) Xeon(R) CPU E5606 @ 2.13GHzmodel name : Intel(R) Xeon(R) CPU E5606 @ 2.13GHzmodel name : Intel(R) Xeon(R) CPU E5606 @ 2.13GHzmodel name : Intel(R) Xeon(R) CPU E5606 @ 2.13GHz 内存 Memtotal is: 7983.66 M
首次测试时出现异常:java.io.IOException: Too many open files
- ./java8.sh-cptestaio.jar com.eyu.onequeue.demo.aio.ServerAio
执行:ulimit -a
其中 open files 选项允许每个用户打开最大文件数,因为 linux 是文件资源系统,设备、连接、文件、应用程序等都是以文件形成存在
重启会丢效:ulimit -n 1000000
永久修改:vim /etc/security/limits.conf
在最后加入 * soft nofile 1000000* hard nofile 1000000
* 是所有用户
echo "fs.file-max = 2000000" >>/etc/sysctl.conf
执行生效:sysctl -p
初步测试结果:
linxu 服务端打印:16344
window 开两个 client 测试还是 16344
那到底是 client 有限制还是 server 有限制呢?
是 jdk 问题还是 system 问题?
我们先排除系统问题:
在 linux 跑单个 client 或两个 client. 结果服务端支持连接数 28232
window,linux 同时跑 client. 结果服务端支持连接数 44578
结果证明系统对用户程序有限制
- ./java8.sh-cptestaio.jar com.eyu.onequeue.demo.aio.ClientAio
echo "net.ipv4.ip_local_port_range = 1024 65535" >>/etc/sysctl.conf
这表明将系统对本地端口范围限制设置为 1024~65535 之间。请注意,本地端口范围的最小值必须大于或等于 1024;而端口范围的最大值则应小于或等于 65535。
执行生效:sysctl -p
如不出问题执行结果为 64507 成功突破,实验证明:系统对 tcp 端口分配有最大限制,每个 client connect tcp 随机分配一个端口,最多 65535 -1024 - 已使用,对于 window 默认是 1.6W 左右,但不知道如何修改
不成功则添加
echo "net.ipv4.ip_conntrack_max = 60000" >>/etc/sysctl.conf
这表明系统将对最大跟踪的 TCP 连接数限制默认为 60000。请注意,此限制值要尽量小,以节省对内核内存的占用。
执行生效:sysctl -p
来源: http://www.cnblogs.com/solq111/p/6747305.html