目录
前言
原文:
https://zhuanlan.zhihu.com/p/65791330
https://zhuanlan.zhihu.com/p/65790128
概念类比:
待压测的服务器应用:城池;
测试软件:攻城军队;
测试软件需要做的就是构造出成千上百万的士兵,来攻占服务器的应用。
工具和原理
TCPBurn是一个关注并发的重放工具。(所谓重放就是 在服务端用过tcpdump 抓取客户端的请求消息,记录在pcap文件中,然后将pcap文件给TCPBurn读出里面的请求记录,将这些请求重新发往服务器)
如下图所示,TCPBurn由两个部分组成:
1:tcpburn 在测试主机(test server)上运行 tcpburn并从pcap文件获取要发送的记录“重放”发送数据。(pcap是提前在服务器端用tcpdum ”录“下的请求数据文件)
2:intercept 拦截运行助手服务器(Assistant server)并执行一些助手工作,如传递响应信息到 tcpburn。
ibm - - tcpburn 从pcap文件读取 [请求记录],并执行必要的处理( 包括TCP交互仿真。网络延时控制和通用上层交互仿真),默认情况下使用原始套接字输出技术将数据包发送到目标服务器服务器。
针对TCPBurn目标服务器所需的唯一操作是设置适当的路由(因为TCPburn或产生虚拟IP来发送数据到服务端,设置服务端的路由,让服务端收到虚拟IP发来的数据,就返回数据到 测试主机的IP,而不是往虚拟IP回复)。
intercept 负责将响应头传递给 tcpburn。 通过捕获响应包,intercept 将提取响应头信息,并使用特殊的信道( 紫色箭头) 将响应头发送到 tcpburn。 当收到响应头时,它利用头信息修改pcap包的属性,并继续发送另一个包。 应该注意到来自目标服务器的响应被路由到辅助服务器,该服务器应该充当一个黑洞。

实战
1、软硬件配置
为进行千万并发连接测试,采用的软硬件如下:

服务器IP地址采用192.168.25.89。
TCPBurn采用IP欺骗的方式来模拟客户端,需要为客户端选择IP地址网段,这里我们选择内网IP地址来欺骗Nginx。
客户端虚拟机IP地址和TCPBurn客户端所采用的IP地址关系如下:

虚拟机(模拟客户端)和服务器具体关系图如下(图中省略192.168前缀):

图中的城池便是我们待测试的Nginx服务;我们在城池的周围建立了7个营地,每个营地其实是客户端的虚拟机。接下来,我们需要在每个虚拟机上,通过TCPBurn来构建我们的精兵猛将。每个TCPBurn实例为客户端配置了254个IP地址,每个可用的IP地址类似于营地中的兵团,而TCPBurn可利用的端口区间为32768~65535,也就是每个兵团的士兵可达到32768个。这么计算下来,我们使用TCPBurn,在每个营地,轻而易举的便能够构造出254×32768=8323072个士兵,即800多万并发连接。在我们测试过程中,每一个营地会利用300万个地址空间来构造300万个客户端并发连接,需要大概500多M内存(???),而2000万并发连接,需要累计消耗3G多空间。
(每一条链接两个socket<客户端和服务端在同一机器上时要特别注意这点>,每个socket 4KB左右,《每个 TCP 连接最少占用多少内存》https://blog.csdn.net/sinat_41832255/article/details/80048580)
服务器操作系统内核版本:
Linux 3.10.0-957.el7.x86_64
服务器CPU采样配置如下图:

服务器内存配置采样图:

从上图可以看出服务器可用内存大概是200G左右(为性能考虑,海量并发测试不考虑swap空间),用来支撑2000万并发连接应用。在这个配置下,理论上每一个连接消耗资源不超过10k字节才可以做到(包括内核+应用)。
虚拟机CPU采样配置如下图:

虚拟机内存情况如下图:

虚拟机的硬件条件足够支持单个TCPBurn模拟300万并发连接。
2、服务器端系统参数配置
为规避高并发带来的系统参数问题,需要在如下方面进行配置:
1)规避IP conntrack坑
参考第21讲(IP CONNTRACK大坑,你跳不跳)内容,我们在服务器端配置了iptables命令来规避IP conntrack坑(两大坑,性能+连接无法建立):
具体命令:
iptables -t raw -A PREROUTING -p tcp --dport 8080 -j NOTRACK
iptables -t raw -A OUTPUT -p tcp --sport 8080 -j NOTRACK
这里8080是Nginx监听端口,意思是对出入8080端口的数据包不进行跟踪。设置上述命令可以降低内存和cpu资源消耗,并且也不会干扰测试的进行(21讲会详细讲述)。
配置结果可以通过iptables来查看,见下图:

2)规避文件句柄坑
ulimit -HSn 1000000
需要注意上述命令只对本终端有效,建议修改/etc/security/limits.conf。
上述设置确保单个进程能够打开的句柄数量为100万。
由于Nginx是多进程程序,所以可以配置多个进程的方式来支持2000万连接,理论上至少需要20个进程才能达到。
3)关闭rp filter设置
由于TCPBurn采用了IP欺骗(原理类似流量复制工具TCPCopy,可参考课程TCPCopy相关部分),系统如果设置rp filter则会干扰测试的进行。
由于被测试的服务器配置了rp filter过滤,为简单起见,在服务器端关闭所有rp_filter设置。
4)路由设置
由于TCPBurn采用IP欺骗的方式来模拟大量客户端连接,需要在服务器端配置路由,使其响应能够回到发送请求的客户端虚拟机上。
客户端虚拟机利用了7台虚拟机,所在的IP地址跟欺骗的IP网段地址对应关系如下:
192.168.25.121 <-------> 192.168.100.0