Netty长连接测试,参数设置

来源:互联网 发布:centos安装中文包 编辑:程序博客网 时间:2024/06/08 05:17
参考http://www.4ucode.com/Study/Topic/2130412

服务端:

vim /etc/sysctl.conf

加入如下配置:

net.core.somaxconn = 1000000

net.core.rmem_default = 262144

net.core.wmem_default = 262144

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.core.somaxconn = 10000

net.core.netdev_max_backlog = 20000

 

net.ipv4.tcp_rmem = 7168 11264 16777216

net.ipv4.tcp_wmem = 7168 11264 16777216

 

net.ipv4.tcp_mem = 786432 2097152 3145728

net.ipv4.tcp_max_syn_backlog = 16384

net.ipv4.tcp_fin_timeout = 15

net.ipv4.tcp_max_syn_backlog = 16384

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_max_orphans = 131072

net.ipv4.tcp_max_tw_buckets=180000

fs.file-max = 1000000

 

net.ipv4.ip_local_port_range = 1024 65535

net.ipv4.netfilter.ip_conntrack_max = 1000000

net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120

net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60

net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

 

执行/sbin/sysctl -p生效

vim /etc/security/limits.conf 

找到hard nofile和soft nofile配置信息,修改为如下:

* hard nofile 1000000

* soft nofile 1000000

这样重启后用ulimit -a就可以看到open file为自己设置的1000000而不是默认的1024了
客户端:

由于系统默认参数,自动分配的端口数有限,是从32768到61000,所以我们需要更改客户端/etc/sysctl.conf的参数:

net.ipv4.ip_local_port_range = 1024 65535

 

编辑完成后执行如下命令让配置生效

/sbin/sysctl -p

同样,vim /etc/security/limits.conf 

找到hard nofile和soft nofile配置信息,修改为如下:

* hard nofile 1000000

* soft nofile 1000000


测试:

最后,为了测试Netty支持最大的连接数,我们配置如下: 

-server -Xms4G -Xmx4G -XX:NewSize=3584m -XX:PermSize=64m -XX:SurvivorRatio=1 -XX:+UseParallelGC -XX:-UseAdaptiveSizePolicy

Eden、S0、S1各1G,Old512M,UseParallelGC回收机制,加入UseAdaptiveSizePolicy不允许回收器自动调整Eden和Survivor区大小。

上面的一堆参数,不明白什么意思>_<

在server端执行dmesg命令,发现存在如下信息:ip_conntrack: table full, dropping packet.

是65322,看来是最大连接跟踪值开得较小了。

再执行如下命令

cat /proc/sys/net/ipv4/ip_conntrack_max

是65322,看来是最大连接跟踪值开得较小了。

接下来执行vim /etc/sysctl.conf 进行编辑,加入如下配置:

net.ipv4.ip_conntrack_max = 1000000 //设置最大连接跟踪值 net.ipv4.netfilter.ip_conntrack_max=1000000net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120-------------------------------------------------------------------- 笔记:我的服务器上没有那几个key,cat /proc/sys/net/ipv4/ip_conntrack_max时出现找不到文件的错误执行/sbin/sysctl -p时出现net.ipv4.netfilter.ip_conntrack_max=1000000等没有key的错误解决:

modprobe ip_conntrack

echo "modprobe ip_conntrack" >> /etc/rc.local

这样再执行/sbin/sysctl -p就没问题了,具体用途可以man modprobe


在客户端跑一百个java程序,每个进程开一千个线程去连接netty服务,拟建立100000个长连接

实际只有65个java进程在跑,服务端接收长连接63001个,中途最高达到过64885个,但log里面看出连接断掉被remove了

最终稳定在63001,此时,服务端进程占内存0.4%(共16G内存),约64M,每个长连接占内存1k左右。

稳定时服务端没有给客户端发消息了,只是保持着长连接

之前测试,当连接过程中不断通讯时,会出现各种问题,程序会死掉。再想优化办法。


服务端拟隔5分钟向所有客户端问好。不知道会不会直接挂掉?


上述是在一台机子上测试的,所以最多只能跑64511个,现在放在两台上,每台6w,连接数轻松到达12w。并且服务端每隔200s向所有客户端发送消息,也没有压力!

没有通讯时CPU和MEM分别为0.3%(八核)和7.9%

通讯时CPU和MEM最高达到144.8%和9.3%