tcpcopy

软件名称: tcpcopy
授权方式: GPL
操作系统: Linux,i386,x86_64
软件大小: 397K
最新更新: 2012-09-22 16:51:03
软件简介:

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

目前此工具已经广泛应用于各大互联网公司。

TCPCopy七大功能: 
1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测
试工具真实地多),也可以提前发现一些bug
2)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开
发者有信心上线
3)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验
4)流量放大功能,可以利用多种手段构造无限在线压力,满足中小网站压力测试要求
5)利用TCPCopy转发传统压力测试工具发出的请求,可以增加网络延迟,使其压力测试更加真实
6)热备份
7)实战演习(架构师必备)

特点: 
1)实时
2)效果真实
3)低负载,不影响在线
4)操作简单
5)分布式
6)零成本
7)意义非凡

使用方法: 
TCPCopy分为TCPCopy client和TCPCopy server。
其中TCPCopy client运行在在线服务器上面,用来捕获在线请求数据包;TCPCopy server
(监听端口为36524)运行在测试机器上面,在测试服务器的响应包丢弃之前截获测试服务器
的响应包,并通过TCPCopy client和TCPCopy server之间的tcp连接传递响应包的tcp和ip
头部信息给TCPCopy client,以完成TCP交互。

使用方法如下:
TCPCopy server (root用户执行)
1)启动内核模块ip_queue (modprobe ip_queue)
2)设置要截获的端口,并且设置对output截获
     iptables -I OUTPUT -p tcp --sport port -j QUEUE 
3)./interception (<0.5) or ./intercept (>=0.5)
注意(如果已经启动ip_queue和已经设置iptables,只需要运行第3项;测试完以后要记得删除上面设置的iptables条目)

TCPCopy client   (root用户执行)
tcpcopy 0.5之前版本:
./tcpcopy 本地ip地址1[:本地ip地址2:…]  本地port  远程ip地址 远程port
注意(本地ip地址列表其实就是客户端所认为的服务器ip地址,如果前面有lvs,一般就是lvs的虚拟ip地址)

tcpcopy 0.5及其以后版本
./tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口

测试举例: 
假设13,14是在线应用服务器,148是测试服务器(148配置和13差不多),
本地端口和远程端口都是12321(端口12321是我们的一个应用,类似于memcached应用)。
我们的目的就是为了确认目前在线服务器能否承受目前两倍的压力。

我们利用TCPCopy 0.4进行测试:
    目标测试服务器(148)
       # modprobe ip_queue (if not run up)
       # iptables -I OUTPUT -p tcp --sport 12321 -j QUEUE (if not set)
       # ./interception 
    在线服务器(13):
       # ./tcpcopy xx.xx.xx.13 12321 xx.xx.xx.148 12321  
    在线服务器(14):
       # ./tcpcopy xx.xx.xx.14 12321 xx.xx.xx.148 12321

13 cpu:
11124 adrun 15 0 193m 146m 744 S 18.6 7.3 495:31.56 asyn_server
11281 root 15 0 65144 40m 1076 S 12.3 2.0 0:47.89 tcpcopy

14 cpu:
16855 adrun 15 0 98.7m 55m 744 S 21.6 2.7 487:49.51 asyn_server
16429 root 15 0 41156 17m 1076 S 14.0 0.9 0:33.63 tcpcopy

148 cpu :
25609 root 15 0 76892 59m 764 S 49.6 2.9 63:03.14 asyn_server
20184 root 15 0 5624 4232 292 S 17.0 0.2 0:52.82 interception

13记录: grep  Tue 11:08  access_0913_11.log |wc -l :89316,每秒处理1489次请求

14记录: grep  Tue 11:08  access_0913_11.log |wc -l :89309,每秒处理1488次请求

148记录: grep  Tue 11:08  access_0913_11.log |wc -l :178175,每秒处理2969次请求

请求丢失率为:(89316+89309-178175)/(89316+89309)=0.25%

从上面可以看出一台在线服务器能够承受目前压力的两倍。
我们来看负载情况:
TCPCopy client自身负载占到12.3%和14%,TCPCopy server占到17%,从负载来看,均不高。
内存也占得不多。

注意事项(源代码转移到了github,敬请注意): 
1)Linux平台,内核2.6+,需要支持netlink机制
2)TCPCopy中的tcpcopy和interception or intercept程序运行需要root权限
3)interception(intercept 0.5+)在同一台机器只需要运行一个实例,多个实例不支持
4)TCPCopy client需要连接测试服务器的36524端口,所以要对外开放36524端口
5)TCPCopy由于依赖于抓包函数,压力大的时候,抓包函数本身不可靠,所以会丢包,进而丢失请求
6)由于interception(intercept 0.5+)程序密切跟ip queue内核模块相关,
所以当压力很大的时候请求丢失率很高,需要优化sysctl系统参数才能达到好的效果
(通过cat /proc/net/ip_queue,查看ip queue运行情况,如果Queue dropped的数值
不断增大,则需要修改ip_queue_maxlen参数,比如echo 4096 > /proc/sys/net/ipv4/ip_queue_maxlen;
如果Netlink droppedde的数值不断增大,修改net.core.rmem_max和net.core.wmem_max
参数,比如sysctl -w net.core.rmem_max=16777216和sysctl -w net.core.wmem_max=16777216)
7)对于0.5版本以下的版本,复制同一台机器进程之间的请求,也即Local Requests,
如果出现Message too long,请设置lo MTU不超过1500,并且在配置文件中不要
设置127.0.0.1地址,要设置内网或者外网地址;0.5版本没有此问题
8)对于0.5版本以下的版本,TCP segmentation offloading相关问题(要注意网卡tso和gro
要关闭)如果tcpcopy所抓的数据包大小超过MTU(比如出现Message too long),那么
由于raw socket output的原因,需要你改变在线设置,比如:ethtool -K eth1 tso off ; 
ethtool -K eth1 gro off 
9)对于0.5版本及其以上版本,如果要复制127.0.0.1发出的请求到另外一台机器,需要设置-c参数
10)测试环境最好和在线环境一致,比如连接都保持keepalive
11)TCPCopy只与ip、tcp层的数据有关,如果请求验证与tcp层以上的协议有关,则系统不能正常运行。
例如:mysql连接协议,由于权限认证与tcp层上面的mysql协议有关,所以复制过去的请求会被目
标测试服务器认为非法请求,这个时候需要针对mysql协议作具体针对性的处理,tcpcopy程序才能正常运行
12)多层架构环境下,测试系统一定要独立,与在线系统没有业务关联,否则会影响在线
13)丢失请求率跟网络状况有关,最好在内网内复制请求
14)本系统不支持域名,只支持ip地址
15)针对长请求(比如上传文件),0.5版本以下不是很支持,0.5版本及其以上没有此问题
16)为了避免不必要的麻烦,关闭的时候先关闭tcpcopy,然后再关闭interception
17)如果你想多重复制在线流量,见如下文档(0.4.0+版本)
http://blog.csdn.net/wangbin579/article/details/7476413
18)在测试过程中,如果你还想访问测试服务器的服务(0.3.5+版本),见如下文档
http://blog.csdn.net/wangbin579/article/details/7476477
19)由于更新比较快,高版本针对某些应用,请求丢失率反而有可能会下降,由于需要回归的测试太多,请谅解
20)源代码只部署到github
21)更多文档和实战,请访问 http://blog.csdn.net/wangbin579/article/category/926096
22)个人微博:http://weibo.com/tcpcopy

总结 
如果你对上线没有信心,如果你的单元测试不够充分,如果你对新系统不够有把握,如果你对
未来的请求压力无法预测,如果你想对比诸如apache和nginx的性能,如果你想放大在线流量,TCPCopy可以帮助你解决上述难题。

在这里要感谢网易技术部的支持,原先作者王波的设计和部分代码、叶金荣的mysql测试支持和推广,淘叔度的建议和文档支持,skoo87的大量支持,
淘宝众多人员的测试支持,水木的支持(比如zms等),还有众多开源人士提供的无私帮助(例如开源中国,程开源,tocer.deng,darkz1984等等)。

相关论坛: 下载频道交流区 讨论区
立即下载

tcpcopy-0.2.2.tar.gz
tcpcopy-0.3.5.tar.gz
tcpcopy-0.4.0.tar.gz
tcpcopy-0.5.0.tar.gz
tcpcopy-0.6.0.tar.gz


http://download.chinaunix.net/download/0014000/13561.shtml

你可能感兴趣的:(tcpcopy)