1 概述
tcpcopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去(也可以在测试系统内部放大流量),从而模拟真实运行环境,以便排查测试系统的性能问题和风险。TCPCopy的优势在于其实时性及真实性,除了少量的丢包,可以完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。
在tcpcopy 1.0版本中对整个架构进行了改进,将原本低版本tcpcopy需要运行在测试机上的intercept移除放到一个独立的辅助机上来,使得测试机需要做的操作少到仅仅是添加一条路由而已,对整个测试机的性能损耗可以忽略,排除了intercept运行在测试机上时产生的性能影响,使得测试数据更加接近真实水平。
2 下载
下载tcpcopy及intercept:
https://github.com/wangbin579/tcpcopy
https://github.com/session-replay-tools/intercept
3 在线流量复制配置方法
说明:
假定我们现在有3台机器:
线上服务器:172.16.1.23
辅助服务器:172.16.1.24
测试服务器:172.16.1.25
若我们现在想将线上服务器172.16.1.23 80端口的流量导入到测试服务器172.16.1.25,我们需要按照下述流程进行操作。
3.1 线上服务器(流量源)部署tcpcopy
解压并安装:
#tar xf tcpcopy-1.0.0.tar.gz
#cd tcpcopy
#./configure
#make && make install
执行下述命令若能显示版本号则表示安装成功:
#/usr/local/tcpcopy/sbin/tcpcopy -v
tcpcopy version:1.0.0
启动脚本范例:
#/usr/local/tcpcopy/sbin/tcpcopy -x 80-172.16.1.25:80 -s 172.16.1.24 -c 172.16.100.x -d -C 4 -l /var/log/tcpcopy.log
说明:
将80端口收到的流量复制到测试机ip 172.16.1.25的80端口,并设置辅助机的ip地址为172.16.1.24,且将复制过去的流量中的源地址统一更改为172.16.100.x,这样做的好处是我们在测试机上可以直接针对整个更改后的网段设置一条路由即可。
3.2 辅助服务器(截获返回数据)部署intercept
解压并安装:
#tar xf intercept-1.0.0.tar.gz
#cd intercept
#./configure
#make && make install
执行下述命令若能显示版本号则表示安装成功:
#/usr/local/intercept/sbin/intercept -v
intercept version:1.0.0
启动脚本范例:
#/usr/local/intercept/sbin/intercept -i em2 -l /var/log/intercept.log -F 'tcp and src port 80' -d
说明:
辅助机的 intercept 通过-F 参数制定捕获规则,捕获tcp连接中源端口为80的所有数据,也即是测试机的回应数据。其作用是将测试机路由过来的响应数据捕获下来,完成整个请求回应的流程且保证测试机产生的回应数据不会流向线上环境。
intercept 会监听 tcp 36524 端口,并和线上机172.16.1.23的 tcpcopy 之间建立通信,我们通过ss命令可以观察到。
需要注意的是辅助机和测试机一定要是同一网段
3.3 测试服务器(需要导流的目标机器)配置路由
添加路由配置范例:
route add -net 172.16.100.0 netmask 255.255.255.0 gw 172.16.1.24
说明:
线上机tcpcopy复制流量时将源地址改写为172.16.100网段的地址,那么在测试机上看到的流量中源地址全部是来源于这个网段,
我们仅仅需要将返回给这个网段的所有客户端的请求全部通过辅助机 172.16.1.24 路由出去,这样在辅助机上就可以对全部的回应包进行截获处理了。
4 离线回放部署及配置方法
说明:
整体操作流程也是与在线流量copy一样的,唯一的区别是不再是复制在线的即时流量,而是事先将在线流量录制为pcap离线文件然后进行回放。
注:因为线上不同时间段的用户量不一样,用户行为也是随时变化的,多次复制的线上流量肯定是会有所差异的,这样对服务器产生的压力也不一样。所以在做对比性的测试时推荐使用离线回放的方式,以确保每次测试时的请求及对服务器产生的压力是一致的。
4.1 安装并配置支持离线模式的tcpcopy
网上介绍0.98版本以上的tcpcopy才支持离线回放模式,保险起见推荐下载1.0.0最新版的tcpcopytcpcopy。
需要在configure时加上--offline参数才能支持离线回放(可执行configure --help查看帮助信息)
依次执行:
./configure --offline
make&make install
4.2 使用tcpdump录制pcap离线文件
tcpdump -i eth0 -w online.pcap tcp and port 54322 #录制54322端口的tcp请求,保存到online.pcap文件
参数说明:
-i eth0:eth0为网卡,获取方式可在liunx系统下执行ifconfig查看所有的网卡,选取需要的那个。
-w online.pcap:保存所录制请求的pcap文件,以便后续进行回放。可设置路径,e.g.-w /home/user/test.pcaptcp and port 80:截获端口为80的tcp请求,也可添加udp请求,和更改服务端口80,e.g. tcp and port 16001
-s 0:默认的话,tcpdump只显示部分数据包,-s snaplen是控制包长度的,默认是68字节,-s 0 则为全部字节,在使用过程中,如果添加-s则回放时会出现错误。可不使用该参数
4.3tcpcopy、intercept、路由配置
假设有3台机器:
测试机(被测应用所部署的服务器):10.1.2.196 172.16.1.25
辅助机(三次握手回包):10.1.2.203 172.16.1.24
流量回放机(回放pcap离线文件):10.1.2.195 172.16.1.23
辅助机执行intercept(捕获tcp连接中源端口为54322的所有数据):
/usr/local/intercept/sbin/intercept -i em2 -l /var/log/intercept.log -F 'tcp and src port 54322' -d
流量回放机执行tcpcopy(将流量复制到测试机的54322端口,指定事先录制好的online.pcap文件):
/usr/local/tcpcopy/sbin/tcpcopy -l /var/log/tcpcopy.log -x 54322-172.16.1.25:54322 -s 172.16.1.24 -c 172.16.1.x -i ./online.pcap
测试机配置路由(将返回给172.16.1网段的所有客户端的请求通过辅助机路由出去,以便辅助机对回包截获处理):
route add -net 172.16.1.0 netmask 255.255.255.0 gw 172.16.1.24
回放流量时可以通过 tcpdump -n port 54322的方式抓包测试,亦可观察测试服务的日志确认是否有请求进来,至此流量回放完成。
4.4简化配置及操作方法
以上操作使用的是传统的部署模式,需要占用3台机器。若测试机不足时,也可以简化部署,将intercept直接部署在测试机上(可以省去配置route的操作),如:
测试机执行intercept:
/usr/local/intercept/sbin/intercept -i eth1 -l /var/log/intercept.log -F 'tcp and src port 54322' -d
流量回放机执行tcpcopy(需要通过-c参数将访问测试机的客户端ip地址改写为不存在或无法访问的地址,总之不能让响应包回到真正的客户端,否则会干扰测试的进行):
/usr/local/tcpcopy/sbin/tcpcopy -l /var/log/tcpcopy.log -x 54322-172.16.1.25:54322 -s 172.16.1.25 -c 172.16.88.88 -i ./online.pcap
补充说明
开启tcpcopy或intercept后最好ps一下相关进程,以便确认启动成功。若未启动成功可以查看/var/log/tcpcopy.log(通过启动参数l自行指定)中的报错详情。
若要关闭服务,则直接kill掉tcpcopy或intercept中的一个进程即可,kill掉其中一个进程另一个进程会自动终止。
常见错误解决
1.执行./configure时报错:checking for pcap.h … not found
解决办法:yum install libpcap libpcap-devel(需要用到pcap库头文件)
2.运行TCPCopy命令时日志报错:[error] Can not connect to remote server(10.16.6.62:36524) (Connection refused)
解决办法:首先看看intercept是否已启动。如果已启动成功,看看是否辅助服务器的36524端口不能访问到,没有开通这个端口的权限。在iptable中加上对这个端口的访问(在运行TCPCOPY程序时,会去连辅助机的这个端口,这个端口是由intercept程序监听)
参考资料
https://github.com/wangbin579/tcpcopy