使用tcpcopy进行压力测试

简介

项目地址

https://code.google.com/p/tcpcopy/

https://github.com/wangbin579/tcpcopy

原理:

tcpcopy

TCPCopy七大功能

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

特点

  • 实时
  • 效果真实
  • 低负载,不影响在线
  • 操作简单
  • 分布式
  • 零成本

使用方法:

TCPCopy分为TCPCopy client(即tcpcopy)和TCPCopy server(即intercept)。

TCPCopy client 运行在在线服务器上面,用来捕获在线请求数据包;

TCPCopy server(默认监听端口为36524)运行在测试机器上面,用来截获响应包,并传递响应包头信息给TCPCopy client,以完成TCP交互。

使用方法一般如下

TCPCopy server(root用户执行)采用IP Queue 模块(内核>=3.5,默认采用IP Queue)

  • 启动内核模块ip_queue

      modprobe ip_queue
      #如果已经启动ip_queue,则不需要此步骤
    
  • 设置要截获的端口,并且设置对output截获

      iptables -I OUTPUT -p tcp --sport port -j QUEUE
      #如果已经设置上述命令,则不需要此步骤
    
  • 启动intercept

      intercept
    

    为了避免不必要的麻烦,关闭的时候先关闭tcpcopy,然后再关闭intercept

  • TCPCopy client (root用户执行)

      tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口
    

编译选项

  • ./configure

    经过编译后,TCPCopy 工作方式为实时复制模式。
    值得注意的是,在内核3.5 之前,intercept 默认采用IP Queue 模块;在内核>=3.5 后,intercept 采用NFQueue 模块(因为3.5 以后就不支持IP Queue 了)

  • ./configure —enable-nfqueue

    经过编译后,intercept 采用NFQueue (内核版本3.5 以后默认采用NFQueue),实时复制模式

  • ./configure —enable-thread

    经过编译后,intercept工作在多线程模式,目的是为了发挥intercept的潜能

  • ./configure —enable-single

    经过编译后,TCPCopy 工作在非分布式模式,只能复制一台在线流量到测试服务器,intercept 不会维护路由信息,以提高单台机器复制的潜能,适合于复制单台在线机器大流量应用的场合

  • ./configure —enable-offline

    经过编译后,工作在离线回放方式,适合于不方便在在线服务器上面实时复制流量的场合。
    这里需要注意如下内容:

    • 是离线回放所依据的pcap 文件,最好只包含在线请求数据包,不要包含在线的响应包,这样做的好处就是减少pcap 文件所占大小,而且会提升离线回放程序的性能.
    • 抓包生成pcap 文件的时候,一定要确保不要丢包。
    • 离线模式需要有-i 参数,用来指定pcap 文件所在的路径
  • ./configure —enable-dr
    经过编译后,工作在DR 模式。DR 模式取之于LVS 的DR 应用场景,是为了解决复制在线流量给带有LVS(由于大部分场景下采用DR)的子系统。
    由于在线流量复制给LVS 后,LVS 会把不同连接的数据包按照一定的策略分发给不同的测试服务器,导致了与传统TCPCopy 的不同。

    为了解决响应包如何返回的问题,此模式下的tcpcopy 会把每个会话的路由信息传递给每一台intercept。因此tcpcopy 执行命令的时候会多出-s 参数,用来指定真正的real server的IP 地址,而intercept 则需要设置-x 参数,参数的值就是LVS 服务器的所用的实际IP 地址,设置的目地是让LVS 发出的数据包(即检测real server 的健康程度的数据包)能够通过测试服务器的IP 层,这样LVS 才会认为这些real server 是健康的,而不是处于崩溃的状态。

    理论上,如果数据包到达测试服务器之前,其目的IP 地址存在NAT 变换(Destination Network Address Translation.),也就是说目的IP 地址会被改变的情况下,那么DR 模式也能适用,这种场景下的应用可以看成是DR 的一种特殊应用场景。
    值得注意的是,如果LVS 子系统中的一台real server 机器上面的intercept 进程崩溃后,仅仅重新启动intercept, TCPCopy 不会正常工作,需要重新启动所有tcpcopy 才能顺利工作。

  • ./configure —enable-paper

    默认情况下,响应数据包的网络延迟是不保持的,此模式加入了响应包的返回延迟,目的是更加逼真地模拟在线的情况。

  • ./configure —enable-pcap

    这种模式是为了能够利用pcap 库进行抓包,利用pcap 的过滤接口,可以提升抓包的效率,比如当在线机器应用种类比较多,需要复制某一个应用的请求到测试系统的时候,这种方式效率最高。

  • ./configure —enable-debug

    这种模式是为了输出debug 日志,方便问题诊断的,如果你遇到了无法解决的问题,请采用此模式运行TCPCopy(一般运行5 分钟即可)
    需要注意的是,采用configure 的时候, tcpcopy 和intercept 程序一般需要采用同样的configure 配置, 以防诡异问题产生。

实战

环境:

压力机:192.168.1.250

tcpcopy_client:192.168.1.185

tcpcopy_server:192.168.1.114

  • 下载

      wget https://tcpcopy.googlecode.com/files/tcpcopy-0.7.0.tar.gz
    
  • 安装

      tar zxvf tcpcopy-0.7.0.tar.gz &&cd tcpcopy-0.7.0
      ./configure
      make && make install
    
  • 运行

    在压力机上通过http_load(ab、webbench、siege同理)往tcpcopy_client施压,我的单cpu小内存虚拟机只能抗住2个并发的持续访问,并发再高loadaverage会飙升,影响tcpcopy测试。

  • tcpcopy_client

      tcpcopy -x 80-192.168.1.114:80`
    
  • tcpcopy_server

      modprobe ip_queue
      iptables -t filter -I OUTPUT -p tcp --sport 80 -j QUEUE
    
  • interception

  • 结果

    此时用nethogs分别观察两台服务器,已经有流量了:

    • 192.168.1.185:
    • 192.168.1.114:

      观察日志,同样已经有相应条目:

    • 192.168.1.185:

        wc -l access_log.s30p2  
        39121
      
    • 192.168.1.114:

        wc -l access.log.s30p2  
        9121