工具调试:
线上服务器,启动tcpcopy:
./tcpcopy -x 8090-192.168.57.126:8090 -s 192.168.57.128 -c 10.5.214.x
测试服务器,添加路由:
route add -net 10.5.214.0 netmask 255.255.255.0 gw 192.168.57.128
辅助服务器,启动监听:
./intercept -i eth0 -F 'tcp and src port 8090' –d
注意:详细命令及说明请参考《tcpcopy安装教程》文档
1 使用tcpdump实时复制流量
通过该方式,可以实时的获取线上的流量并在测试环境实施压测。
实时获取流量命令:
./tcpcopy -x 8090-192.168.57.126:8090 -s 192.168.57.128 -c 10.5.214.x –n 5
其中:
8090为线上服务本机监控的8090端口
192.168.57.126:8090 为测试环境的地址及端口
-s 192.168.57.128指辅助服务器 (_intercept__用于丢包_)
-c 10.5.214.x 为将客户端的请求来源ip修改为指定的某些ip,方便日志收集、管理和查找
-n 5 指流量放大倍数
2 使用tcpdump生成文件进行离线请求重做
2.1 抓包生成离线文件
通过该方式,可以将线上服务器的请求抓取保存成一个文件,然后将该文件放在测试服务器上进行请求回访,实现离线压测
线上服务器抓取请求保存至文件命令:
tcpdump -i eth0 tcp and port 80 -s 0 -w online.pcap
或者 tcpdump -i any tcp and port 80 -s 0 -w online.pcap
说明:
-i eth0:eth0为网卡,获取方式可在liunx系统下执行ifconfig查看所有的网卡,选取需要的那个。
-w online.pcap:为获取pcap文件进行回放,可设置路径,e.g. -w /home/user/test.pcap
tcp and port 80: 截获端口为80的tcp请求,也可添加udp请求,和更改服务端口80,e.g. tcp and port 16001
-s 0: 默认的话,tcpdump只显示部分数据包,-s snaplen是控制包长度的,默认是68字节,-s 0 则为全部字节,在使用过程中,如果添加-s则回放时会出现错误。可不使用该参数
2.2 离线请求重做
1、在测试服务器上安装tcpcopy
2、将现网dump的pcap包拷贝到测试服务器上
3、执行以下路径进行回放重做:
./tcpcopy -x 8090-192.168.57.126:8090 -s 192.168.57.128 -i /data/test_web/online.pcap
可能出现的问题:
1、错误提示:tcpcopy: illegal argument "i"
解决方法:需要安装tcpcopy的离线模式
3 tcpcopy参数说明
3.1 -x 参数
格式:-x <transfer,>
Transfer 具体格式如下:
服务器对外IP 地址:服务器应用端口号-测试服务器IP地址:测试服务器应用端口
Transfer 之间用“,”隔开,IP 地址和端口号之间用“:”隔开,服务器应用端口号和测
试服务器IP 地址之间用‘-’隔开
举例:(在生产环境服务器上执行下边命令,80是行情端口,192.168.0.2是测试ip,18080是测试端口)
./tcpcopy -x 80-192.168.0.2:18080
复制在线机器的80 端口应用的请求到192.168.0.2 上面的18080 端口
3.2 -i 参数
在离线模式下使用哪个离线文件
格式:-i <file>
其中file 是pcap 离线文件的文件路径
举例:tcpcopy -i online.pcap -x 12345-221.130.189.25:12345
3.3 -o 参数
格式:-o < device,>
指定从哪个网卡设备上发包
举例:
tcpcopy -o eth0 -x 12345-221.130.189.25:12345
从eth0 设备上来发包
需注意如下事项:
1)此参数只有在编译./configure --enable-dlinject 模式下才有效
l --enable-dlinject说明
此模式是为了支持tcpcopy 能够从数据链路层发送请求数据包。
从数据链路层发包的好处是不会去干扰在线服务器的IP 模块(比如不会去干扰ip_conntrack 模块),但不好的地方是需要自己去解决路由问题。
2)-o 参数需要设置成与转发IP 地址相匹配的网卡设备
比如:转发IP 地址为外网IP 地址,那么-o 参数就设置成外网网卡设备的名称
3.4 -I 参数
离线模式下,降低请求之间的间隔,对稀疏的请求访问,其加速非常有效果
举例:
./tcpcopy -x 80-192.168.0.2:8080 -I 1000 -i online.pcap
对请求之间间隔1000毫秒以外的请求进行加速
注意只有在离线模式下有效
3.5 -a 参数
离线模式下,对请求数据包的访问进行加速
举例:
假设online.pcap 文件为在线请求数据包的抓包文件,时间为60 分钟
./tcpcopy -x 80-192.168.0.2:8080 -a 2 -i online.pcap
执行此命令后,离线回放加速了2 倍,只需要30分钟,离线回放就能完成
需要注意的是,此命令只有在离线模式下才有效,而且-a 参数设置越大,丢请求的概率
也越大。
3.6 -B 参数
格式:-B < num>
指定pcap 抓请求数据包的缓冲区大小,默认为16(单位为M)
举例:tcpcopy -x 12345-221.130.189.25:12345 -B 32
需要注意的是此参数只有在pcap 模式下才有效(编译./configure --enable-pcap 的情况下)
l --enable-pcap说明
这种模式是为了能够利用pcap 库(1.0 版本及其以后)进行抓包,利用pcap 的内核过滤接口,理论上可以提升抓请求数据包的效率,比如当在线机器应用种类比较多,需要复制某一个应用的请求到测试系统的时候,这种方式效率会比较高。
3.7 -F 参数
格式:-F < filter>
指定抓包的过滤条件,具体格式可以参考tcpdump 或者pcap filter 的格式
一旦设置此参数,tcpcopy 不会自动去构造filter,采用-F 参数指定的filter 去过滤请求
数据包
举例:
tcpcopy -x 12345-221.130.189.25:12345 -F 'tcp and dst port 11311 and dst host 10.100.10.1'
复制目的地址为10.100.10.1 且目的端口为11311 的TCP 请求数据包
需要注意的是此参数只有在pcap 模式下才有效(编译./configure --enable-pcap 的情况下)
--enable-pcap说明参见3.6
3.8 -C 参数
指定tcpcopy 和intercept 之间的连接数量,默认为2 条连接供响应包的返回和路由信息的传递,最高16条。在高压情况下,加大此参数,可以提高吞吐量,但整体性能会有一定程度的下降。
举例:
tcpcopy -x 12345-221.130.189.25:12345 -C 4
3.9 -c 参数
格式:-c <IP,>
改变请求数据包的源IP地址为IP地址列表中的某个IP地址
举例:
假设你复制的请求是本地localhost(127.0.0.1)的请求(比如抓包得到的结果类似于
127.0.0.1:80à127.0.0.1:8080),那么直接复制这样的请求到其它机器上去,一般是不行的,
需要修改数据包的源IP地址,-c参数就是用来改变源IP 地址的。
举例
./tcpcopy -x 8080-192.168.0.2:8080 -c 192.168.0.1
复制127.0.0.1上面的8080端口应用的请求到192.168.0.2上面的8080端口,同时修改
源IP地址127.0.0.1为192.168.0.1地址。
需要注意如下内容:
1)此参数在跨网段安全性比较高的场合,比较有效。
2)tcpcopy 仅仅改变客户端IP,不会自动解决改变所带来的端口冲突问题。
3)当客户端IP 地址较多时,为了尽可能地避免端口冲突问题,IP 地址列表的数目一般
越多越好。
3.10 -n 参数
如果你要进行多重复制,那么此参数的值就是代表复制过去的流量是在线的n 倍,倍数
越小,效果越好,因为多重复制的原理是修改端口号,因此复制的倍数越大,端口冲突的概
率越大,特别是源IP 地址非常少,短连接的的内网应用场合。系统默认最大值为1023 倍。
举例
./tcpcopy -x 80-192.168.0.2:8080 -n 3
复制3 倍的在线服务器的80 端口应用请求流量到192.168.0.2 的8080 端口
3.11 -f 参数
如果你要运行多个tcpcopy 实例,复制请求到同一台测试服务器上面去,那么此参数就
是为此设置的,常见于逐步增大流量的场合。最大值为1023。
举例:
./tcpcopy -x 80-192.168.0.2:8080
./tcpcopy -x 80-192.168.0.2:8080 -f 1
./tcpcopy -x 80-192.168.0.2:8080 -f 2
这里我们在在线服务器运行三个实例,可以把测试服务器的流量放大到在线的3 倍。
需要注意的是,如果要用-f 参数,复制给同一台测试服务器上面的同一个应用的不同tcpcopy 实例之间的-f 参数的值必须是不同的。
3.12 -r 参数
如果你想复制在线服务器应用的部分流量,可以采用-r 参数来实现,参数范围是1~99,
其它值都是全流量复制。
举例:
./tcpcopy -x 80-192.168.0.2:8080 -r 20
这里tcpcopy 复制在线服务器8080 端口应用的20%流量给后端服务器,需要注意的是
20%是根据session(这里session 是由客户端IP,客户端端口决定)来统计的。
-r 参数常见于对测试应用进行profile 的场合或者测试服务器配置不如在线服务器的场
合。
3.13 -M 参数
此参数设置tcpcopy 发送数据包的MTU 值,默认为1500 字节,如果系统MTU 值小于
1500 字节,需要调整此参数,否则会导致tcpcopy 发送数据包失败。
举例:tcpcopy -x 12345-221.130.189.25:12345 -M 1200
3.14 -m 参数
此参数一般只有在Linux 内核2.6.32 版本及其以后版本才有效,如果内存超过了此设置值,那么tcpcopy 就自动退出,默认是512M,这是为了保护在线,防止tcpcopy 占用过多内存。
举例:tcpcopy -x 12345-221.130.189.25:12345 -m 1024
3.15 -s 参数
格式:-s <server,> intercept server list
server 具体格式如下:
ip_addr1:port1, ip_addr2:port2, ...
指定真正运行intercept 的地址列表,通过此参数可以和任意一台服务器的任意一个
intercept 实例进行通信。
举例如下:
./tcpcopy -x 80-10.120.12.211:28080 -s 10.120.12.161:36525
复制在线80 端口的流量到IP 地址为10.120.12.211 的测试子系统中去(其中测试系统
上面运行28080 端口服务), 并设置tcpcopy 与intercept 的通信地址列表( tcpcopy 与
10.120.12.161 上面的36525 端口的intercept 通信)。
注意:
-s 参数只有编译./configure --enable-dr 或者新架构下才有效
l --enable-dr说明
经过编译后,工作在DR模式。DR模式取之于LVS 的DR 应用场景,是为了解决复制在线流量给带有LVS(由于大部分场景下采用DR)的子系统。
由于在线流量复制给LVS 后,LVS会把不同连接的数据包按照一定的策略分发给不同的测试服务器,导致了与常规TCPCopy 用法的不同。
下面内容讲述的是在传统架构下的DR 模式相关内容。
为了解决响应包如何返回的问题,此模式下的tcpcopy 会把每个会话的路由信息传递给每一台测试服务器上面相应的intercept。因此tcpcopy 执行命令的时候会多出-s 参数,用来指定真正的real server 的IP 地址,而intercept 则需要设置-x 参数,参数的值就是LVS服务器的所用的实际IP地址,设置的目地是让LVS 发出的数据包(即检测real server 的健康程度的数据包)能够通过测试服务器的IP层,这样LVS 才会认为这些real server 是健康的,而不是处于崩溃的状态。
理论上,如果数据包到达测试服务器之前,其目的IP 地址存在NAT 变换(DestinationNetwork Address Translation.),也就是说目的IP地址会被改变的情况下,那么DR模式也能适用,这种场景下的应用可以看成是DR的一种特殊应用场景。
值得注意的是,默认情况下,如果LVS 子系统中的一台real server 机器上面intercept进程崩溃后,仅仅重新启动intercept, TCPCopy 不会正常工作,需要重新启动所有tcpcopy才能顺利工作,为了避免此麻烦, tcpcopy 运行的时候需要加上-L 参数即可解决此问题。
3.16 -t 参数
如果你的在线应用响应非常慢或者长连接应用的场合,那么推荐设置更大的-t 参数值(默认是120s,如果120s 内没有收到测试服务器的响应,那么这个请求会话就可能被tcpcopy给丢弃掉)。
举例:
tcpcopy -x 12345-221.130.189.25:12345 -t 180
3.17 -l 参数
设置错误日志文件的路径
举例:tcpcopy -x 12345-221.130.189.25:12345 -l /tmp/error.log
3.18 -p 参数
格式:-p <num> remote server listening port
远程intercept 的监听端口,默认是36524。
举例:
tcpcopy -x 12345-221.130.189.25:12345 -p 36525
注意事项:
在configure --enable-dr 或者新架构下,如果tcpcopy 在-s参数中仅仅设置了IP 地址,那么端口就采用默认的-p参数值;如果-s参数设置了端口号,那么系统将替换掉-p参数所设置的端口值。
3.19 -d 参数
设置tcpcopy以daemon(后台)运行
举例:
tcpcopy -x 12345-221.130.189.25:12345 -d
检查进程就可以发现
ps -ef | grep tcp
root 1452 1 1 16:29 00:00:00 tcpcopy -x 12345-221.130.189.25:12345 -d
适用范围
1、 经过nginx请求比对,发现登录失败,登陆后操作关键请求均为302重定向(前台)
2、 登录ticket存在时效,不适合离线回放
3、 相比来看,离线版测试更加方便,对环境要求比较低,但不适合马上紧急测试,因为需要抓包文件的时间,而在线版如果拥有需要的环境,则可以马上进行测试。可以根据实际情况进行选择。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。