TCPCopy七大功能
1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测试工具真实地多),也可以提前发现一些bug
2)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开发者有信心上线
3)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验
4)流量放大功能
5)利用TCPCopy转发传统压力测试工具发出的请求,可以增加网络延迟,使其压力测试更加真实
6)热备份
7)实战演习(架构师必备)
TCPCopy的特点
1)实时 (离线通过configure --enable-offline)
2)效果真实
3)低负载,不影响在线
4)操作简单
5)分布式
6)零成本
可能会遇到的问题
王斌自己讲:要想用好 tcpcopy,需要熟悉系统知识,包括如何高效率抓包,如何定位系统瓶颈,如何部署测试应用系统,如何抓包分析。常见问题有:1)部署测试系统不到位,耦合线上系统,2)忽视系统瓶颈问题,3)不知道如何定位问题,4)资源不到位,资源紧张引发的问题 。
1)ip_conntrack
2014年6月,微博的唐福林曾说:“Tcpcopy 引流工具是线上问题排查的绝佳之选,但使用者很少有人去关注开启 tcpcopy 服务时,同时会开启 ip_conntrack 内核模块,这个模块负责追踪所有 tcp 链接的状态,而且它的内部存储有长度限制,一旦超过,所有新建链接都会失败。”
王斌则回应说:“开启 tcpcopy,自身不会去开启 ip_conntrack 内核模块。开不开启 ip_conntrack 内核模块,是用户自己决定的,跟 tcpcopy 没关系。”他还建议:“当连接数量非常多的时候,本身就应该关闭 ip_conntrack,否则严重影响性能。至于 tcpcopy,默认是从 ip 层发包的,所以也会被 ip_conntrack 干涉,文档中也有描述,其实也可以采用 --enable-dlinject 来发包,避开ip层的ip_conntrack。如果没有报“ip_conntrack: table full, dropping packet”,一般无需去操心ip_conntrack。”以及“线上连接不多的场合,开启 ip_conntrack 并没有问题。线上连接比较多的场合,最好关闭 ip_conntrack,或者对线上应用系统端口设置 NOTRACK,至少我周围的系统都是这样的,这是为性能考虑,也是一种好的运维习惯。”
2)少量丢包
如何发现 TCPCopy 丢包多还是少呢?
王斌自己称,在某些场景下,pcap 抓包丢包率会远高于 raw socket 抓包,因此最好利用 pf_ring 来辅助或者采用 raw socket 来抓包。
丢包率需要在测试环境中按照定量请求发送进行对比才能展开计算,另外还需要对日志内容进行分析,有待测试。
3)离线重放
tcpcopy 有两种工作模式:
1)实时拷贝数据包;
2)通过使用 tcpdump 等抓包生成的文件进行离线(offline)请求重放。
本次仿真测试,没有试验成功第二种工作模式,留待以后进一步研究。
4)不提取 7 层信息
会议上曾提出按域名区分拷贝流量,省得把不在本次压测范围内的工程打挂,但 tcpcopy 的原理是在 ip 层拷贝,不提取 7 层的信息,也就是说,在我们的 Nginx*4 上部署 TCPCopy,只能是将所有流量拷贝到镜像环境的 Nginx 上。反正没有配置对应的 server,或者 server 停掉,这种处理不了的流量就丢弃掉。
0x05,观测的性能指标
仿真压测时,需要记录下 Test Server 以及后端各种被压工程的性能指标。
本次压测,我们记录的指标有:
Java 工程的访问次数,响应时间,平均响应时间,调用成功或失败,Web端口连接数;
Web容器的 thread、memory 等情况;
虚拟机的 CPU-usage、Load-avg、io-usage 等;
memcached/redis 等缓存集群的命中率等;
下载及安装
1.1. 下载
需要两个工具,分别是:
tcpcopy
intercept
1.2. 工具部署
使用tcpcopy进行线上导流,通常需要 3 台服务器:
online server (运行 tcpcopy)
target server (流量从 online server 复制到此机器)
assistant server (运行 intercept)
1.3. 安装及命令使用方法
1.3.1. tcpcopy
./configure(在线导流模式)
或
./configure --offline(离线回放模式)
make
make install
在线导流方法:
tcpcopy -x localServerPort-targetServerIP:targetServerPort -s interceptServerIP
[-c ] -d
离线重放方法:
tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.136 -i test.pcap -n 2
将 test.pcap 报文放大 2 倍发送给 192.168.44.137
1.3.2. intercept
cd intercept
./configure
make
make install
使用方法:
intercept -F -i
二. 测试
假设我们 3 台服务器情况分别如下:
- online server: 192.168.44.128
- target server: 192.168.44.137
- assistant server: 192.168.44.136
2.1. 运行命令
2.1.1. target server
如果是在同一网段,设置去往 online server 的响应,路由到 assistant server,可以这样指定:
route add -host onlineIP gw assistantIP
如果客户端 IP 来自于其它网段的话:
route add -net xxx.xxx.xxx.0 netmask 255.255.255.0 gw assistantIP
这里添加静态路由:
route add -net 192.168.50.0 netmask 255.255.255.0 gw 192.168.44.136
确保被测试应用程序的响应包路由到辅助测试服务器,而不是回包给 online server
2.1.2. assistant server
intercept -i eth0 -F 'tcp and src port 80' -d
intercept 过滤 eth0 网卡 80 端口的 tcp response 报文。
辅助服务器要确保没有开启路由模式,为0表示没有开启:
cat /proc/sys/net/ipv4/ip_forward
辅助服务器上的 intercept 通过 pcap 抓取测试机应用程序的响应包,将头部抽取后发送给 online server 上的 tcpcopy ,从而完成一次请求的复制。
2.1.3. online server
tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.136 -c 192.168.50.x -d
将本机 80 端口数据转发给192.168.44.137:80,更改 client IP 为 192.168.50.x 之一,并从 192.168.44.136 获取 response 报文。
2.2. 查看各 server 报文情况
可以在各个 server 上使用 tcpdump 抓包查看收发报文情况
如:online server 上
tcpdump -n -i eth0 port 80 and dst host 192.168.44.137
三. 遇到的问题
3.1. 无法复制流量问题
之前在三台机器都是同网段的机器上测试,是可以成功复制流量的,但是 online server 与 target server 不在同一网段时,发现无法复制流量。
抓包发现
online ------(SYN)------> target
online
online ------(RST)------> target
解决方案
采用两台机器方案:
- online server,假设 IP 1.2.3.4
- target server,假设 IP 192.168.44.137
online server 运行:
tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.137 -c 1.2.3.4 -d
online server iptables 添加下面规则
iptables -A INPUT -s 192.168.44.137 -p tcp --sport 80 -j DROP
target server 运行:
intercept -i eth0 -F 'tcp and src port 80' -d
然后可以分别在两台服务器上查看日志,如 nginx:
tail -f /usr/local/nginx/logs/access.log
参考资料:
http://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html
https://www.cnblogs.com/chenny7/p/3912515.html
https://blog.csdn.net/fengfengdiandia/article/details/77776026