热门IT资讯网

浅谈压测之一Tcpcopy流量导入

发表于:2024-11-25 作者:热门IT资讯网编辑
编辑最后更新 2024年11月25日,很长时间不更新博客了。最近做一些压力测试(流量实时导入与离线回放)、内网源(含全部centos、EPEL)、自制RPM包等事情了。个人有点浅显的理解,如各位看官对以上感兴趣,留言告诉我,后面会选择性更

很长时间不更新博客了。最近做一些压力测试(流量实时导入与离线回放)、内网源(含全部centos、EPEL)、自制RPM包等事情了。个人有点浅显的理解,如各位看官对以上感兴趣,留言告诉我,后面会选择性更新出来,相信对各位都是比较有用的。

本文用较短篇幅介绍Tcpcopy的流量导入,后续会再更新一篇离线模式使用。

一个完善的网站、系统,上线前必须经过完备的压力测试,这是基本的质量保证。在测试过程中,我们使用过 AB、Loadrunner效果都不理想,无法精确还原用户请求。后来我们使用了网易开源的Tcpcopy,还原了真实流量,以及离线流量按需回放等功能,对新业务的上线起了至关重要的作用。

简介:

Tcpcopy是一种请求复制(所有基于tcp的packets)工具,可以把在线流量导入到测试系统中去。

曾经应用于网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的很多问题。

现在此工具已经广泛应用于各大互联网公司。tcpcopy鼻祖王波同学(@wbo65),是他在这方面进行了最初探索。(2009年设计并代码实现,仅仅300多行代码就支撑了网易广告投放系统的最初开发,上线零失误,解决上线前数百个问题),当然这个最简单的版本应用范围非常有限,王斌(@wangbin579)在2010年末在这个架构上面进行了深度改造,扩展到1000多行代码)。最新版本1.0.0。

功能:

1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测

试工具真实地多),也可以提前发现一些bug

2)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开

发者有信心上线

3)流量放大功能,可以利用多种手段构造无限在线压力,满足中小网站压力测试要求

架构:

1.0.0版本架构如下图,

上述架构,也即最新架构,是为了极限测试的目的而设计的,把intercept的工作从测试服务器(test server)中offload出来,放到另外一台独立的辅助服务器(assistant server,原则上一定要用同网段的一台闲置的服务器来充当辅助服务器)上面进行截获响应包,而且把原先从IP层捕获响应数据包的工作转移到从数据链路层抓响应包,这些改变大大降低了对测试机器的各种干扰(除了路由设置,其它已经没有影响了),而且大大扩大了捕获响应包的能力。当然这种测试也更加真实。

部署:

此环境准备三台机器,假设我们需要导入Apache的80口流量,Apache安装过程省略。如对上图理解有困难,我画了一张简明草图方便你理解

一、正式节点 1.1.1.1 安装httpd tcpcopy

二、测试节点 1.1.1.2 安装httpd

三、辅助节点 1.1.1.3 安装intercept

安装tcpcopycd /tmpwget https://github.com/session-replay-tools/tcpcopy/archive/1.0.0.tar.gztar -zxvf 1.0.0.tar.gz./configure --prefix=/usr/local/tcpcopymakemake install vi /etc/profile.d/tcpcopy.sh#加入下面一行export PATH=$PATH:/usr/local/tcpcopy/sbinsource /etc/profile.d/tcpcopy.sh安装interceptyum install libpcap-devel cd /tmpwget https://github.com/session-replay-tools/intercept/archive/1.0.0.tar.gztar -zxvf 1.0.0.tar.gz./configure --prefix=/usr/local/interceptmakemake install vi /etc/profile.d/intercept.sh#加入下面一行export PATH=$PATH:/usr/local/intercept/sbinsource /etc/profile.d/intercept.sh#正式环境中运行,将外部访客的IP转换为192.168.10.0/24,方便测试机设置路由tcpcopy -x 80-1.1.1.2:80 -s 1.1.1.3 -c 192.168.10.x &#测试环境中添加路由route add -net 192.168.10.0 netmask 255.255.255.0 gw 1.1.1.3#辅助环境中运行,拦截80请求并丢弃intercept -i eth0 -F 'tcp and src port 80' -d

效果:

用浏览器访问真实节点时,查看测试节点access_log是否滚动。

总结:

再次感谢Tcpcopy的开源作者(@wangbin579)的无私奉献。如有问题可留言回复,希望能帮到你。

0