tcpcopy工具分享

1工具介绍

tcpcopy 是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信心。

tcpcopy 的优势在于其实时性及真实性,除了少量的丢包,完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。

2tcpcopy原理

2.1tcpcopy原理

下面以推荐系统中的内核作为后端说明tcpcopy的原理。

线上内核后端机开启 tcpcopy 客户端(tcpcopy 进程),测试内核后端机开启 tcpcopy 服务端(intercept 进程),且两台机器上都启动了推荐内核服务。

tcpcopy 拷贝一次流量访问的步骤如下:

1
2
3
4
5
6
7
1.一个访问请求到达线上内核后端机;
2.socket 包在 IP 层被拷贝了一份传给tcpcopy 进程;
3.tcpcopy 修改包的目的及源地址,发给测试内核后端机;
4.拷贝的包到达测试内核后端机;
5.测试内核后端机的推荐内核处理访问,并返回结果;
6.返回结果在 IP 层被截获、丢弃,由 intercept 拷贝返回结果的 IP header 返回;
7.IP header 被发送给线上内核后端机的 tcpcopy 进程。

2.2引流模式

引流模式分为离线回放、部分引流和放大引流三种模式。下面分别介绍这三种模式。

2.2.1离线回放

  用法:离线回放模式需要在configure 的时候加上–enable-offline 参数,离线回放还需要安装pcap 库和pcap 开发库(需要用到pcap 库的头文件),另外运行的时候需要指定-i 参数。

1
#./tcpcopy -x 110-xxx.xxx.xxx.148:110 -i ./online.pcap

  这里oline.pcap(利用tcpdump 的工具来抓请求数据包,存放到pcap 格式的文件中去)文件作为数据源,把请求转发到测试服务器上。此外增加-a参数对请求数据包的访问进行加速

1
#./tcpcopy -x 80-xxx.xxx.x.xx:8080 -a 2 -i online.pcap

假设online.pcap 文件为在线请求数据包的抓包文件,时间间隔为60 分钟执行此命令后,离线回放加速了2 倍,只需要30 分钟离线回放就能完成,-a 参数设置不宜设置过大,越大丢请求的概率也越大。

  适用场景:由于离线方式依赖于抓包工具(如tcpdump),而抓包工具在压力比较大的场合一般丢包非常严重,而且还会严重影响在线IO,因此一般不推荐在高压情况下使用离线回放方式

2.2.2部分引流

  用法:tcpcopy可以通过-r参数实现在线服务器应用的部分流量复制,参数范围是1~99,其它值都是全流量复制。-r 参数常用于测试服务器配置不如在线服务器的场合。

1
#./tcpcopy -x 2080-xxx.xx.xx.xxx:9999 -r 20

这里tcpcopy 复制在线服务器2080 端口应用的20%流量给测试服务器,这里的20%是根据session(这里session 是由客户端IP,客户端端口决定)来统计的。
  适用场景:部分引流主要适用于线上请求压力很多,而测试环境的处理能力较弱,这时候就只需复制部分线上的请求到测试环境,就可以压到测试环境的极限。

2.2.3放大引流

  用法:Tcpcopy可以通过-n参数对在线服务器应用的流量进行复制放到到测试服务器,如果你要进行多重复制,-n参数

1
#./tcpcopy -x 2080-xxx.xx.x.xxx:9999 -n 3

表示复制3 倍的在线服务器的80 端口应用请求流量到192.168.0.2 的8080 端口
适用场景:放大引流主要用于线上压力较小时,想要通过无限构造压力通过成倍引流达到对测试服务器进行压力测试的目的。

2.3tcpcopy注意事项

1
2
3
4
5
6
7
1)Linux平台,内核2.6+ ;
2)TCPCOPY类似于UDP,所以会丢包,进而丢失请求 ;
3)本系统不支持域名,只支持ip地址 ;
4)tcpcopy服务端有可能会成为性能瓶颈;
5)丢失请求率跟网络状况有关,最好在内网内复制请求 ;
6)tcpcopy中的tcpcopy和intercept程序运行需要root权限;
7)tcpcopy只与ip、tcp层的数据有关,如果请求验证与tcp层以上的协议有关,则系统不能`正常运行。

3操作方法

3.1安装方法

1.tcpcopy:安装到线上内核后端机,tcpcopy.tar解压后放到线上内核后端机的目录下(/opt/soft/)

2.intercept:安装到测试内核后端机,intercept.tar解压后放到测试内核后端机的目录下(/opt/soft/),

3.2部署方法

假如有两台机器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
机器A:线上内核后端机,ip10.9.20.20,端口号:9909
机器B:测试内核后端机,ip10.4.20.51,端口号:49908
两台机器上都起了推荐内核服务,操作者在两台机器上都需有root权限
操作步骤:
1.进入B机器root用户,在B上依次执行,
1)加载 ip_queue 模块,modprobe ip_queue;
2)配置 iptables 规则,
sudo -S /root/.init_sys/iptables -I OUTPUT -p tcp --sport 49908 -j QUEUE;
3)启动 tcpcopy 服务端,后台运行,sudo ./interception -d;(-d表示后台运行)
2.进入A机器root用户,在A上执行,
1)启动 tcpcopy 客户端,后台启动:
sudo ./tcpcopy -d -x 9909-10.4.20.51:49908;(-x表示分布式引流,-d 表示后台启动);
2)若要复制线上多份流量,则如下启动tcpcopy客户端:
sudo ./tcpcopy -d -x 9909-10.4.20.51:49908 -n 10;(-x表示分布式引流,-d 表示后台启动,-n后的数字表示复制的份数)。

4总结

tcpcopy工具可用于从前端到后端的请求的测试,可用于复制线上流量到本地测试机,因此,可以通过该工具在不上线时完成测试。利用此工具测试有以后优势:

1
2
3
4
5
1.引用线上流量测试,减少上线bug,增加上线信心; 
2.分布式压力测试,将多台机器的请求集中到某台机器进行压力测试;
3.可复制线上多倍流量测试,可采用流量递增的方式,进行压力测试,发现系统bug和性能瓶颈;
4.tcpcopy分为在线模式和离线模式。在线模式就是实时拷贝线上流量,因此具有随机性,可以进行定性和定量分析。离线模式就是将线上流量保存到测试机器的磁盘上,可以用于定量分析;
5.占用系统资源很少,对在线系统影响很小。