背景
Web 应用压力测试工具有很多,比如Apache ab, Apache JMeter等。但是这些工具都没能解决一个问题:如何正确模拟生产环境的流量。对于线下的传统压力测试,难以模拟真实流量,尤其难以模拟正常流量混杂着各色异常流量。
系统重构或重要变更上线前,可以复制线上真实流量,实时模拟线上流量,甚至可以放大真实流量,进行压力测试,以评估系统承载能力。反过来也可以这样,如果线上跑着发现有性能瓶颈,但线下环境难以复现,还不如把真实流量拷贝到线下重放,毕竟线下环境便于上各种排查手段,重放几遍都行,直到找到问题。
因此,需要研究如何复制线上真实流量并引流到测试环境。主要的工具有TCPCopy和GoReplay 。下面分别介绍这两个工具。
TCPCopy
TCPCopy 是一种请求复制(复制基于 TCP 的 packets)工具 ,通过复制在线数据包,修改 TCP/IP 头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的,从而为欺骗上层应用打下坚实基础。
TCPCopy由网易技术部的王斌在王波的工作基础上中2010年开发,并与2011年9月开源。Github地址,最新的发布版本号是 1.2.0。其应用领域较广,目前已经应用于国内各大互联网公司,很多公司的模拟在线测试都是基于 TCPCopy 做的。
总体说来,tcpcopy主要有如下功能:
1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测试工具真实地多),也可以提前发现一些bug
2)普通上线测试,可以发现新系统是否稳定,提前发现上线过程中会出现的诸多问题,让开发者有信心上线
3)对比试验,同样请求,针对不同或不同版本程序,可以做性能对比等试验
4)利用多种手段,构造无限在线压力,满足中小网站压力测试要求
5)实战演习(架构师必备)
tcpcopy可以用于实时和离线回放领域,并且tcpcopy支持mysql协议的复制,开源二年以来,功能上越来越完善。
架构如下图所示:
线上服务器Online Server(OS):上面要部署 TCPCopy,从数据链路层(pcap 接口)抓请求数据包,发包是从IP层发出去;
测试服务器Test Server(TS):最新的架构调整把 intercept 的工作从 TS 中 offload 出来。TS 设置路由信息,把 被测应用 的需要被捕获的响应数据包信息路由到 AS;
辅助服务器Assistant Server(AS):这是一台独立的辅助服务器,原则上一定要用同网段的一台闲置服务器来充当辅助服务器。AS 在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的 OS 上的 tcpcopy 进程。
TCPCopy实验
1. 实验环境
线上服务器 --> 192.168.119.158
测试服务器 --> 192.168.119.152
辅助服务器 --> 192.168.119.151
•tcpcopy运行在线上服务器上,tcpcopy会把线上服务器收到的流量,重放给测试服务器,重放的时候tcpcopy修改了IP数据包的源IP地址(譬如修改源地址为192.168.2.254)。所以