我司目前所使用的服务器操作系统大多为Centos 6.x版,受制于Linux内核限制,无论目标服务器连接地址如何变化,单机对外建立的连接数量是有限的:总连接数=本机可用IP地址数量×本机可用端口的数量。 明白了总连接数的计算方式,那么可以按图索骥,从每一个计算因子上去考虑如何扩大其连接数。 注:若要调试TCP网络四元组,诸位可使用bindp这个小工具:https://github.com/yongboy/bindp,十分方便。 【Linux内核端口数量的限制】 众所周知,在Linxu系统中,端口的数值范围为无符号short类型,值范围为1 ~ 65535。一般来讲1 ~ 1023范围默认只有Root用户有权限使用,普通用户可以使用区间范围1025 ~ 65535,约6万。 但你要考虑这中间很多的端口可能被已运行的程序占用,不妨打个折降低预期范围,留有5万左右的可用数值,以作缓冲。 我们可通过sysctl命令确认当前可用的端口范围,以作参考: bash sysctl -a | grep net.ipv4.ip_local_port_range 若范围空间太小,比如1024 ~ 35525,那就需要主动扩大一下: bash sysctl -w net.ipv4.ip_local_port_range="1024 65535" sysctl -p 【扩展阅读:IP可用数量的延伸】 有三种比较经济方式可扩展IP地址可用数量。 第一种,针对Linux内核 >= 3.9的Linux服务器而言,可设置SO_REUSEPORT内核参数进行支持;对外一个连接的四元组,将不再仅局限于本机IP地址和端口两个元素,整个网络四元组任何一个元素若有变化,都可以认为是一个全新的TCP连接,那么针对单机而言可用总连接数上限可以这样计算: 总连接数 = 本机可用IP地址数量×本机可用端口的数量×远程服务器可访问IP地址数量×远程服务器可访问端口数量。 注: 远程服务器指的是要压测的业务服务器提供了多个访问地址(IP地址:端口)访问,但都指向同一个业务服务接口; 一般而言,一个业务服务只会开放一个IP地址和端口。 第二种方式,使用IP地址别名的方式,为本机绑定额外的可用的IP地址: bash ifconfig eth0:1 10.10.10.101 netmask 255.255.255.0 注:所绑定的IP地址一定是可用的,否则会导致压测机和被压测的服务器之间无法成功建立连接。 第三种,可用考虑使用IP_TRANSPARENT(Linux kernel 2.6.28添加支持)特性支持。在你内存足够大的情况下(比如拥有64GB ~ 128GB内存),假如压测机A的IP地址为10.10.9.100,公司内网有一个IP段10.10.10.0暂时没有被使用,你可以通过ip route工具设置一台机器占用完整一个IP地址段支持。 压测机需要为物理网卡eth1添加路由规则,以便能够正常处理来自新增IP段的往返数据包: bash ip rule add iif eth1 tab 100 ip route add local 0.0.0.0/0 dev lo tab 100 同时需要在被压测的服务器上添加路由规则,方便在发送响应数据包时候能够找到被路由的接口地址: bash route add -net 10.10.10.0 netmask 255.255.255.0 gw 10.10.9.100 这样一折腾,压测机A的可用IP地址就多出来250多个全新的IP地址了。 注:其实,还可以虚拟若干个Docker实例达到这个目的。 有兴趣的同学,可以进一步参考:Tsung笔记之IP地址和端口限制突破篇,以便获得更多资料支持。 【内存因素】 ? 针对大部分应用而言,Tsung默认网络堆栈发送和接收缓冲区都是16KB,完全够用了。一个网络连接 = 一个用户 = 一个进程,每进程业务占用约10KB,粗略算下来,一个不太复杂用户逻辑上内存占用不到50KB内存。 按照这个方式计算,1万用户可占用500M内存,单机要支持6W用户,再加上程序自身占用内存,整个Tsung实例大约会占用4GB内存。实际上测试中,在每台压测机分配5万用户情况下内存使用情况,可以见图2。 【注意文件句柄】 一个网络连接占用一个文件句柄,可用文件句柄数一定要大于对外建立的连接数。可使用ulimit查看限制的数量: bash ulimit -Sn ulimit -Hn 若此值太小,根据实际情况调整,设置大一些,比如下面设置的30万连接句柄限制,大于当前服务器日常对外提供的连接数峰值 + 压测从机对外建立的连接数,有缓冲余地,可轻松应对大部分任务: bash echo "* soft nofile 300000" >> /etc/security/limits.conf echo "* hard nofile 300000" >> /etc/security/limits.conf 还需要关注一下当前服务器总的文件句柄最大打开数量限制: bash cat /proc/sys/fs/file-max 此值不能够小于上面所设置的nofile的值,否则需要大一些: bash sysctl -w fs.file-max=300000 sysctl -p 【百万用户压测机组成】 说完影响因素,现在我们可计算一下,要压测100万用户,理论上需要多少台服务器支持: 每一个IP地址可以支持6万个TCP连接同时打开,那么100万个呢,100万/6万 ≈ 17个IP地址就够了; 1万用户大约占用500MB内存,100万用户大概将占用500MB×100万 / 1000MB ≈ 50GB内存。 总之理论上,一台64GB内存服务器 + 17个可用IP地址,可以单独完成100万用户的压测任务。 (责任编辑:本港台直播) |