tcpcopy是一种请求复制(所有基于tcp的packets)工具,其应用领域较广,我们曾经应用于
网易的广告投放系统,urs系统,nginx hmux协议等系统,避免了上线带来的很多问题。
我们即将应用tcpcopy于membase替换现有mecached系统的任务中。由于membase还不够
成熟,不适合直接上线,利用tcpcopy程序,可以把访问memcached的系统流量复制一份到
membase系统中去。对于membase来说,这份流量就是访问membase的,跟直接上线
membase效果一样,就可以做各种试验,查看membase的各种特性。
tcpcopy四大功能:
1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测
试工具真实地多),也可以提前发现一些bug
2)对于后端的短连接,请求丢失率非常低(1/10万),可以应用于热备份
3)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开
发者有信心上线
4)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验
特点:
1)实时
2)效果真实
3)低负载,不影响在线
4)操作简单
5)分布式
6)意义非凡
使用方法:
TCPCOPY server (root用户执行)
1)启动内核模块ip_queue (modprobe ip_queue)
2)设置要截获的端口,并且设置对output截获
iptables -I OUTPUT -p tcp --sport port -j QUEUE
3)./interception
注意(如果已经启动ip_queue和已经设置iptables,只需要运行第3项;测试完以后要记得iptables -F)
TCPCOPY client (root用户执行)
./tcpcopy 本地ip地址1[:本地ip地址2:…] 本地port 远程ip地址 远程port
测试举例:
假设13,14是在线应用服务器,148是测试服务器(148配置和13差不多),
本地端口和远程端口都是12321。我们的目的就是为了确认目前在线服务器
能否承受目前两倍的压力。
我们利用tcpcopy进行测试:
目标测试服务器(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%,从负载来看,均不高。
内存也占得不多。
注意事项:
1)Linux平台,内核2.6+
2)TCPCOPY类似于UDP,所以会丢包,进而丢失请求
3)本系统不支持域名,只支持ip地址
4)Local Requests,请设置lo MTU不超过1500,并且在配置文件中不要设置127.0.0.1地址,
要设置内网或者外网地址
5)TCPCOPY server有可能会成为性能瓶颈
6)丢失请求率跟网络状况有关,最好在内网内复制请求
7)TCPCOPY中的tcpcopy和interception程序运行需要root权限
8)如果有问题,请注意error.log文件提示的错误信息
1 个解决方案
#1
开源地址 http://code.google.com/p/tcpcopy/
#1
开源地址 http://code.google.com/p/tcpcopy/