`
san_yun
  • 浏览: 2693905 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

利用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,发送:

1
2
3
4
5
6
7
8
9
10
11
12
13
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消息报告裁决结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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拷贝线上流量作模拟压测已成为我们日常开发上线流程中的一项内容。

六、附录

项目主页:http://code.google.com/p/tcpcopy/

Sock_raw:http://sock-raw.org/papers/sock_raw

Netlink:http://smacked.org/docs/netlink.pdf

相关主题:http://blog.csdn.net/wangbin579/article/category/926096/1

代码svn地址:http://tcpcopy.googlecode.com/svn/trunk

分享到:
评论

相关推荐

    利用TCPCopy引流做模拟在线测试调研报告

    TCPCopy是一款强大的在线压力测试工具,主要用于模拟真实线上环境,帮助开发者在程序未正式上线前发现潜在的性能问题和bug。与传统压力测试工具,如abench相比,TCPCopy的优势在于其实时性和真实性。它能近乎无损地...

    阿里线上压测与容量规划实践

    - 工具:tcpcopy, btrace, nginx post action等。 - 场景:适用于系统支持重复写入且对写请求响应进行了特殊处理的情况。 - 注意事项:确保写请求不违反唯一性约束。 3. **请求引流** - 工具:Apache mod_jk, ...

    大流量稳定交易系统

    - **测试工具**:利用诸如`tcpcopy`、专用压测工具等手段进行压力测试。 - **恶意流量模拟**:模拟异常或恶意流量,测试系统的健壮性和安全性。 #### 八、系统案例分析—实时价格 - **特点**: - **纯动态特性**...

    SNS单模无芯光纤仿真与传感器结构特性分析——基于Rsoft beamprop模块

    内容概要:本文主要探讨了SNS单模无芯光纤的仿真分析及其在通信和传感领域的应用潜力。首先介绍了模间干涉仿真的重要性,利用Rsoft beamprop模块模拟不同模式光在光纤中的传播情况,进而分析光纤的传输性能和模式特性。接着讨论了光纤传输特性的仿真,包括损耗、色散和模式耦合等参数的评估。随后,文章分析了光纤的结构特性,如折射率分布、包层和纤芯直径对性能的影响,并探讨了镀膜技术对光纤性能的提升作用。最后,进行了变形仿真分析,研究外部因素导致的光纤变形对其性能的影响。通过这些分析,为优化光纤设计提供了理论依据。 适合人群:从事光纤通信、光学工程及相关领域的研究人员和技术人员。 使用场景及目标:适用于需要深入了解SNS单模无芯光纤特性和优化设计的研究项目,旨在提高光纤性能并拓展其应用场景。 其他说明:本文不仅提供了详细的仿真方法和技术细节,还对未来的发展方向进行了展望,强调了SNS单模无芯光纤在未来通信和传感领域的重要地位。

    发那科USM通讯程序socket-rece

    发那科USM通讯程序socket-set

    嵌入式八股文面试题库资料知识宝典-WIFI.zip

    嵌入式八股文面试题库资料知识宝典-WIFI.zip

    JS+HTML源码与image

    源码与image

    物流行业车辆路径优化:基于遗传算法和其他优化算法的MATLAB实现及应用

    内容概要:本文详细探讨了物流行业中路径规划与车辆路径优化(VRP)的问题,特别是针对冷链物流、带时间窗的车辆路径优化(VRPTW)、考虑充电桩的车辆路径优化(EVRP)以及多配送中心情况下的路径优化。文中不仅介绍了遗传算法、蚁群算法、粒子群算法等多种优化算法的理论背景,还提供了完整的MATLAB代码及注释,帮助读者理解这些算法的具体实现。此外,文章还讨论了如何通过MATLAB处理大量数据和复杂计算,以得出最优的路径方案。 适合人群:从事物流行业的研究人员和技术人员,尤其是对路径优化感兴趣的开发者和工程师。 使用场景及目标:适用于需要优化车辆路径的企业和个人,旨在提高配送效率、降低成本、确保按时交付货物。通过学习本文提供的算法和代码,读者可以在实际工作中应用这些优化方法,提升物流系统的性能。 其他说明:为了更好地理解和应用这些算法,建议读者参考相关文献和教程进行深入学习。同时,实际应用中还需根据具体情况进行参数调整和优化。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_8.doc.zip

    基于灰狼优化算法的城市路径规划Matlab实现——解决TSP问题

    内容概要:本文介绍了基于灰狼优化算法(GWO)的城市路径规划优化问题(TSP),并通过Matlab实现了该算法。文章详细解释了GWO算法的工作原理,包括寻找猎物、围捕猎物和攻击猎物三个阶段,并提供了具体的代码示例。通过不断迭代优化路径,最终得到最优的城市路径规划方案。与传统TSP求解方法相比,GWO算法具有更好的全局搜索能力和较快的收敛速度,适用于复杂的城市环境。尽管如此,算法在面对大量城市节点时仍面临运算时间和参数设置的挑战。 适合人群:对路径规划、优化算法感兴趣的科研人员、学生以及从事交通规划的专业人士。 使用场景及目标:①研究和开发高效的路径规划算法;②优化城市交通系统,提升出行效率;③探索人工智能在交通领域的应用。 其他说明:文中提到的代码可以作为学习和研究的基础,但实际应用中需要根据具体情况调整算法参数和优化策略。

    嵌入式八股文面试题库资料知识宝典-Intel3.zip

    嵌入式八股文面试题库资料知识宝典-Intel3.zip

    嵌入式八股文面试题库资料知识宝典-2019京东C++.zip

    嵌入式八股文面试题库资料知识宝典-2019京东C++.zip

    嵌入式八股文面试题库资料知识宝典-北京光桥科技有限公司面试题.zip

    嵌入式八股文面试题库资料知识宝典-北京光桥科技有限公司面试题.zip

    物理学领域十字形声子晶体的能带与传输特性研究及应用

    内容概要:本文详细探讨了十字形声子晶体的能带结构和传输特性。首先介绍了声子晶体作为新型周期性结构在物理学和工程学中的重要地位,特别是十字形声子晶体的独特结构特点。接着从散射体的形状、大小、排列周期等方面分析了其对能带结构的影响,并通过理论计算和仿真获得了能带图。随后讨论了十字形声子晶体的传输特性,即它对声波的调控能力,包括传播速度、模式和能量分布的变化。最后通过大量实验和仿真验证了理论分析的正确性,并得出结论指出散射体的材料、形状和排列方式对其性能有重大影响。 适合人群:从事物理学、材料科学、声学等相关领域的研究人员和技术人员。 使用场景及目标:适用于希望深入了解声子晶体尤其是十字形声子晶体能带与传输特性的科研工作者,旨在为相关领域的创新和发展提供理论支持和技术指导。 其他说明:文中还对未来的研究方向进行了展望,强调了声子晶体在未来多个领域的潜在应用价值。

    嵌入式系统开发_USB主机控制器_Arduino兼容开源硬件_基于Mega32U4和MAX3421E芯片的USB设备扩展开发板_支持多种USB外设接入与控制的通用型嵌入式开发平台_.zip

    嵌入式系统开发_USB主机控制器_Arduino兼容开源硬件_基于Mega32U4和MAX3421E芯片的USB设备扩展开发板_支持多种USB外设接入与控制的通用型嵌入式开发平台_

    e2b8a-main.zip

    e2b8a-main.zip

    少儿编程scratch项目源代码文件案例素材-火柴人跑酷(2).zip

    少儿编程scratch项目源代码文件案例素材-火柴人跑酷(2).zip

    【HarmonyOS分布式技术】远程启动子系统详解:跨设备无缝启动与智能协同的应用场景及未来展望

    内容概要:本文详细介绍了HarmonyOS分布式远程启动子系统,该系统作为HarmonyOS的重要组成部分,旨在打破设备间的界限,实现跨设备无缝启动、智能设备选择和数据同步与连续性等功能。通过分布式软总线和分布式数据管理技术,它能够快速、稳定地实现设备间的通信和数据同步,为用户提供便捷的操作体验。文章还探讨了该系统在智能家居、智能办公和教育等领域的应用场景,展示了其在提升效率和用户体验方面的巨大潜力。最后,文章展望了该系统的未来发展,强调其在技术优化和应用场景拓展上的无限可能性。 适合人群:对HarmonyOS及其分布式技术感兴趣的用户、开发者和行业从业者。 使用场景及目标:①理解HarmonyOS分布式远程启动子系统的工作原理和技术细节;②探索该系统在智能家居、智能办公和教育等领域的具体应用场景;③了解该系统为开发者提供的开发优势和实践要点。 其他说明:本文不仅介绍了HarmonyOS分布式远程启动子系统的核心技术和应用场景,还展望了其未来的发展方向。通过阅读本文,用户可以全面了解该系统如何通过技术创新提升设备间的协同能力和用户体验,为智能生活带来新的变革。

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_1.zip

    嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_1.zip

    少儿编程scratch项目源代码文件案例素材-激光反弹.zip

    少儿编程scratch项目源代码文件案例素材-激光反弹.zip

Global site tag (gtag.js) - Google Analytics