五 100万并发连接服务器笔记之Java Netty处理1M连接会怎么样

前言

每一种该语言在某些极限情况下的表现一般都不太一样,那么我常用的Java语言,在达到100万个并发连接情况下,会怎么样呢,有些好奇,更有些期盼。这次使用经常使用的顺手的nettyNIO框架(netty-3.6.5.Final),封装的很好,接口很全面,就像它现在的域名netty.io,专注于网络IO。整个过程没有什么技术含量,浅显分析过就更显得有些枯燥无聊,准备好,硬着头皮吧。

测试服务器配置

运行在VMWare Workstation 9中,64位Centos 6.2系统,分配14.9G内存左右,4核。已安装有Java7版本:

java version "1.7.0_21"Java(TM) SE Runtime Environment (build 1.7.0_21-b11)Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

在/etc/sysctl.conf中添加如下配置:

fs.file-max = 1048576net.ipv4.ip_local_port_range = 1024 65535net.ipv4.tcp_mem = 786432 2097152 3145728net.ipv4.tcp_rmem = 4096 4096 16777216net.ipv4.tcp_wmem = 4096 4096 16777216net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1

在/etc/security/limits.conf中添加如下配置:

*soft nofile 1048576*hard nofile 1048576测试端

测试端无论是配置还是程序和以前一样,翻看前几篇博客就可以看到client5.c的源码,以及相关的配置信息等。

服务器程序

这次也是很简单呐,没有业务功能,客户端HTTP请求,服务端输出chunked编码内容。

入口HttpChunkedServer.java:

}

}

view rawhosted with byGitHub

唯一的自定义处理器HttpChunkedServerHandler.java:

}

}

view rawhosted with byGitHub

启动脚本start.sh

12

.

nohup java -server -Xmx6G -Xms6G -Xmn600M -XX:PermSize=50M -XX:MaxPermSize=50M -Xss256K -XX:+DisableExplicitGC -XX:SurvivorRatio=1 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:gc.log -Djava.ext.dirs=lib com.test.server.HttpChunkedServer 8000 >server.out 2>&1 &

view rawhosted with byGitHub

达到100万并发连接时的一些信息

每次服务器端达到一百万个并发持久连接之后,然后关掉测试端程序,断开所有的连接,等到服务器端日志输出在线用户为0时,再次重复以上步骤。在这反反复复的情况下,观察内存等信息的一些情况。以某次断开所有测试端为例后,当前系统占用为(设置为list_free_1):

totalusedfreeshared bufferscachedMem:1518977367453018120-/+ buffers/cache:75977592Swap:40959483147

通过top观察,其进程相关信息

PID USERPR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND4925 root20 0 8206m 4.3g 2776 S 0.3 28.8 50:18.66 java

在启动脚本start.sh中,我们设置堆内存为6G。

ps aux|grep java命令获得信息:

root4925 38.0 28.8 8403444 4484764 ?Sl 15:26 50:18 java -server…HttpChunkedServer 8000

RSS占用内存为4484764K/1024K=4379M

然后再次启动测试端,在服务器接收到online user 1023749时,ps aux|grep java内容为:

root4925 43.6 28.4 8403444 4422824 ?Sl 15:26 62:53 java -server…

查看当前网络信息统计

ss -s Total: 1024050 (kernel 1024084) TCP: 1023769 (estab 1023754, closed 2, orphaned 0, synrecv 0, timewait 0/0), ports 12 Transport TotalIPIPv6 * 1024084 –RAW000UDP761TCP1023767 121023755INET 1023774 181023756FRAG 000

通过top查看一下

top -p 4925 top – 17:51:30 up 3:02, 4 users, load average: 1.03, 1.80, 1.19 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu0 : 0.9%us, 2.6%sy, 0.0%ni, 52.9%id, 1.0%wa, 13.6%hi, 29.0%si, 0.0%st Cpu1 : 1.4%us, 4.5%sy, 0.0%ni, 80.1%id, 1.9%wa, 0.0%hi, 12.0%si, 0.0%st Cpu2 : 1.5%us, 4.4%sy, 0.0%ni, 80.5%id, 4.3%wa, 0.0%hi, 9.3%si, 0.0%st Cpu3 : 1.9%us, 4.4%sy, 0.0%ni, 84.4%id, 3.2%wa, 0.0%hi, 6.2%si, 0.0%st Mem: 15554336k total, 15268728k used, 285608k free,3904k buffers Swap: 4194296k total, 1082592k used, 3111704k free, 37968k cachedPID USERPR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND4925 root20 0 8206m 4.2g 2220 S 3.3 28.4 62:53.66 java

四核都被占用了,每一个核心不太平均。这是在虚拟机中得到结果,可能真实服务器会更好一些。 因为不是CPU密集型应用,CPU不是问题,无须多加关注。

系统内存状况

free -mtotalusedfreeshared bufferscached Mem:15189149262630556 -/+ buffers/cache:14864324 Swap:409510573038

物理内存已经无法满足要求了,占用了1057M虚拟内存。

生命不是一场赛跑,而是一次旅行。比赛在乎终点,而旅行在乎沿途风景。

五 100万并发连接服务器笔记之Java Netty处理1M连接会怎么样

相关文章:

你感兴趣的文章:

标签云: