文档章节

真刀真枪压测:基于TCPCopy的仿真压测方案

旁观者-郑昀
 旁观者-郑昀
发布于 2015/08/26 10:15
字数 3290
阅读 256
收藏 13
点赞 0
评论 0
郑昀 基于刘勤红和石雍志的实践报告 创建于2015/8/13 最后更新于2015/8/19
关键词:压测、TCPCopy、仿真测试、实时拷贝流量

本文档适用人员:技术人员
提纲:
  1. 为什么要做仿真测试
  2. TCPCopy是如何工作的
  3. 实作:仿真测试的拓扑
  4. 实作:操作步骤
  5. 可能会遇到的问题
    1. ip_conntrack
    2. 少量丢包
    3. 离线重放
    4. 不提取7层信息
  6. 观测的性能指标

0x00,为什么要做仿真测试
线下的传统压力测试,难以模拟真实流量,尤其难以模拟正常流量混杂着各色异常流量。所以,线下压得好好的系统,上线后可能某天突然雪崩, 说好能支撑 5 倍流量的系统重构,也许流量一翻倍就彻底挂了。
但办法总比问题多。
系统重构或重要变更上线前,可以拷贝线上真实流量,实时模拟线上流量,甚至可以放大真实流量,进行压力测试,以评估系统承载能力。
反过来也可以这样,如果线上跑着跑着发现有性能瓶颈,但线下环境难以复现,还不如把真实流量拷贝到线下重放,毕竟线下环境便于上各种排查手段,重放几遍都行,直到找到问题。
所以本次基于 Varnish 的商品详情页静态化在上线前,做了仿真压测。
 
如何实时拷贝线上真实流量呢?
TCPCopy。

2010年,网易技术部的王斌在王波的工作基础上开发了 TCPCopy - A TCP Stream Replay Tool。2011年9月开源。当前版本号是 1.0.0。很多公司的模拟在线测试都是基于 TCPCopy 做的,如一淘

TCPCopy 是一种请求复制(复制基于 TCP 的 packets)工具 ,通过复制在线数据包,修改 TCP/IP 头部信息,发送给测试服务器,达到欺骗测试服务器的TCP 程序的目的,从而为欺骗上层应用打下坚实基础。
 
0x01,TCPCopy是如何工作的
王斌讲过,基于 Server 的请求回放领域,一般分为离线回放和在线实时复制两种。
其中请求实时复制,一般可以分为两类:
1)基于应用层的请求复制 ,
2)基于底层数据包的请求复制。
 
如果从应用层面进行复制,比如基于服务器的请求复制,实现起来相对简单,但也存在着若干缺点:
1)请求复制从应用层出发,穿透整个协议栈,这样就容易挤占应用的资源,比如宝贵的连接资源 ,
2)测试跟实际应用耦合在一起,容易影响在线系统,
3)也因此很难支撑压力大的请求复制,
4)很难控制网络延迟。
而基于底层数据包的请求复制,可以做到无需穿透整个协议栈,路程最短的,可以从数据链路层抓请求包,从数据链路层发包,路程一般的,可以在IP层抓请求包,从IP层发出去,不管怎么走,只要不走TCP,对在线的影响就会小得多。这也就是 TCPCopy 的基本思路。
 
从传统架构的 rawsocket+iptable+netlink,到新架构的 pacp+route,它经历了三次架构调整,现如今的 TCPCopy 分为三个角色:
  • Online Server(OS):上面要部署 TCPCopy,从数据链路层(pcap 接口)抓请求数据包,发包是从IP层发出去;
  • Test Server(TS):最新的架构调整把 intercept 的工作从 TS 中 offload 出来。TS 设置路由信息,把 被测应用 的需要被捕获的响应数据包信息路由到 AS;
  • Assistant Server(AS):这是一台独立的辅助服务器,原则上一定要用同网段的一台闲置服务器来充当辅助服务器。AS 在数据链路层截获到响应包,从中抽取出有用的信息,再返回给相应的 OS 上的 tcpcopy 进程。
 
请配合下图1理解:
图1 三个角色的数据流转方式
 
Online Server 上的抓包:
tcpcopy 的新架构在 OS 上抓请求数据包默认采用 raw socket input 接口抓包。王斌则推荐采用 pcap 抓包,安装命令如下: 
./configure --enable-advanced --enable-pcap
  make
  make install
这样就可以在内核态进行过滤,否则只能在用户态进行包的过滤,而且在 intercept 端或者 tcpcopy 端设置 filter(通过 -F 参数,类似 tcpdump 的 filter),达到起多个实例来共同完成抓包的工作,这样可扩展性就更强,适合于超级高并发的场合。

为了便于理解 pcap 抓包,下面简单描述一下 libpcap 的工作原理。

一个包的捕捉分为三个主要部分:

  1. 面向底层包捕获,
  2. 面向中间层的数据包过滤,
  3. 面向应用层的用户接口。

 

这与 Linux 操作系统对数据包的处理流程是相同的(网卡->网卡驱动->数据链路层->IP层->传输层->应用程序)。包捕获机制是在数据链路层增加一个旁路处理(并不干扰系统自身的网络协议栈的处理),对发送和接收的数据包通过Linux内核做过滤和缓冲处理,最后直接传递给上层应用程序。如下图2所示:

libpcap的三部分

图2 libpcap的三部分
 
Online Server 上的发包:
如图1所示,新架构和传统架构一样,OS 默认使用 raw socket output 接口发包,此时发包命令如下: 
./tcpcopy -x 80-测试机IP:测试机应用端口 -s 服务器IP -i eth0
其中 -i 参数指定 pcap 从哪个网卡抓取请求包。
此外,新架构还支持通过 pcap_inject(编译时候增加--enable-dlinject)来发包。
 
Test Server 上的响应包路由:
需要在 Test Server 上添加静态路由,确保被测试应用程序的响应包路由到辅助测试服务器,而不是回包给 Online Server。
 
Assistant Server 上的捕获响应包:
辅助服务器要确保没有开启路由模式 cat /proc/sys/net/ipv4/ip_forward,为0表示没有开启。
辅助服务器上的 intercept 进程通过 pcap 抓取测试机应用程序的响应包,将头部抽取后发送给 Online Server 上的 tcpcopy 进程,从而完成一次请求的复制。
 
0x02,实作:仿真测试的拓扑
下面将列出本次仿真测试的线上环境拓扑图。
环境如下:
  • Online Server
    • 4个生产环境 Nginx
      • 172.16.***.110
      • 172.16.***.111
      • 172.16.***.112
      • 172.16.***.113
  • Test Server
    • 一个镜像环境的 Nginx
      • 172.16.***.52
  • Assistant Server
    • 镜像环境里的一台独立服务器
      • 172.16.***.53
拓扑如图3所示:
压测环境拓扑
图3 压测环境拓扑
它的数据流转顺序如下图4所示:
压测环境的数据流转顺序
图4 压测环境的数据流转顺序
 
0x03,实作:操作步骤
下面分别列出在 Online Server/Test Server/Assistant Server 上的操作步骤。
3.1 Online Server 上的操作:
下载并安装 tcpcopy 客户端;
git clone http://github.com/session-replay-tools/tcpcopy
./configure
make && make install
  
安装完成后的各结构目录:
Configuration summary
 
  tcpcopy path prefix: "/usr/local/tcpcopy"
  tcpcopy binary file: "/usr/local/tcpcopy/sbin/tcpcopy"
  tcpcopy configuration prefix: "/usr/local/tcpcopy/conf"
  tcpcopy configuration file: "/usr/local/tcpcopy/conf/plugin.conf"
  tcpcopy pid file: "/usr/local/tcpcopy/logs/tcpcopy.pid"
  tcpcopy error log file: "/usr/local/tcpcopy/logs/error_tcpcopy.log"
  
运行 tcpcopy 客户端,有几种可选方式:
./tcpcopy -x 80-172.16.***.52:80 -s 172.16.***.53 -d       #全流量复制
./tcpcopy -x 80-172.16.***.52:80 -s 172.16.***.53 -r 20 -d  #复制20%的流量
./tcpcopy -x 80-172.16.***.52:80 -s 172.16.***.53 -n 2 -d    #放大2倍流量
 
3.2 Test Server 上的操作:
添加静态路由:
route add -net 0.0.0.0/0 gw 172.16.***.53
 
3.3 Assistant Server 上的操作:
下载并安装 intercept 服务端;
git clone http://github.com/session-replay-tools/intercept
./configure
make && make install
 
安装完成后的各结构目录:
Configuration summary
  intercept path prefix: "/usr/local/intercept"
  intercept binary file: "/usr/local/intercept/sbin/intercept"
  intercept configuration prefix: "/usr/local"
  intercept configuration file: "/usr/local/intercept/"
  intercept pid file: "/usr/local/intercept/logs/intercept.pid"
  intercept error log file: "/usr/local/intercept/logs/error_intercept.log"
 
运行 intercept 服务端;
./intercept -i eth0 -F 'tcp and src port 80' -d
 
生产环境和镜像环境数据传输流程图
图5 生产环境和镜像环境数据传输流程图
对照上图5,再简单解释一下工作原理:
  1. TCPcopy 从数据链路层 copy 端口请求,然后更改目的 ip 和目的端口。
  2. 将修改过的数据包传送给数据链路层,并且保持 tcp 连接请求。
  3. 通过数据链路层从 online server 发送到 test server。
  4. 在数据链路层解封装后到达 nginx 响应的服务端口。
  5. 等用户请求的数据返回结果后,回包走数据链路层。
  6. 通过数据链路层将返回的结果从 test server 发送到 assistant server。注:test server 只有一条默认路由指向 assistant server。
  7. 数据到达 assistant server 后被 intercept 进程截获。
  8. 过滤相关信息将请求状态发送给 online server 的 tcpcopy,关闭 tcp 连接。
0x04,可能会遇到的问题
王斌自己讲:要想用好 tcpcopy,需要熟悉系统知识,包括如何高效率抓包,如何定位系统瓶颈,如何部署测试应用系统,如何抓包分析。常见问题有:1)部署测试系统不到位,耦合线上系统,2)忽视系统瓶颈问题,3)不知道如何定位问题,4)资源不到位,资源紧张引发的问题 。
 
1)ip_conntrack
2014年6月,微博的唐福林曾说:“Tcpcopy 引流工具是线上问题排查的绝佳之选,但使用者很少有人去关注开启 tcpcopy 服务时,同时会开启 ip_conntrack 内核模块,这个模块负责追踪所有 tcp 链接的状态,而且它的内部存储有长度限制,一旦超过,所有新建链接都会失败。”
王斌则 回应说:“开启 tcpcopy,自身不会去开启 ip_conntrack 内核模块。开不开启 ip_conntrack 内核模块,是用户自己决定的,跟 tcpcopy 没关系。”他 还建议:“ 当连接数量非常多的时候,本身就应该关闭 ip_conntrack,否则严重影响性能。至于 tcpcopy,默认是从 ip 层发包的,所以也会被 ip_conntrack 干涉,文档中也有描述,其实也可以采用 --enable-dlinject 来发包,避开ip层的ip_conntrack。如果没有报“ip_conntrack: table full, dropping packet”,一般无需去操心ip_conntrack。”以及“线上连接不多的场合,开启 ip_conntrack 并没有问题。线上连接比较多的场合,最好关闭 ip_conntrack,或者对线上应用系统端口设置 NOTRACK,至少我周围的系统都是这样的,这是为性能考虑,也是一种好的运维习惯。”
 
2)少量丢包
如何发现 TCPCopy 丢包多还是少呢?
王斌自己称,在某些场景下,pcap 抓包丢包率会远高于 raw socket 抓包,因此最好利用 pf_ring 来辅助或者采用 raw socket 来抓包。
丢包率需要在测试环境中按照定量请求发送进行对比才能展开计算,另外还需要对日志内容进行分析,有待测试。
 

3)离线重放

tcpcopy 有两种工作模式:
1)实时拷贝数据包;
2)通过使用 tcpdump 等抓包生成的文件进行离线(offline)请求重放。
本次仿真测试,没有试验成功第二种工作模式,留待以后进一步研究。
 
4)不提取 7 层信息
会议上曾提出按域名区分拷贝流量,省得把不在本次压测范围内的工程打挂,但 tcpcopy 的原理是在 ip 层拷贝,不提取 7 层的信息,也就是说,在我们的 Nginx*4 上部署 TCPCopy,只能是将所有流量拷贝到镜像环境的 Nginx 上。反正没有配置对应的 server,或者 server 停掉,这种处理不了的流量就丢弃掉。
 
0x05,观测的性能指标
仿真压测时,需要记录下 Test Server 以及后端各种被压工程的性能指标。
本次压测,我们记录的指标有:
  • Java 工程的访问次数,响应时间,平均响应时间,调用成功或失败,Web端口连接数;
  • Web容器的 thread、memory 等情况;
  • 虚拟机的 CPU-usage、Load-avg、io-usage 等;
  • memcached/redis 等缓存集群的命中率等;
参考资源:
3, 王斌的微博
4,2013, tcpcopy架构漫谈
 

-EOF-

欢迎订阅我的微信订阅号『老兵笔记』,请扫描二维码关注:
老兵笔记订阅号二维码

© 著作权归作者所有

共有 人打赏支持
旁观者-郑昀
粉丝 99
博文 77
码字总数 162700
作品 0
朝阳
Netty NIO 框架性能压测 – 长链接

压测准备 需要将ulimit -n 改大,否则nio链接开不大。 准备4台机器(1台netty服务器,3台压测机) 使用apache的ab做压测工具 开始干活 压测代码: package org.dueam.sample.netty; package or...

红薯
2010/05/25
16.5K
10
日单量从百万到千万,滴滴全链路压测实践

稳定性是技术团队的命根子,滴滴也在搞全链路压测了。虽然才四五年,滴滴内部已经有了众多系统,而且号称四大语言,八大框架,改造成本可想而知。 如何做到釜底抽薪,支持线上环境的全链路压...

msj0905
06/27
0
0
滴滴全链路压测解决之道

滴滴出行创立于 2012 年,是全球领先的一站式多元化出行平台。经历过各种烧钱补贴大战、多次合并,滴滴成为继阿里之后,国内第二个日订单量超过千万的公司。 业务飞速增长,IT 系统面临的挑战...

架构师小秘圈
01/19
0
0
Netty NIO 框架性能压测-短链接-对比Tomcat

压测方案 准备多个文件大小分别为 1k 10k 100k 300k 使用ab分别按 50,2000压测服务,每次请求10W次 硬件信息:CPU:Intel(R) Xeon(R) CPU 1.86GHz ×4 4G 统计脚本:grep "Requests per seco...

红薯
2010/05/25
11.3K
5
压测2.0:云压测 + APM = 端到端压测解决方案

从压力测试说起 压力测试是确立系统稳定性的一种测试方法,通常在系统正常运作范围之外进行,以考察其功能极限和隐患。与功能测试不同,压测是以软件响应速度为测试目标的,尤其是针对在较短...

OneAPM蓝海讯通
2016/04/14
72
0
云集微店12·12:实施全链路压测方案,开源自研分布式军演系统TITAN

云集的全链路压测之路走的还是比较艰辛的,从最初纠结用什么压测工具开始,到压框架、压单接口、压线下环境等一步步摸索,并借鉴其它友商的经验和方案,直至今天,我们才最终在黑暗中摸索出了...

高翔龙
2017/12/27
0
0
构建需求响应式亿级商品详情页

原文出处: 张开 该文章是根据velocity 2015技术大会的演讲《京东网站单品页618实战》细化而来,希望对大家有用。 商品详情页是什么 商品详情页是展示商品详细信息的一个页面,承载在网站的大...

刘星石
2016/04/19
39
0
构建需求响应式亿级商品详情页

该文章是根据velocity 2015技术大会的演讲《京东网站单品页618实战》细化而来,希望对大家有用。 商品详情页是什么 商品详情页是展示商品详细信息的一个页面,承载在网站的大部分流量和订单的...

天天顺利
2015/09/02
304
0
构建需求响应式亿级商品详情页

构建需求响应式亿级商品详情页 博客分类: 架构 该文章是根据velocity 2015技术大会的演讲《京东网站单品页618实战》细化而来,希望对大家有用。 商品详情页是什么 商品详情页是展示商品详细...

fdhay
2016/08/31
119
0
swoole-1.7.7 发布,Http 服务器性能大幅提升

swoole-1.7.7 发布,内置Http服务器性能是Node.js的12倍 PHP的异步并发扩展swoole发布了 1.7.7 版本,此版本主要有: 增加对cygwin环境的支持 增加单次定时器的after接口 onClose事件调整为在...

matyhtf
2014/10/28
8.7K
65

没有更多内容

加载失败,请刷新页面

加载更多

下一页

20位活跃在Github上的国内技术大牛 leij 何小鹏 亚信

本文列举了20位在Github上非常活跃的国内大牛,看看其中是不是很多熟悉的面孔? 1. lifesinger(玉伯) Github主页: https://github.com/lifesinger 微博:@ 玉伯也叫射雕 玉伯(王保平),...

海博1600
8分钟前
0
0
高性能服务器本质论

一 服务器分类 从软件性能角度,高性能服务器分:cpu密集型服务器/IO密集型服务器 (1)CPU密集型:该类服务器没有对io的访问/没有同步点,性能瓶颈在于对cpu的充分利用。 典型的如转发服务器/...

码代码的小司机
9分钟前
0
0
Mybatis收集配置

一、Mybatis取Clob数据 1、Mapper.xml配置 <resultMap type="com.test.User" id="user"> <result column="id" property="id"/> <result column="json_data" property="jsonData" ......

星痕2018
35分钟前
0
0
centos7设置以多用户模式启动

1、旧版本linux系统修改inittab文件,在新版本执行vi /etc/inittab 会有以下提示 # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON......

haha360
今天
0
0
OSChina 周日乱弹 —— 局长:怕你不爱我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ andonny :分享周二珂的单曲《孤独她呀》 《孤独她呀》- 周二珂 手机党少年们想听歌,请使劲儿戳(这里) @孤星闵月 :没事干,看一遍红楼梦...

小小编辑
今天
181
9
Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式 Factory工厂模式 Singleton单例模式 Delegate委派模式 Strategy策略模式 Prototype原型模式 Template模板模式 Spring5 beans 接口实例化 代理Bean操作 ...

小致dad
今天
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
11
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
17
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
251
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部