使用tcpcopy导入线上流量进行功能和压力测试

JAN 8TH, 2014

假设我们要上线一个两年内不会宕机的先进架构。在上线前,免不了单元测试,功能测试,还有使用ab,webbench等等进行压力测试。

但这些步骤非生产环境下正式用户的行为。或许你会想到灰度上线,但毕竟可能会影响到部分用户,这怎么对得起我们两年内不宕机的承诺呢?

好在网易的 王斌 开发了tcpcopy, 可以导入线上流量进行功能和压力测试。

tcpcopy介绍

tcpcopy是一种请求复制工具。可以将线上流量拷贝到测试机器,实时的模拟线上环境。在不影响线上用户的情况下,使用线上流量进行测试,以尽早发现bug。也可以通过放大流量,进行压力测试,评估系统承载能力。

tcpcopy可以从线上服务器的IP层抓取在线请求的数据包,修改相关属性,利用raw socket output技术(packet injection 技术之一)将其发送给测试服务器进行测试。

发送到测试服务器的数据包会在TCP/IP协议栈被识别,其中带有payload(tcp data)的数据包最终进入到测试服务器的上层应用(如nginx),上层应用在处理完请求之后,将响应传递给测试服务器的TCP/IP协议栈。

在测试服务器上启用ip_queue模块,并使用iptablesIP层将响应结果数据包发往QUEUE(ip_queue)。

测试服务器上运行在用户空间的拦截程序(intercept进程),通过打开netlink的socket接受内核通过ip_queue所传递来的网络数据包(即上层应用的响应内容)进行裁定,将结果返回内核,进行出队列的操作。intercept进程默认会丢弃上层应用的响应内容,返回ip header,以释放tcp连接。

intercept进程也可以通过-x(passlist)参数,不drop指定ip lists发出请求的响应内容。默认drop是为了:

1 减少出口带宽占用,节约成本
2 不影响客户端(线上服务)的`TCP/IP`协议栈
3 不会在互联网上产生ghost数据包

tcpcopy工作流程

如上图,tcpcopy拷贝一次流量访问的步骤如下:

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

安装和配置

tcpcopy有两种工作模式:

1 实时拷贝数据包
2 通过使用tcpdump等抓包生成的文件进行离线(offline)请求重放

如果采用实时拷贝线上流程进行导入的方式,需要分别在线上服务器和测试服务器安装tcpcopy,对于离线模式,只需要在测试服务器上安装tcpcopy,编译时指定 --enable-offline

安装步骤如下:
wget https://github.com/wangbin579/tcpcopy/archive/0.9.0.tar.gz -O tcpcopy-0.9.0.tar.gz --no-check-certificate
tar zxvf tcpcopy-0.9.0.tar.gz
cd tcpcopy-0.9.0
./autogen.sh
./configure --prefix=/usr/local/tcpcopy
make
sudo make install
目标测试机配置

线上服务器拷贝的数据包发送至测试服务器进行处理之后,测试服务器需要通过iptables将响应结果发送至QUEUE(ip_queue),这样测试服务器上运行的intercept拦截进程才能通过打开的netlinksocket获取传递过来的数据包并进行裁定。所以测试服务器上需要开启iptables防火墙,并启用内核模块ip_queue

modprobe ip_queue
/etc/init.d/iptables start

因为线上服务器需要和目标测试服务器通信,传递请求数据包和控制信息(封装的ip packet header),所以需要在测试服务器上添加相关iptables防火墙规则。编辑/etc/sysconfig/iptables,添加:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 36524 -j ACCEPT

然后重启iptables

/etc/init.d/iptables restart

接着执行:

iptables -I OUTPUT -p tcp --sport 80 -j QUEUE

将响应结果发送至QUEUE(ip_queue),从而实现运行在用户态的进程对相关数据包进行裁定。

相关使用

本文以线上和测试机的web服务都使用80端口,传递控制信息使用默认的36524端口为例。如果使用别的端口,记得修改相关iptables防火墙规则。

离线 offline

1) 在线上服务器抓包

tcpdump -i eth0 tcp and port 80 -s 0 -w online.pcap

2) 将抓包生成的文件拷贝到测试服务器

3) 在测试服务器上进行执行如下命令进行重放

cd /usr/local/tcpcopy/bin
sudo ./intercept
sudo ./tcpcopy -i /path/online.pcap -x 80-10.16.12.11:80tcpcopy -i <抓包文件地址> -x <port>-<本地ip>:<port>
在线实时复制 online

1) 在测试服务器上启动intercept拦截进程

cd /usr/local/tcpcopy/bin
sudo ./intercept

2) 在线上服务器复制流量到测试服务器

cd /usr/local/tcpcopy/bin
sudo ./tcpcopy -x 80-10.16.12.11:80 -c 10.16.12.12tcpcopy -x 服务器应用端口号-测试服务器ip地址:测试服务器应用端口 -c 本地服务器ip

reference:

[^1] https://github.com/wangbin579/tcpcopy

[^2] http://www.searchtb.com/2012/05/using-tcpcopy-to-simulate-traffic.html

[^3] http://hi.baidu.com/yacker/item/e6bd5b287fe5a3f150fd8731

[^4] http://blog.yam.com/hn12303158/article/35207136

Posted by jqlblue Jan 8th, 2014  devops

使用tcpcopy导入线上流量进行功能和压力测试相关推荐

  1. TCPCopy 线上流量复制工具

    TCPCopy是一种重放TCP流的工具,使用真实环境来测试互联网服务器上的应用程序. 一.描述: 虽然真实的实时流量对于Internet服务器应用程序的测试很重要,但是由于生产环境中的情况很负责,测试 ...

  2. 线上流量对比应用实践

    一.流量比对提出背景 我们在进行代码重构以及需求迭代时,在上线之前需要进行一轮.二轮以及回归测试,如果业务场景比较复杂,那么就会存在以下几个方面的问题: (1)测试的周期就会相应的拉的比较长: (2) ...

  3. 微服务引擎的线上流量治理最佳实践

    简介:本实践将重点介绍如何快速集成主流开源微服务框架,实现业务零改造,解决开源框架在生产落地过程中的痛点,例如无损上下线.标签路由等,并通过托管微服务开源组件(API网关.注册中心.配置中心等)的服务 ...

  4. 对登录功能进行压力测试:

    对登录功能进行压力测试: 测试要求: 1)测试系统能否支持"100 个"用户同时并发登录:即看100个左右用户并发登录时,系统的响应情况是什么样,能否达到我们的要求. 2)登录功能 ...

  5. java线上流量复制工具_tcpcopy复制线上流量

    TCPCopy七大功能 1)分布式压力测试工具,利用在线数据,可以测试系统能够承受的压力大小(远比ab压力测试工具真实地多),也可以提前发现一些bug 2)普通上线测试,可以发现新系统是否稳定,提前发 ...

  6. 线上流量突增百万高可用保障方案

    一:事前预防 1.预估系统瓶颈 1.1 梳理核心接口 按调用量梳理Top100 PM按业务重要等级梳理下端可能起量的接口 输出终版的接口文档 1.2 评估核心接口最高的TPS 测试环境模拟生产环境数据 ...

  7. 线上bug检测工具 android,Android 测试中对于偶现且难以重现的 bug 的处理

    吐槽 请先允许我对此类 bug 进行吐槽,相信做测试的同学都碰见过这种 bug! 我们在测试过程中经常会碰见一类很头疼的 bug,就是偶现性的 bug,所谓偶现性,是相对于必现而言,这类 bug 有些 ...

  8. 史上最全《JMeter压力测试教程》——通俗易懂,3天即可学会

    性能测试 为什么要进行性能测试? 满足真实场景的业务需求 招聘需要 性能测试概念: 性能:软件质量属性中的"效率"特性 性能测试:使用自动化工具,模拟不同的场景,对软件各项性能指标 ...

  9. 楼盘vr实景线上虚拟展示功能及特点

    VR展示将一些不具备有利地理位置的厂商,可以利用VR展示设计,虚拟还原数字化工厂.智能化商品.打造智能系统,让商品活起来,让店火起来. 深圳华锐视点通过VR技术,把实体店360度无死角,搬到网上个性化 ...

最新文章

  1. 【python】解压文件
  2. 添加日志文件组与日志文件成员
  3. 二十五、爬取毛豆新车的数据
  4. 是否应该频繁升级小米的系统?
  5. 给SAP Spartacus B2B list增加用户提示信息
  6. R语言数据转换(split-apply-combin…
  7. node.js 初体验
  8. SQL笔记-通过构建索引表方便数据库管理
  9. Go的http库详解
  10. 2017.10.3 国庆清北 D3T2 公交车
  11. Linux 命令汇总!【珍藏版】
  12. Winpcap笔记4之不用回调函数捕获数据包
  13. c语言 删除程序注释,C/C++ 源文件删除注释代码
  14. Markdown 数学公式语法
  15. 被低估的电池管理系统BMS
  16. SII9136添加HDCP功能
  17. Cesium资料大全
  18. 基于FPGA的数字时钟设计
  19. vue中新增弹出对话框操作
  20. 十强队伍来了!网易云信 Innovation 2022 开发者大赛决赛名单公布

热门文章

  1. 用半周积分算法求电压,电流有效值的c语言程序,半波整流电压有效值与功率的直观推导...
  2. 超级计算机图像处理云桌面,并行超算云桌面3.0正式发布,欢迎使用!
  3. GLUE基准数据下载
  4. 全球最大光伏电池缺陷异常检测数据集PVELAD【发布】
  5. Linux网络编程之网络基础
  6. 机器学习调参——网格搜索调参,随机搜索调参,贝叶斯调参
  7. Sed命令替换指定文件中某一行所有内容
  8. vue 在线预览、下载word、pdf文件
  9. Leetcode2086. 从房屋收集雨水需要的最少水桶数(medium)
  10. 医疗平台在线咨询文本分析——爬取数据(一)