TcpCopy使用

使用TcpCopy来引流做测试。

有台服务器的MySQL内存,经常内涨跑涨高,所以为了调试,在一台测试机器上搭建了同样的服务,部署了同样的代码,用TcpCopy做引流做测试。

【Tcpcopy简介】

  • TCPCopy是一种请求复制(所有基于tcp的packets)工具 ,其功能是复制在线数据包,修改TCP/IP头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的,从而为欺骗上层应用打下坚实基础。

【TCPCopy七大功能】

  1. 分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测试工具真实地多),也可以提前发现一些bug
  2. 普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开发者有信心上线
  3. 对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验
  4. 流量放大功能,可以利用多种手段构造无限在线压力,满足中小网站压力测试要求
  5. 利用TCPCopy转发传统压力测试工具发出的请求,可以增加网络延迟,使其压力测试更加真实
  6. 热备份

【TCPCopy架构】

  1. 架构图 tcpcopy-jiagoutu

  2. 数据流向 > ① 一个访问到达线上机器; ② socket数据包在ip层被拷贝了一份传给tcpcopy进程; ③ tcpcopy修改包的目的及源地址,发给目标测试机; ④ 拷贝的包到达目标测试机; ⑤ 目标测试机的应用程处理访问,并返回结果; ⑥ 返回结果在ip层被截获、丢弃,由intercpet进程拷贝返回结果的ip header并返回; ⑦ ip header被发送给线上机器的tcpcopy进程。

【TCPCopy安装】

  1. tcpcopy下载:https://github.com/wangbin579/tcpcopy
  2. intercept下载:https://github.com/session-replay-tools/intercept/releases
  3. 生产服安装tcpcop,这里下载的是0.9.6版本。

    tar xf tcpcopy-0.9.6.tar.gz
    ./configure
    make && make install
    # 
    #做个软链接,方便使用
    ln -s /usr/local/tcpcopy/sbin/tcpcopy /usr/local/bin/
    
  4. 测试服安装 intercept,这里下载1.0.0版本:

    tar xf intercept-1.0.0.tar.gz
    ./configure
    make && make install
    #做个软链接,方便使用
    ln -s /usr/local/intercept/sbin/intercept /usr/local/bin/
    #
    # 安装intercept时,如果遇到:checking for pcap.h ... not found。
    # 解决:yum install libpcap-devel -y
    

【TCPCopy使用(实时)】

  1. 测试服,运行intercept服务端程序,指定IP为生产服(源IP):

    # 1. 使用前要先启用内核模块ip_queue支持
    modprobe ip_queue
    # 
    # 2. 检查一下是否有启用
    lsmod|grep ip_queue
     
    # 3. 运行 intercept
    intercept -i eth0 -F 'tcp and src port 80' -d -l /data/logs/intercept.log
     
    #参数:
    # -i 指定网卡
    # -F 指定源端口为80端口
    # -d 启动为守护进程
    # -l 指定log日志
    # 更多的参数可 intercept -h 来查看
     
    
  2. 生产服,运行TcpCopy客户端程序,指定发送IP为测试服IP:

    tcpcopy -x 80-测试服IP:80 -s 测试服IP -l /data/logs/tcpcopy.log -d
     
    # 参数
    # -d 是做为守护进程方式运行
    # -l 是记录日志 -l /data/logs/tcpcopy_log.log
    # -s 指定intercept服务器
    # -n 复制几倍流量,不加参数默认为1,最大值为1023
    # -r 复制部分流量,比如 -r 20,即为复制20%的流量。传参数范围为1-99,其他数值都是默认为全部流量复制
     
    
  3. 测试:运行完可以通过tcpdump命令来抓包查看80端口的收发包情况。

    tcpdump -S port 80
    

【TCPCopy使用(离线)】

  1. 测试服,使用tcpdump抓包,并保存抓包文件。

    tcpdump -i eth0 tcp and port 80 -s 0 -w /data/logs/online_80.pcap
     
    #参数
    #-s 获取数据包,默认为68字节,设置成0,获取全部数据包
    
  2. 生产服,运行TcpCopy客户端程序,指定发送IP为测试服IP:

    tcpcopy -x 80-测试服IP:80 -i /data/logs/online_80.pcap -l /data/logs/tcpcopy.log -d
    

【注意事项】

  1. 不支持域名,只支持IP地址。
  2. 如果采用的是IP Queue模块来截获响应包,所以intercept程序密切跟ip queue内核模块相关,所以当压力很大的时候请求丢失率很高,需要优化sysctl系统参数才能达到好的效果。

    # 查看ip queue运行情况,
    cat /proc/net/ip_queue
    #
    # 如果Queue dropped的数值不断增大,则需要修改ip_queue_maxlen参数
    # 比如echo 4096 > /proc/sys/net/ipv4/ip_queue_maxlen
    #
    # 如果Netlink dropped的数值不断增大,修改net.core.rmem_max和net.core.wmem_max参数
    # 比如 sysctl -w net.core.rmem_max=16777216和sysctl -w net.core.wmem_max=16777216)