“双一十”将近,作为一个电商应用的开发人员,也是时候操心一下自己管理服务的性能问题了。平时跑得好好的服务应用,能否承受的住双十一,尤其是午夜时刻的流量冲击?到底是要加机器还是要做服务降级?机器加多少?服务降级降多少.....为回答这一系列的问题,你首先要知道服务的极限是多少。按我们这种非专业测试人士的设想,测试方法应满足如下需求:
面对这多么的要求,如何获取测试数据就成了最大的问题。Tcpcopy提供的解决方案是从线上复制真实的测试流量进行测试,同时尽可能减小对线上服务的影响。
?
?
TCPCopy实际由两部份组成:tcpcopy和intercept。
tcpcopy运行在线上服务器,负责捕捉和复制线上请求到待测试服务。
intercept负责在辅助服务器上进行响应包的截获,并通过intercept程序返回响应包的必要信息(一般为TCP/IP头部信息)给tcpcopy。由于tcp交互是相互的,一般情况下需要知道测试服务器的响应数据包信息,才能利用在线请求数据包,构造出适合测试服务器的请求数据包,因此只要基于数据包的方式,都需要返回响应包的相关信息。
此外,intercept所在的辅助服务器,扮演了黑洞的角色。复制过来的请求从待测试服务机上的响应包都会被路由到intercept所在的辅助服务上(需要在待测试服务器上配置route规则),为了防止响应返回到线上的真实客户端,这些响应数据包需要被丢弃掉。之前版本的intercept通过netlink协议,采用ip queue或者nfqueue在内核态捕捉响应数据包,发送给intercept进程,由intercept告知内核裁决结果(ACCEPT,DROP)。这种方式容易出现性能瓶颈。1.0.0版本中丢包的方法就显得更省力多了,要求辅助服务器关闭ip_forward,这样响应包自然就发不出去了。
?
待测试服务(target server): 地址199.155.122.162 ,端口8080
多台线上服务 (online server): 地址199.155.122.196,端口 8082
地址199.155.122.195,端口8082
辅助机器(assistant server): 199.155.122.233
另外提供一个用于伪装的源地址:199.155.122.200
从https://github.com/session-replay-tools/intercept/releases?下载 intercepter1.0.0.zip文件解压。随后运行。
如果遇到如下失败提示:
checking for pcap.h ... not found
需要事先安装libpcap-delvel
yum install libpcap-devel
然后执行 make & make install 搞定
从https://github.com/session-replay-tools/tcpcopy/releases?下载tcpcopy1.0.0.zip文件解压。
运行./configure
再执行make & make install 搞定
在target server (199.155.122.162)下加入route规则:
route add -host 199.155.122.200 gw 199.155.122.233
199.155.122.200是经复制后测试数据包上填入的源地址。199.155.122.233为assistant server,上面将会运行intercept服务。这条命令作用是 target server对于复制而来的请求(根据源地址判断)的响应,不会返回给请求客户端,而是发往assitant server这个统一的垃圾站。
在assistant server( 199.155.122.233)运行命令(需要root权限):
./intercept -i eth0 -F ‘tcp and src port 8080‘ –d
然后关闭linux转发功能:
echo "0" > /proc/sys/net/ipv4/ip_forward
其中8080是target server的端口号。
我们可以执行ps –aux|grep intercpet查看是否已经启动成功。
在online server执行(199.155.122.196,199.155.122.195 ):
./tcpcopy -x 8082-199.155.122.162:8080 -s 199.155.122.233 -c 199.155.122.200
其中8082是target server的端口号。
-x 8082-199.155.122.162:8080 是将从8082端口的请求发往 target server。
-s 199.155.122.233 为指定assistant server。
-c 199.155.122.200 是指将所有复制请求的数据包的源地址全改为199.155.122.200。
修改原地址的好处是:很多时候,client的是四处分布的,不一定固定的几个ip,统一设计为一个源地址,便于在target server上route规则的设置。
这里我们复制了两台线上服务的请求,就相当于发送给对测试机了两倍线上请求流量进行压测。
如果你想要复制更多倍数的线上服务流量可以使用-n参数指定复流量的倍数。
可以采用dstat 命令查看,网络流量是否增加。
也可以安装nethogs,查看指定端口网络实时流量。如果target server 8080端口的流量是online server 8082端口流量的两倍,说明上述操作成功。
停止流量复制的方法很简单,
在assistant server 中kill intercept进程,在online server 中kill tcpcopy进程,在target server上删除相应的route。
?
以下我们对某线上集群服务中的单台节点做压力测试的结果。
先是从其他两上结点复制流量,相当于三倍流量效果,明显可以看到network上升。随后是load和平均响应时间上升,随后稳定。
?
?
?
?
经过一天稳定运行后,加大压力,复制4台线上结点的流量,承受5倍的流量。很快就出现了load的飙升。我们的服务已经被压垮了。
?
?
?
参考文章:
1、http://blog.csdn.net/wangbin579/article/details/8950282
2、http://blog.csdn.net/wangbin579/article/details/8949315
3、github 地址https://github.com/session-replay-tools/tcpcopy
20151016首发于3dobe.com:http://3dobe.com/archives/174/
本站链接 ?http://quentinXXZ.iteye.com/blog/2249799
原文:http://quentinXXZ.iteye.com/blog/2249799