本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

报码:【j2开奖】新浪微博百万用户分布式压测实践手记(3)

时间:2017-04-07 13:10来源:668论坛 作者:j2开奖直播 点击:
我司目前所使用的服务器操作系统大多为Centos 6.x版,受制于Linux内核限制,无论目标服务器连接地址如何变化,单机对外建立的连接数量是有限的:总连接

  我司目前所使用的服务器操作系统大多为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万用户的压测任务。

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容