tcpcopy压力测试
一、tcpcopy简介
XCopy是由主要由网易的王斌开发的一套流量复制测试工具。XCopy系列包括 TCPCopy、UDPCopy、MysqlCopy 等开源软件(这些软件都集成在tcpcopy 开源项目内)。曾经应用于网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的很多问题。所以很多时候我们指的tcpcopy (广义上的)就包括xcopy的全系统产品。
TCPCopy 包含两部分:TCPCopy client(tcpcopy) 和 TCPCopy server(intercept) ,其中,TCPCopy client 运行在在线系统,用来捕获在线请求数据包,而 TCPCopy server 运行在测试系统,用来做一系列辅助配合工作,如返回响应包头信息、维护路由信息等。
二、tcpcopy新架构
目前tcpcopy的最新版本是0.9.9 ,而自v0.8版本以后tcpcopy就开始使用了新的架构方式。这里就只看下其新的架构:
相对于0.8之前的老架构,新架构将 intercept 的工作从测试服务器(test server)offload 出来,放到另外一台独立的辅助服务器(assistant server,原则上一定要用同网段的一台闲置的服务器来充当辅助服务器)上面截获响应包, 而且把传统架构从 IP 层捕获响应数据包的工作转移到从数据链路层抓响应包,这些改变大大降低了 TCPCopy 对测试机器的各种干扰(新架构下,除了路由设置,其它已经没有影响了) ,大大增强了 intercept 捕获响应包的能力,而且测试也更加真实。
新旧架构的对比,可以参看官方提供的中文手册。
三、tcpcopy安装及配置选项
安装
tcpcopy托管在github上,其项目主页为:https://github.com/wangbin579/tcpcopy ,可以通过下面的方法安装tcpcopy
1# git clone git://github.com/wangbin579/tcpcopy.git
2此处也可以从github上下载zip包
3# cd tcpcopy-0.9.9
4# sh autogen.sh
5# ./configure --enable-选项
6# make && make install
编译选项
其中–enable的可选选项有:
1--enable-debug compile TCPCopy with debug support (saved in a log file)
2--enable-mysqlsgt run TCPCopy at mysql skip-grant-tables mode(recommended)
3--enable-mysql run TCPCopy at mysql mode
4--enable-offline run TCPCopy at offline mode
5--enable-pcap run TCPCopy at pcap mode
6--enable-udp run TCPCopy at udp mode
7--enable-nfqueue run the TCPCopy server (intercept) at nfqueue mode
8--enable-advanced run TCPCopy at advanced mode (advanced archecture)
9--enable-dlinject send packets at the data link layer instead of the IP layer
10--enable-rlantency add more lantency control
具体也可以通过./configure –help查看 。
错误
安装过程中可能遇到的报错有如下几个:
1autogen.sh: 1: autogen.sh: autoreconf: not found
解决方法:sudo apt-get install automake
编译时,使用–enable-nfqueue 选项时,可能遇到的报错:
1no need to check nfqueue or ip_queue
2checking for nfqueue directory... configure: error: nfqueue required. Install libnetfilter_queue(download it from http://www.netfilter.org/projects/libnetfilter_queue/index.html) or specify its path using --with-nfqueue=/dir/
解决方法:sudo apt-get install libnetfilter-queue-dev
编译时,使用–enable-pcap 选项时,可能遇到的报错:
1configure: error: pcap.h not found.
解决方法:sudo apt-get install libpcap-dev
四、tcpcopy在线复制
在tcpcopy 的新架构中,在线复制测试至少需要4台主机。其中四者之间的关系我简单画了一个草图,相对于架构图可能更好理解一些:
上面四台主机的角色关系如下:
A主机:作为请求者,在应用场景中,可以理解其是前端nginx、loadrunner测试机
B主机:线上主机,在应用场景中,可以理解为其是web架构中的tomcat、resin等应用(其可以通过nginx反向代理过来访问,也可以是loadrunner直接通过http://IP:端口的形式访问的对象)
C主机:测试主机,在应用场景中,其跑的应用是和B主机上的应用一致的。比如,新版本或新功能的应用布在C主机上,通过复制B主机的流量时行真实环境下的压力测试,就可以得出其是否存在bug,性能如何等。这也是tcpcopy测试的目的。该机在测试环境中,需要配置route路由。
D主机:intercept主机,即架构图中的辅助服务器。intercept通过和tcpcopy之间的通信,控制B、C间流量的复制。而最终在C主机上的模拟结果,就相当于A主机直接请求C主机一样(这也就是图中A、C之间灰色箭标的意思)。
注:以上只是我的个人理解。现实测试环境中,根据模拟压力的不同,A、B、C、D 可以同时是 N 台 。
现根据上面的架构,模拟进行复制,各主机的IP如下:
- A主机:172.20.0.130
- B主机:172.20.0.40
- C主机:172.20.0.42
- D主机:172.20.0.39
A主机:
不需要任何配置
C主机:
配置路由
1# route add -host 172.20.0.130 gw 172.20.0.39
D主机:
安装tcpcopy
1# ./configure --enable-advanced --enable-pcap --enable-nfqueue
2# make
3# make install
运行intercept
如果D主要的内核版本小于3.5,编译时就不需要后面的–enable-nfqueue参数,其使用uqeue模块,按如下方式运行intercept
1# modprobe ip_queue # if not running
2# iptables -I OUTPUT -p tcp --sport port -j QUEUE # if not set
3# ./intercept
由于这里我使用的ubuntu的内核版本大于3.5,按如下方式进行启动
1# sudo iptables -I OUTPUT -p tcp --sport 8080 -j NFQUEUE
2# sudo intercept -i eth0 -F 'tcp and src host 172.20.0.42 and src port 8080' -d
注:在老的传统架构中根据内核版本的不同,需要按上面的步骤进行启动。在新架构中上面防火墙部分是不需要启动的,这里要感谢原作者王斌及时给予的观念纠正 。
B主机
安装tcpcopy
使用下面的方法的进行编译安装
1# ./configure --enable-advanced --enable-pcap
2# make
3# sudo make install
注:这里的–enable-pcap参数可以不加,增加了的好处就是可以对包进行条件过滤。
启动tcpcopy
1# sudo tcpcopy -x 172.20.0.40:8080-172.20.0.42:8080 -s 172.20.0.39 -i eth0 -d
验证
默认tcpcopy安装完生成后会在/usr/loca/bin目录下生成tcpcopy和intercept执行文件 ,上面我们的启动过程中也没有使用 -l 参数指定日志文件的位置,默认会在/usr/local/bin目录下生成error_intercept.log 文件(B、D主机都有)。我们通过查看该日志文件可以查看tcpcopy和intercept之间的信息交互。
验证流量复制是否成功,可以通过查看B、C 两台主机的access日志,可以查看下从A主机到B主机的访问是否同样在C主机上也有体现 ,如果有,就证明复制成功。
注:根据内外网测试环境的复杂度不同,路由规则可能也有细微的差别。具体可以参看王斌在csdn上的博客。
五、离线测试
离线主机只需要两台主机:在线主机和测试主机 。
在线主机上通过下面的方式抓包:
1tcpdump -i any tcp and port <port> -s 0 -w online.pcap</port>
测试服务器上安装离线版tcpcopy
1# ./configure --enable-offline
2# make
3# sudo make install
在测试服务器上启动intercept和tcpcopy
1# modprobe ip_queue (内核大于3.5时不需要该操作)
2# iptables -I OUTPUT -p tcp --sport <port> -j QUEUE
3# intercept
4将在线抓取的包回放
5# tcpcopy -i -x <port>-:<port></port></port></port>
注:
1、上面的iptables操作一定要有,没有的话包无法进行回放。
2、tcpcopy回放过程中的 本地IP ,可以是本机的IP也可以是局域网中的其他主机的IP 。
上面的操作中是将tcpcopy包回放主机和测试主机放在了同一台上。如果想将tcpcopy包回放的主机单独用一台,步骤则改为如下:
- A主机:172.20.0.39 (测试机)
- B主机:172.20.0.21 (tcpcopy包回放机)
A主机上执行如下操作
1# iptables -I OUTPUT -p tcp --sport <port> -j QUEUE
2# intercept -d</port>
B主机上执行如下操作
1# tcpcopy -i -x <port>-:<port></port></port>
样做的好处是将包回放主机和测试主机进行了分离,减小tcpcopy运行过程中对测试数据的影响。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/tcpcopy-online-offline/3510.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.