[XCopy]tcpcopy0.6版本的使用方法

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

相关推荐