tcpcopy压力测试

2014年6月18日 发表评论 阅读评论

一、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就开始使用了新的架构方式。这里就只看下其新的架构:

tcpcopy-yuanli

相对于0.8之前的老架构,新架构将 intercept 的工作从测试服务器(test server)offload 出来,放到另外一台独立的辅助服务器(assistant server,原则上一定要用同网段的一台闲置的服务器来充当辅助服务器)上面截获响应包, 而且把传统架构从 IP 层捕获响应数据包的工作转移到从数据链路层抓响应包,这些改变大大降低了 TCPCopy 对测试机器的各种干扰(新架构下,除了路由设置,其它已经没有影响了) ,大大增强了 intercept 捕获响应包的能力,而且测试也更加真实。

新旧架构的对比,可以参看官方提供的中文手册

三、tcpcopy安装及配置选项

安装

tcpcopy托管在github上,其项目主页为:https://github.com/wangbin579/tcpcopy  ,可以通过下面的方法安装tcpcopy

# git clone git://github.com/wangbin579/tcpcopy.git
此处也可以从github上下载zip包
# cd tcpcopy-0.9.9
# sh autogen.sh
# ./configure --enable-选项
# make && make install 

编译选项

其中--enable的可选选项有:

--enable-debug      compile TCPCopy with debug support (saved in a log file)
--enable-mysqlsgt   run TCPCopy at mysql skip-grant-tables mode(recommended)
--enable-mysql      run TCPCopy at mysql mode
--enable-offline    run TCPCopy at offline mode
--enable-pcap       run TCPCopy at pcap mode
--enable-udp        run TCPCopy at udp mode
--enable-nfqueue    run the TCPCopy server (intercept) at nfqueue mode
--enable-advanced   run TCPCopy at advanced mode (advanced archecture)
--enable-dlinject   send packets at the data link layer instead of the IP layer
--enable-rlantency  add more lantency control

具体也可以通过./configure --help查看 。

错误

安装过程中可能遇到的报错有如下几个:

autogen.sh: 1: autogen.sh: autoreconf: not found

解决方法:sudo apt-get install automake 

编译时,使用--enable-nfqueue 选项时,可能遇到的报错:

no need to check nfqueue or ip_queue
checking 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 选项时,可能遇到的报错:

configure: error: pcap.h not found.

解决方法:sudo apt-get install libpcap-dev

四、tcpcopy在线复制

在tcpcopy 的新架构中,在线复制测试至少需要4台主机。其中四者之间的关系我简单画了一个草图,相对于架构图可能更好理解一些:

tcpcopy-online

上面四台主机的角色关系如下:

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主机:

配置路由

# route add -host 172.20.0.130 gw 172.20.0.39

D主机:

安装tcpcopy

# ./configure --enable-advanced --enable-pcap --enable-nfqueue
# make
# make install 

运行intercept

如果D主要的内核版本小于3.5,编译时就不需要后面的--enable-nfqueue参数,其使用uqeue模块,按如下方式运行intercept

# modprobe ip_queue # if not running
# iptables -I OUTPUT -p tcp --sport port -j QUEUE # if not set
# ./intercept 

由于这里我使用的ubuntu的内核版本大于3.5,按如下方式进行启动

# sudo iptables -I OUTPUT -p tcp --sport 8080 -j NFQUEUE
# sudo intercept -i eth0 -F 'tcp and src host 172.20.0.42 and src port 8080' -d

注:在老的传统架构中根据内核版本的不同,需要按上面的步骤进行启动。在新架构中上面防火墙部分是不需要启动的,这里要感谢原作者王斌及时给予的观念纠正 。

B主机

安装tcpcopy

使用下面的方法的进行编译安装

# ./configure --enable-advanced --enable-pcap
# make
# sudo make install 

注:这里的--enable-pcap参数可以不加,增加了的好处就是可以对包进行条件过滤。

启动tcpcopy

# 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上的博客

五、离线测试

离线主机只需要两台主机:在线主机和测试主机 。

在线主机上通过下面的方式抓包:

tcpdump -i any tcp and port <port> -s 0 -w online.pcap

测试服务器上安装离线版tcpcopy

# ./configure --enable-offline
# make
# sudo make install 

在测试服务器上启动intercept和tcpcopy

# modprobe ip_queue (内核大于3.5时不需要该操作)
# iptables -I OUTPUT -p tcp --sport <port> -j QUEUE
# intercept
将在线抓取的包回放
# tcpcopy -i <抓包文件地址> -x <port>-<本地ip>:<port>

注:

1、上面的iptables操作一定要有,没有的话包无法进行回放。

2、tcpcopy回放过程中的 本地IP ,可以是本机的IP也可以是局域网中的其他主机的IP 。

上面的操作中是将tcpcopy包回放主机和测试主机放在了同一台上。如果想将tcpcopy包回放的主机单独用一台,步骤则改为如下:

A主机:172.20.0.39 (测试机)

B主机:172.20.0.21 (tcpcopy包回放机)

A主机上执行如下操作

# iptables -I OUTPUT -p tcp --sport <port> -j QUEUE
# intercept -d

B主机上执行如下操作

# tcpcopy -i <抓包文件地址> -x <port>-<本地ip>:<port>

样做的好处是将包回放主机和测试主机进行了分离,减小tcpcopy运行过程中对测试数据的影响。




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: 开源软件 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.