tcpcopy压测配置笔记

  • 2019 年 10 月 5 日
  • 笔记

作者博客:http://blog.csdn.net/wangbin579/article/details/8950282

配置参考:

http://quentinxxz.iteye.com/blog/2249799

http://blog.csdn.net/zhang_yanan/article/details/25708349

软件安装

下面演示的tcpcopy和intercepter都是1.0.0版本,直接从github下载即可。

https://github.com/session-replay-tools/tcpcopy

tcpcopy运行需要intercept的支持,tcpcopy负责抓包和发包工作,而intercept负责截获应答包

node1  192.168.2.11      online server    安装tcpcopy、libpcap-devel

node2  192.168.2.12      target server 添加路由

node3  192.168.2.130    assistant server 安装intercepter、libpcap-devel

另外找一个当前网段没有主机在用的IP,例如192.168.2.110

实验中的node1、node2上都跑了nginx,监听在80端口。node1为线上服务器,node2为测试服务器。

node2上:

route add -host 192.168.2.110 gw 192.168.2.130

# 说明:

# 192.168.2.110 是经复制后测试数据包上填入的源地址。

# 192.168.2.130 为assistant server,上面将会运行intercept服务。

# 这条命令作用是 target server对于复制而来的请求(根据源地址判断)的响应,不会返回给请求客户端,而是发往assistant server, assistant server最终丢弃这个数据包(因为assisant server上并没有相关的路由)。

node3上:

echo 0 > /proc/sys/net/ipv4/ip_forward    # 关闭内核转发功能

tar xf intercept-1.0.0.tar.gz

cd intercept-1.0.0

./configure

make -j 4 && make install

cd /usr/local/intercept/sbin

./intercept -i eth0 -F 'tcp and src port 80' -d

# 其中80是target server的端口号。intercept捕获基于TCP应用的响应

# 关闭内核转发,这样的话,target server的那个route过来的数据包就过来了会匹配不到路由,直接被丢弃了。

ps aux|grep intercept     可以看到进程启动了

node1上:

tar xf tcpcopy-1.0.0.tar.gz && cd tcpcopy-1.0.0

./configure

tcpcopy的安装,有如下2种方式:

./configure (默认raw socket方式抓包)

或者./configure –pcap-capture  (pcap方式抓包,在某些场景下,丢包率会高于raw socket方式抓包,这时候需要类似pf_ring的支持)

make -j 4 && make install

cd /usr/local/tcpcopy/sbin

./tcpcopy -x 80-192.168.2.12:80 -s 192.168.2.130  -c 192.168.2.110 -n 10

# 格式:tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server,> [-c <ip range,>]

# 这样把本机80端口的10倍的数据流量就发到了192.168.2.12的80端口去,并且把发过去的数据包伪装成源地址是192.168.2.110这个虚假的IP。并且连接192.168.2.130,告诉intercept将响应数据包发给online server本机。

# 如果有多台online server,只要在每台online server上都执行上面的这个tcpcopy命令即可。

其中80是target server的端口号。

-x 80-192.168.2.12:80 是将从80端口的请求发往 target server。

-s 192.168.2.130 为指定assistant server。

-c 192.168.2.110 是指将所有复制请求的数据包的源地址全改为 192.168.2.110 。

-n参数指定复流量的倍数。

验证效果:

另找一台主机node4,执行ab -c 100 -n 100000 http://192.168.2.11/index.php

然后观察node1、node2上面的连接数ss -tan,及系统负载uptime、网络流量dstat。

ss -tan|awk 'NR>1 {++s[$1]} END {for (k in s) print k,s[k]}'

另外,可以在node1或者node2上抓包:

tcpdump -i eth0 -nn port 80 and host 192.168.2.110

在node3上抓包:

tcpdump -i eth0 -nn host 192.168.2.130

这些方式都可以很直观的看到数据包的流向。

停止流量复制

在assistant server 中kill intercept进程,在online server 中kill tcpcopy进程,在target server上删除相应的route。

其他注意点:参照作者的CSDN博客即可。