利用 tcpcopy 引流做模拟在线测试

一、工具介绍

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

Tcpcopy是由网易技术部于2011年9月开源的一个项目,现在已经更新到0.4版本。

与传统的压力测试工具(如:abench)相比,tcpcopy的最大优势在于其实时及真实性,除了少量的丢包,完全拷贝线上流量到测试机器,真实的模拟线上流量的变化规律。

二、Tcpcopy的原理

1.流程

现在以nginx作为前端说明tcpcopy的原理:

上图中左边是线上前端机,右边是测试前端机。线上前端机开启tcpcopy客户端(tcpcopy进程),测试前端机开启tcpcopy服务端(interception进程),且两台机器上都启动了nginx服务。

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

① 一个访问到达线上前端机;

② socket包在ip层被拷贝了一份传给tcpcopy进程;

③ tcpcopy修改包的目的及源地址,发给测试前端机;

④ 拷贝的包到达测试前端机;

⑤ 测试前端机的nginx处理访问,并返回结果;

⑥ 返回结果在ip层被截获、丢弃,由intercpetion拷贝返回结果的ip header返回;

⑦ ip header被发送给线上前端机的tcpcopy进程。

1.代码分析

1) 首先,在链路层或者IP层,在把包交到上一层之前,系统会检查有没进程创建了socket(AF_PACKET,SOCK_DGRAM,…) 或socket(AF_INET,SOCK_RAW,…)等类型的套接字(即原始套接字sock_raw),如果有,这个包就会被复制一份并发送到这个 socket的缓冲区。tcpcopy就是通过这种方式来复制访问流量的。上述的两种抓包方式,前者工作在数据链路层,后者工作在IP层。在 tcpcopy中不同版本所使用的抓包函数不同,在0.3版本中是:

int sock = socket(AF_PACKET,SOCK_RAW,htons(ETH_P_IP));

而在0.4版本中,用的是:

int sock = socket(AF_INET,SOCK_RAW,IPPROTO_TCP);

以上两个函数分别工作在链路层和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.相应代码实现如下:

拷贝结果包的ip header,发送:

struct receiver_msg_st msg;
...
memset(&msg,0,sizeof(struct receiver_msg_st));
memcpy((void *) &(msg.ip_header),ip_header,sizeof(struct iphdr));
memcpy((void *) &(msg.tcp_header),tcp_header,sizeof(struct tcphdr));
...
send(sock,(const void *)msg,sizeof(struct receiver_msg_st),0);

interception向内核发送IPQM_VERDICT消息报告裁决结果:

struct nlmsghdr* nl_header=(struct nlmsghdr*)buffer;
struct ipq_verdict_msg *ver_data = NULL;
struct sockaddr_nl addr;
nl_header->nlmsg_type=IPQM_VERDICT;
nl_header->nlmsg_len=NLMSG_LENGTH(sizeof(struct ipq_verdict_msg));
nl_header->nlmsg_flags=(NLM_F_REQUEST);
nl_header->nlmsg_pid=getpid();
nl_header->nlmsg_seq=seq++;
ver_data=(struct ipq_verdict_msg *)NLMSG_DATA(nl_header);
ver_data->value=NF_DROP; /*如果要accept这个包,则设为NF_ACCEPT)*/
 ver_data->id=packet_id;
memset(&addr,0,sizeof(addr));
addr.nl_family = AF_NETLINK;
addr.nl_pid = 0;
addr.nl_groups = 0;
sendto(firewall_sock,(void *)nl_header,nl_header->nlmsg_len,0,
(struct sockaddr *)&addr,sizeof(struct sockaddr_nl));

内核接收到这个包后将packet_id这个包drop或accept。在后文中可以看到从0.4版本开始的tcpcopy利用这个特点保留了一个允许访问的ip列表,因为默认情况下访问测试前端机上nginx服务所得到的结果会在ip层被drop掉,造成在80端口上无法访问nginx。有了这个允许ip列表,即使是刷了iptables规则、起了interception进程,在某些机器上也是可以正常访问测试前端机上的nginx服务的。

三、操作方法

下载地址:http://tcpcopy.googlecode.com/files/tcpcopy-0.3.3.tar.gz,下载tcpcopy源码包后解压,执行常规的./configure;make;make install三部曲即可。

假如有两台机器:

机器A:线上前端机,ip:61.135.xxx.1;

机器B:测试前端机,ip:61.135.xxx.2;

两台机器上都起了nginx服务,操作者在两台机器上都需有sudo权限。

操作步骤:

1. 在B依次执行,

1) 加载ip_queue模块,modprobe ip_queue;

2) 配置iptables规则,sudo iptables -t filter -I OUTPUT -p tcp –sport 80 -j QUEUE;

3) 启动tcpcopy服务端,sudo ./interception & ;

2. 在A上执行,

启动tcpcopy客户端,sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80 &;

如果在A上看到“I am booted”,则表示操作成功,tcpcopy已经开始工作,可以查看一下机器B上nginx的日志确认。

四、高级用法

1. 级联

设有线上前端机一台命名A,测试前端机若干B,C,D,……利用tcpcopy可以将A上的访问流量拷贝到B,B拷贝到C,C拷贝到D,……这样就将一份流量放大了多倍,可以用来测试引擎的极限承受能力。

2. 同一tcpcopy实例内多重复制

从0.4版开始,tcpcopy支持在同一个客户端实例复制多份请求到同一个服务端,启动的方式如下(比如要复制2份,使用-n这个选项来控制要复制的份数),

sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80;

sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80 -n 1;

sudo ./tcpcopy 61.135.xxx.1 80 61.135.xxx.2 80 -n 2;

3. 服务端允许访问ip列表

由于配置了iptables规则,使用tcp协议且源端口号为80的包都会被匹配放到目标QUEUE去,进而被drop掉,因此这个时候测试前端机上的nginx服务是不可访问的。从0.4版本开始,可以指定一个允许访问ip列表,在列表中的机器上是可以访问测试前端机上的nginx服务的。假如要添加61.135.xxx.3,61.135.xxx.4到允许ip列表,启动interception时使用如下方式:

sudo ./interception 61.135.xxx.3:61.135.xxx.4;

五、tcpcopy在一淘的应用

一淘引擎在今年2月份时有一次重大的更新,在上线之前,利用tcpcopy把所有前端机的流量拷贝到新的demo前端机上,进行在线模拟实验。引流示例如下图:

所有线上前端机都开启tcpcopy客户端,由于一直报”Message too long”(这是由于packets长度超过1500造成,每分钟差不多有50个)刷屏,所以将stderror重定向,

sudo ./tcpcopy ipA 80 ipB 80 2>/dev/null &

在测试前端机上开启tcpcopy服务端程序interception,并设置iptables规则。

压了大约有一个星期,期间观察qps,load等各项指标是否正常。新引擎单个集群一天的平均qps大约是110,峰值大约240。实验结果显示的包丢失率大约是(1822213-1797242)/1822213=1.37%. 后来进一步将多个线上前端机的流量引到一个测试前端,测试新引擎的单集群极限服务能力,qps能达到1000以上, latency大约40ms,达到了上线要求。

Tcpcopy客户端和服务端本身占用的资源较少,不影响在线服务。

13991 root 20 0 160m 77m 888 R 7.7 0.3 71:26.24 tcpcopy

7723 root 15 0 42592 38m 324 S 5.8 0.2 12:14.83 interception

%cpu分别占7.7%和5.8%,物理内存占用分别是77m和38m.

由于几乎完全模拟了线上环境,我们对于新引擎上线更有信心,最终上线圆满成功,实现平稳过渡。现在利用tcpcopy拷贝线上流量作模拟压测已成为我们日常开发上线流程中的一项内容。

原文地址:https://www.cnblogs.com/xqtesting/p/8452198.html

时间: 2024-09-29 06:42:46

利用 tcpcopy 引流做模拟在线测试的相关文章

利用电子书引流日入3000的方法论

我们知道,消费者都有一个共性,就是喜欢贪小便宜,所以,这也是为什么现在很多商家越来越多的"附送赠品"的原因. 同时,针对这样的现象,我们可以关联思考到我们互联网营销,是不是给予足够的"好处",就能让你的潜在客户变成你的消费客户?答案是肯定的,下面我们就来实操验证一下. 那么,什么样的"好处"才能引起消费者的"上钩"呢?当然就是"把价格降到最低"的价格,又称"免费赠品"."免费赠

网站引流

关于网站引流: 做博客推广,可以说,最关键也是最困难的就是网站引流.网站引流主要有两种方法:SEO+推广渠道. SEO可以通过优化跟产品相关的一些关键词,比如说“女性护肤品都有什么牌子”.“护肤品怎么选择”.“哪些祛痘产品好”等长尾关键词,提升排名,用户一搜索这些词,就能看到你的博客推荐.seo涉及的内容比较多,大家可以多多通过网络学习,这方面的知识有很多,慢慢积累. 至于推广渠道可以说的实在太多了,网站推广一搜就一堆,比如门户网站,百度贴吧,19楼论坛时尚版块等女性比较多的论坛发帖引流.其实引

基于TCPCopy的Dubbo服务引流工具-DubboCopy

TCPCopy顾名思义,就是一个可以将tcp流量复制的工具(其实也可以复制UDP).有了这样一个工具,我们就可以真实的复制线上流量,然后将这些流量复制到我们的测试服务器上.这样就可以很容易模拟线上真实用户的访问,做一些功能上的,性能上的测试.而且经过实际测试发现TCPCopy对线上机器的资源消耗也是极低的. 借助这么一个工具,我们可以比较容易的实现一些比较有意思的功能.比如我们现在我们的应用都已经服务化了,那么我们在一次需求变更之后,或者一次性能优化之后,我们如何最快的知道该服务功能是否正确,性

揭秘朋友圈利用IP热点引流的简单粗暴骗局

暴利的东西往往从免费开始.相信很多朋友在微信上面都会收到这样的信息: 我是一个女大学生,因为家里穷,凑不齐学费和生活费,现在没办法,只能拍一些自己的果照视频,希望大哥看了以后随便给点心意,谢谢. 然后后面就付了一个带着口罩的美女不可描述的视频,还有一个近景照片.乍一看,还以为是一个女大学生自强不息的励志故事. 可谁知道背后是团伙作案,一晚上净挣大好几千的利润. 一个好几千好友的微信到点群发,配合着脚本来营销,一晚上操作十来个号,覆盖人群高达几万人.免费的东西也总有人掏钱.同样的视频和照片摊薄在每

分享如何利用热门电视剧关键词大量引流

今天教大家如何利用热门电视剧去吸引流量,但是在说这个之前我们的说回关于SEO的一些事情.SEO是一门易学难精的职业技能,要说的简单,我可以洋洋洒洒写个上W字没问题;可是要说困难,其实也就是"站内优化,站外优化"这8个字就可以概括.但是最重要的核心,本人觉得是关键词,选好了关键词就是事半功倍.好了,回到我们说的人们电视剧. 首先我们要明确的知道,电视剧有分两种,一种是网剧,一种是可以在各大电视台播放的电视剧.知道这点很重要,网剧和电视剧查看数据的方式不一样,分析方法也并不一样. 跟着一步

几分钟教你做个原创视频,赚钱引流两不误

现在原创视频不可谓不火.未来几年,短视频创业.营销.引流.都蕴藏着巨大的市场机会.分享一些小套路.赚钱,引流必备小技巧. 举牌照大家都见过,前段时间非洲儿童的举牌照可谓火了一把,有些人靠这个赚的盆钵满盈. 但有些明星.美女的举牌照,虽然大家都见过,一般微商用的比较多,不知道的以为是某某大品牌微商代理真的把人请过来做广告. 这种图片微商.广告.成交文案.装逼等各个领域都可以用的到. 制作方法: 网上有许多的PSD源码模板,大家去下载即可,也可以到某宝去购买.然后用Photoshop软件直接修改文字

微商引流活动礼品单发货怎么做?

礼品活动引流,顾名思义,就是通过一些礼品活动,获得者帮助转发带有引流人信息的相关朋友圈,短时间内达到人脉扩散,实现引流的一种方式. 礼品引流的方式常见的有两种: 1.付邮免费领产品: 2.超优惠价格包邮购买领取. 做礼品活动引流,重在激活朋友圈僵尸粉,建立第一层良好信任,故服务也就显得至关重要,所以选定的礼品应从大众喜欢的入手,把握物超所值的特点.整个礼品活动引流时间大概在五到六天,下面为大家讲述一下成功的活动礼品引流应做的几项工作: 1.礼品选定 礼品应该是大众喜欢的,物超所值的,受众群体较为

性能测试之线上引流测试--让性能测试更真实更丰富

为什么要做引流测试 目前为止大部分的测试是在测试环境下,通过模拟用户的行为来对系统进行验证,包括功能以及性能.在这个过程中,你可能会遇到以下问题: 用户访问行为比较复杂,模拟很难和用户行为一致,模拟不够真实; 线下模拟场景有限,会出现业务覆盖不全的情况.引流测试就是为了解决以上问题,通过把线上的真实流量复制到线下环境,解决测试环境模拟不够真实,或覆盖不够全面的问题. 引流的做法 目前不少公司对引流测试进行了实践,主要有以下4种引流方式: 以上几种办法各有利弊,有的是需要自己开发相应的工具来支持.

微商推广引流秘笈—— 8 个高效的引流策略

不管做什么项目,销售任何产品,你都会发现推广是极其重要的,只有推广才能开发更多新客户,才能卖出更多产品,才能有更多利润. 这是永恒不变的商业定律,任何一个成功的微商,他都非常重视推广.现在我总结了 8 个高效的推广引流方法策略,只要你去执行,去实践,我向你保证,就一定会产生效果,就会有潜在客户主动找上门. 为什么我敢做这样的保证? 因为我本身就是一个网络创业者,拥有 10 年的网络营销经验,并且每天都关注网络营销最新技术策略,所总结的这 8 个推广引流策略,都是经过实践验证有效的,并且已经帮助无