Beibeizhao 2012-09-24
无意间看见网易使用TCPCOPY来测试分布式负载性能测试,并且给出ab测试的结果虚高,是TCPCOPY测试结果的5倍。so,简单试用一下,把结果发下来供大家参考。
1.下载tcpcopy,地址为http://code.google.com/p/tcpcopy/如果在该地址下载则,直接可以编译安装执行,要求操作系统为linux,如果从github中clone过来:地址为:gitclonehttp://github.com/wangbin579/tcpcopy,则需要先运行
git clone http://github.com/wangbin579/tcpcopy sh autogen.sh ./configure make make install (需要root权限)
2.安装tcpcopy需要root权限,直接clone的,可以从./configure处开始就可以了。
复制流量的原理:
① 一个访问到达线上前端机; ② socket包在ip层被拷贝了一份传给tcpcopy进程; ③ tcpcopy修改包的目的及源地址,发给测试前端机; ④ 拷贝的包到达测试前端机; ⑤ 测试前端机的nginx处理访问,并返回结果; ⑥ 返回结果在ip层被截获、丢弃,由intercpetion拷贝返回结果的ip header返回; ⑦ ip header被发送给线上前端机的tcpcopy进程。
3.介绍如何使用
TCPCOPY分为2个部分client以及server,将client放到需要转移流量的服务器上,server放在测试机器上,例如如下的配置:
client 机器上: sudo tcpcopy -x 8401-10.18.105.110:36524 -l tcpsend.log server 机器上: sudo modprobe ip_queue sudo iptables -I OUTPUT -p tcp --sport 36524 -j QUEUE sudo intercept -l tcpreceive.log
代表的意思为:
转移141:8401端口的访问流量到110机器的36524端口
而server端需要指定接收那台机器上来的信息,自己开放那个端口-l代表日志放在哪里
4.日志的例子
我截取了一部分日志(这部分是未成功的日志)
[notice] Mon Sep 24 17:40:30 2012 usec=780462 intercept version:0.6.0 [notice] Mon Sep 24 17:40:30 2012 usec=784913 create delay-table,size:65536 [notice] Mon Sep 24 17:40:30 2012 usec=794283 create router-table, size:131072 [notice] Mon Sep 24 17:40:30 2012 usec=794347 socket created successfully [notice] Mon Sep 24 17:40:30 2012 usec=794360 it binds address successfully [notice] Mon Sep 24 17:40:30 2012 usec=794372 it listens successfully [notice] Mon Sep 24 17:40:30 2012 usec=794374 msg listen socket:4 [notice] Mon Sep 24 17:40:30 2012 usec=794412 sendto for ip queue is ok [notice] Mon Sep 24 17:40:30 2012 usec=794415 firewall socket:5 [warn] Mon Sep 24 17:40:30 2012 usec=794425 nl recv error:60 [warn] Mon Sep 24 17:40:30 2012 usec=794427 privilage problems or not the obj of tcpcopy [error] Mon Sep 24 17:41:39 2012 usec=638820 set signal handler:2 [notice] Mon Sep 24 17:41:39 2012 usec=638892 release_resources begin [notice] Mon Sep 24 17:41:39 2012 usec=638920 firewall sock is closed [notice] Mon Sep 24 17:41:39 2012 usec=638940 msg listen sock is closed [notice] Mon Sep 24 17:41:39 2012 usec=638946 destroy router table [notice] Mon Sep 24 17:41:39 2012 usec=643316 total visit hash_find_node:0,compared:0 [notice] Mon Sep 24 17:41:39 2012 usec=643346 destroy items 0 in table name:router-table [notice] Mon Sep 24 17:41:39 2012 usec=643349 destroy delay table,total:0 [notice] Mon Sep 24 17:41:39 2012 usec=644532 destroy items:0,free:0,total:0 [notice] Mon Sep 24 17:41:39 2012 usec=644539 create msg list:0,free:0,destr:0 [notice] Mon Sep 24 17:41:39 2012 usec=646470 total visit hash_find_node:0,compared:0 [notice] Mon Sep 24 17:41:39 2012 usec=646492 destroy items 0 in table name:delay-table [notice] Mon Sep 24 17:41:39 2012 usec=646495 release_resources end except log file
5.tcpcopy可以加入参数-m指定最大使用内存-l指定log存放位置-n指定复制多少倍的流量
6.现遗留问题,发现截取一段时间后,自己tcpcopy自动挂掉,正在研究中……
7.发现问题在不同网段之间的clientserver会出现如下问题:
2012/09/24 18:32:37 +164 [error] Can not connect to remote server(48:36524) (Connection timed out)
此处问题的解决方案:使用代理进行转发一下
8.模拟请求的脚本
#!/bin/sh i=0 while true do if [ $i -ne 100000 ]; then curl "http://10.18.102.141:8401/login" > /dev/null sleep 1 $i=$i+1 else break fi done