背景

作为一名测试工程师,相信您一定曾经遇到过类似这样的场景:
场景一:已经按照评审过的测试用例完成所有的测试,并且也包含了异常逻辑的测试覆盖,但是版本发布,或者服务上线后可能还是出现了各种问题,导致不得不回退版本或者紧急上线修复。一旦发生这种事情不仅会对业务正常运营造成严重的影响,测试人员甚至会对自己的测试能力产生怀疑,形成恶性循环。究其根本原因,还是在于没有能够全部覆盖到用户的各种场景,越是功能复杂的软件越容易发生类似问题;为了减少这种影响,我们需要在上线之前尽量模拟真实用户操作,来校验程序是否正确稳定。
场景二:在对系统进行压测时,我们常常需要构造大量的真实数据,以便于系统能够真实的反响压测效果,那么如何构造真实用户请求呢?
这时我们就可以通过tcpcopy引流的方式,将线上真实的用户请求信息导入到测试环境中,模拟海量的真实场景来测试系统,天然解决了海量测试Case的构造问题;通过导流的方式提前校验待上线的版本是否有异常,效果如何,提前发现问题,增加上线信心,减少上线回滚率

tcpcopy 介绍

tcpcopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去,曾经应用于网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的很多问题。现在此工具已经广泛应用于各大互联网公司

tcpcopy优势

tcpcopy是一个分布式在线压力测试工具,可以将线上流量拷贝或者回放到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现 bug,增加上线信心。
与传统的压力测试工具相比,tcpcopy的最大优势在于其实时及真实性,除了少量的丢包,完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。

tcpcopy 工作原理

组成结构

tcpcopy分为客户端(tcpcopy)和服务器(intercept)
客户端运行在线上服务器上面,用来捕获线上请求数据包;其中客户端运行在线上服务器上面,用来捕获线上请求数据包;服务器运行在测试机器上面,在测试服务器的响应包丢弃之前截获测试服务器的响应包,并通过客户端和服务器之间的tcp连接传递响应包的tcp和ip头部信息给客户端,以完成TCP交互。
tcpcopy有多个版本,不同版本的使用和操作不太一样,小编在这里简单做下介绍:
0.9版本:
主要基于2台服务器做的流量转发,
优点:需要的机器少;支持赋值多台在线流量
缺点:执行intercept时需要设置iptables,这时候如果未释放iptables时,测试环境下的当前端口不能被外部调用

1.0版本:
主要基于三台服务器进行流量转发,新增了路由转发,运行原理:在运行上层服务的测试服务器test server上面设置路由信息,把待测试应用的需要被捕获的响应数据包信息路由到辅助服务器assistant server 上面,在assistant server上面,我们在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的tcpcopy
相对于0.9之前的老架构,新架构将 intercept 的工作从测试服务器(test server)offload 出来,放到另外一台独立的辅助服务器(assistant server,原则上一定要用同网段的一台闲置的服务器来充当辅助服务器)上面截获响应包, 而且把传统架构从 IP 层捕获响应数据包的工作转移到从数据链路层抓响应包,这些改变大大降低了 TCPCopy 对测试机器的各种干扰(新架构下,除了路由设置,其它已经没有影响了) ,大大增强了 intercept 捕获响应包的能力,而且测试也更加真实。
这种架构需要的机器资源也更多,而且也变得更加难使用,需要了解tcp知识,route知识和pcap filter知识(类似于tcpdump过滤条件),因此推荐有条件的并且熟悉上述知识的人使用最新的架构。
需要注意的是,在某些场景,pcap抓包丢包率会远高于raw socket抓包,因此最好利用pf_ring来辅助或者采用raw socket来抓包

工作原理

小编在这里主要说一下0.9版本的工作原理:
上图中左边是线上前端机,右边是测试前端机。线上前端机开启tcpcopy客户端(tcpcopy进程),测试前端机开启tcpcopy服务端(interception进程),且两台机器上都启动了nginx服务。
Tcpcopy拷贝一次流量访问的步骤如下:
① 一个访问到达线上前端机;
② socket包在ip层被拷贝了一份传给tcpcopy进程;
③ tcpcopy修改包的目的及源地址,发给测试前端机;
④ 拷贝的包到达测试前端机;
⑤ 测试前端机的nginx处理访问,并返回结果;
⑥ 返回结果在ip层被截获、丢弃,由intercpetion拷贝返回结果的ip header返回;
⑦ ip header被发送给线上前端机的tcpcopy进程。
代码分析:

  1. 首先,在链路层或者IP层,在把包交到上一层之前,系统会检查有没进程创建了socket(AF_PACKET,SOCK_DGRAM,…)或socket(AF_INET,SOCK_RAW,…)等类型的套接字(即原始套接字sock_raw),如果有,这个包就会被复制一份并发送到这个socket的缓冲区。tcpcopy就是通过这种方式来复制访问流量的。上述的两种抓包方式,前者工作在数据链路层,后者工作在IP层。
    2) Tcpcopy在发送拷贝的数据包的时候,使用了如下socket:
    sock = socket(AF_INET, SOCK_RAW,IPPROTO_RAW);
    并对这个socket设置了IP_HDRINCL:
    setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &n, sizeof(n));
    因此网络层不会再增加ip header. 发送之前更改了包的目的ip和端口:
    tcp_header->dest = remote_port;
    ip_header->daddr = remote_ip;
    最后调用sendto函数发送包到测试前端机:
    send_len = sendto(sock,(char *)ip_header,tot_len,0,
    (struct sockaddr *)&toaddr,sizeof(toaddr));
    3) 在测试前端机上加载了ip_queue模块,并设置iptables规则:
    iptables -I OUTPUT -p tcp –sport 80 -j QUEUE
    复制的访问流量到达测试前端机上的nginx,nginx处理并返回结果,这个结果包在IP层会被前面所设置的iptables规则匹配发往目标(target)QUEUE。而QUEUE是由ip_queue模块实现。下一步这个匹配包就会被内核经过netlink socket发往用户空间的程序(在这是tcpcopy的服务端interception进程)。
    netlink socket是内核与用户进程之间的一种通信机制,是网络应用程序与内核通信的最常用的接口,可以用来配置网络的各个方面(比如包的过滤)。
    interception用如下方式创建netlink socket:
    int sock = socket(AF_NETLINK,SOCK_RAW,NETLINK_FIREWALL);
    NETLINK_FIREWALL协议有三种消息类型:IPQM_MODE,IPQM_PACKET,IPQM_VERDICT。
    内核通过一个IPQM_PACKET消息将刚才截获的返回结果包发送到interception,interception给内核发送一个IPQM_VERDICT消息告诉内核对这个包的裁决结果(DROP,ACCEPT,etc.)。tcpcopy通过这样的办法将测试前端机上nginx返回的结果截获丢弃,并由interception返回一个ip header。

tcpcopy 0.9 的使用

tcpcopy支持多种引流方式,常见的引流方式有 离线回放、在线直接引流、部分在线引流,下面我重点介绍以下在线实时引流的方式。

标准方式

软件安装:
从官网下载对应版本:https://github.com/wangbin579/tcpcopy
tcpcopy环境安装:
tar -zxvf tcpcopy-0.9.9.tar.gz 解压版本
cd tcpcopy-0.9.9
./configure --prefix=/opt/tcpcopy/
make
make install
服务端(intercept)操作命令:
设置iptables协议: $PORT=要设置的端口
sudo -S /root/.init_sys/iptables -I OUTPUT -p tcp --sport $PORT -j QUEUE
iptables简介:
Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。
-t 参数用来,内建的规则表有三个,分别是:nat、mangle 和 filter,当未指定规则表时,则一律视为是 filter。
INPUT(处理进入的包)、OUTPUT(处理本地生成的包)
-I:根据给出的规则序号向所选链中插入一条或更多规则
-p:指定协议类型 --sport:指定源端口(source port 源端口)
-j:指定动作类型 QUEUE 表示把这个包传递到用户空间。
查看端口设置是否成功:
sudo /root/.init_sys/iptables -L -n
启动服务器进程:
sudo -S ./intercept -d
查看进程:ps -ef|grep intercept
如果使用完tcpcopy后,就需要释放掉端口,这样才能被外部服务正常调用
释放iptables端口: $PORT=要释放的端口
sudo -S /root/.init_sys/iptables -D OUTPUT -p tcp --sport $PORT -j QUEUE
客户端(tcpcopy)操作命令:
sudo ./tcpcopy -d -x [客户端端口]- [服务器]: [服务器端口]
查看进程:ps -ef|grep tcpcopy
注:指定copy多少流量:
sudo ./tcpcopy -d -x [客户端端口]- [服务器]: [服务器端口] -n 0.5 表示copy0.5倍的流量

实操案例

准备工作
环境
机器环境:
线下服务器:192.168.118.38 线上客户端:10.252.118.13
准备2台服务器,并且拥有root权限,当然可以直接给work用户分配sudo 权限也是可以,因为tcpcopy主要用于底层处理数据,所以需要拥有高权限才可以进行操作
软件环境:
线上机器按照tcpopcy的客户端,用于进行copy流量(10.252.118.13)
线下机器安装intercept的服务端,用于接收流量(192.168.118.38 )
实际操作
将线上10.252.118.13机器8001端口50%的流量导入到线下192.168.118.38机器8002端口中
开启流量
<1> 先设置好接收流量端信息(192.168.118.38 )
设置iptables协议
sudo -S /root/.init_sys/iptables -I OUTPUT -p tcp --sport 8002 -j QUEUE
查看协议是否设置成功
sudo /root/.init_sys/iptables -L -n
启动服务端进程:
sudo -S ./intercept -d
查看进程:
ps -ef|grep intercept
<2> 再开启导流的客户端(10.252.118.13)
sudo ./tcpcopy -d -x 8001- 192.168.118.38:8002 -n 0.5
ps -ef|grep tcpcopy
效果:
服务器192.168.118.38机器的引流日志显示情况:

客户端10.252.118.13机器的引日志显示情况:

关闭流量:
<1> 先关闭导流的客户端(10.252.118.13)
sudo ./tcpcopy -q 或者直接kill对应进程即可
<2>再关闭接收流量的服务端(192.168.118.38 )
sudo -S ./intercept -q 或者直接kill对应进程即可
释放iptables:
sudo -S /root/.init_sys/iptables -D OUTPUT -p tcp --sport 8002 -j QUEUE
(你可以把服务器当做桶,客户端当做水龙头,导流当做接水,那么在开启时需要先把桶放好,然后再开水龙头,当接完水后,需要先把水龙头关掉,然后再拎桶,这样大家就能很好的理解这句话了)

常见问题

1、客户端和服务器端都需要root权限才可以执行,如果没有root权限,需要给work分配sudo权限
2、如果想要复制百分之五十的流量可以用-n 0.5去控制,默认情况是复制百分之百的流量
操作命令:sudo ./tcpcopy -d -x 端口-机器:端口-n 0.1
eg:sudo ./tcpcopy -d -x 16223-192.168.118.38:16223 -n 0.1
3、启动时需要先启动服务器,然后再启动客户端,结束的时候先关服务器,然后再管客户端
4、如果不复制流量请kill进程来结束本次操作
5、结束进程后,一定要在iptables里把服务器里对应的端口删除,否则就不能被访问
6、为了确保线上机器不受影响,建议在流量小的时间段,进行引流操作,如果需要大量流量,建议先引入少部分,然后再往上加流量,不建议一次复制大量流量

如果想要详细了解tcpcopy的工作原理的详细内容,可以参考tcpcopy作者的博客内容
https://blog.csdn.net/wangbin579/article/details/8949315

性能测试之tcpcopy引流工具介绍相关推荐

  1. HTTP引流工具Gor快速入门

    0.背景 校验系统的正确性和可靠性时,仅靠用例场景无法覆盖全生产环境下的所有场景,需要一套引流工具,在系统正式上线前,用线上的请求测试待上线系统,在正常请求下,是否有报错:在数倍请求下,系统的性能瓶颈 ...

  2. linux网络引流工具,gor 引流快速入门

    0.背景 校验系统的正确性和可靠性时,仅靠用例场景无法覆盖全生产环境下的所有场景,需要一套引流工具,在系统正式上线前,用线上的请求测试待上线系统,在正常请求下,是否有报错:在数倍请求下,系统的性能瓶颈 ...

  3. 独立站运营指南:引流工具和引流方法都有哪些?

    近几年,独立站越来越频繁地被人们提起,甚至可以说跨境电商人都不会不知道独立站地存在.那独立站应该如何运营呢? 卖家们如何利用好各平台的优势做好引流以达到更高的转化率?类似这样的问题也成为了不少跨境电商 ...

  4. 私域引流工具及场景落地方法

    首先聊一下流量的来源,市场上现有的引流可以按照流量来源分为公域引流和私域引流.公域引流大致可以分为信息流引流.平台电商引流.媒体平台引流.直播引流.线下门店引流.私域引流大致可以分为公众号引流.个人号 ...

  5. 微信群如何引流最快?微信群裂变引流工具首选这款

    微信群如何引流最快?这些方法和渠道是必须要掌握的. 自媒体引流.这对于添加微信好友是比较常见的一种方式,在自媒体上去发表相应的文章,吸引到更多的人来进行关注,然后把自己的微信号或者微信二维码添加进去, ...

  6. 站长引流工具 最新UI默笙站长工具箱V2.0 带后台

    介绍 站长引流工具该版本已支持用户自行上传和在线更新功能. 前段两套模板支持以及后台bt响应式的后台框架. 该程序已支持后台修改工具首页内容,用户无需在服务器/ftp中修改 安装说明: 上传至空间,访 ...

  7. tcpcopy mysql_利用tcpcopy引流过程

    tcpcopy是一个tcp流量复制工具,当前还支持udp和mysql流量的复制. 目的: 将机器10.24.110.21的5000端口流量引流到机器10.23.25.11的5000端口. 示例:将10 ...

  8. 怎么做好直播引流?直播引流方案介绍

    随着时代的新旧更替,不少行业也被随之替换,新兴行业也就此出现,其中就包括了直播行业.在直播队伍之中除了个人还有企业,所以说竞争是十分激烈的,要想从中占据优势,那么必须要有的操作就是引流.虽然很多人对于 ...

  9. 运营干货分享 | 公众号运营需要具备什么能力以及引流工具渠道吗?

    我是做教育行业的,公众号主要是用于跟学员的互动.运营一年,粉丝终于到了15万(此处要感叹下非常不容易呀)分享下我的经验,希望会对大家有帮助. 使用的工具: 编辑工具:秀米-秀米 XIUMI 社区工具: ...

最新文章

  1. Python实例介绍正则化贪心森林算法(附代码)
  2. 《深入理解C++11:C++ 11新特性解析与应用》——2.4 宏__cplusplus
  3. 有感软件安装称呼的变化
  4. 分类算法支持向量机(SVM) 简介与入门
  5. C++笔记-初步窥探全局函数在Debug、Release的地址
  6. Kibana未授权访问漏洞记录(CVE-2019-7609,Kibana的RCE,原型链污染,端口:5601)
  7. Kubernetes支持有状态服务的部署
  8. html页面右下角添加js广告,JS右下角悬浮广告代码的简单示例
  9. 从假装在腾讯,到真的360 —— 一个应届准PM的独白(面经干货)
  10. codevs 1535 封锁阳光大学
  11. 【产品经理】 产品经理进阶之路(十一):怎么看微信的公众号和百度的直达号,哪个更有优势
  12. EasyUI TreeGrid各行调整上下位置
  13. 汉字与拼音互转的工具类
  14. Excel数据透视表的使用
  15. MySQL学习笔记(1)——高可用组复制
  16. noi字符串11:潜伏者题解
  17. 数独游戏思路html,数独游戏的前端实现
  18. Win2000、NT 环境真正 RPL 无盘 WIN98 安装指南(转)
  19. 【giegie哪有什么坏心思呢,不过是想带你白嫖网红爆款时间屏保呀!】Fliqlo屏幕保护程序(文末有下载链接呦)
  20. android原生浏览器6,Android手机实用选择 欧朋浏览器6.7版评测

热门文章

  1. 大专考试计算机英语题目,专科英语入学考试题
  2. HBase初识之学生心得总结
  3. android 打赏功能,微信公号赞赏功能恢复:可直接收打赏 iOS安卓均可用
  4. html canvas自适应屏幕,Unity canvas 和 canvas元素自适应全屏
  5. 手机文档怎样通过计算机打印,手机里的文件怎么快速打印出来?
  6. 计算机一级西溪2,我的西溪研学日记(二)——不一样的课堂,不一样的精彩...
  7. 李宏毅老师《机器学习》课程笔记-4.2 Batch Normalization
  8. matlab 电力电子元件对应名称,电力电子与MATLAB应用技术
  9. k8s dashboard安装
  10. 无尽长廊(Gallery)