文章目录

  • 一、什么是全链路压测?
  • 二、全链路压测解决什么问题?
  • 三、什么时机下需要?
  • 四、如何展开全链路压测?
    • 1、梳理核心链路和边界
    • 2、数据模型构建
    • 3、流量平台搭建
    • 4、容量规划
      • 4.1、为什么需要容量规划
      • 4.2、容量规划四步走
      • 4.3、获取单台机器的服务能力
      • 4.4、生产环境进行单台机器压力测试的 4 个方法
    • 5、流程(举例)
    • 6、怎么使用流量复制进行压测?
      • 6.1、传统压测工具
      • 6.2、基于web 服务器的请求复制
      • 6.3、mirror (基于应用层)
      • 6.4、tcpcopy (基于网络栈,tcp协议的流量复制)
      • 6.5、goReplay (http协议的流量复制)

声明:近期正看全链路压测相关知识,从互联网上做的一些整理。

一、什么是全链路压测?

基于实际的生产业务场景、系统环境,模拟海量的用户请求和数据对整个业务链进行压力测试,并持续调优的过程

二、全链路压测解决什么问题?

针对业务场景越发复杂化、海量数据冲击下整个业务系统链的可用性、服务能力的瓶颈,让技术更好的服务业务,创造更多的价值
进行到 (业务流量预估阶段)、(系统容量评估阶段),我们完成了系统容量的粗略评估,做到这一步是不是够了呢
还不够,真实的场景并非如此
我们需要做精准的容量规划,给服务做限流降级提供数据的参考

三、什么时机下需要?

  • 业务发展速度

    • 在可以预期的一段时间(最好是半年,一个季度有点晚)内,业务会有较快速的发展,线上机器必须要大幅度扩容
    • 扩容有的时候并不是线性的,从两台扩展到四台,你得服务能力或者能提高两倍
    • 继续扩容服务能力就有可能提高不上去了,因为要受限于其他的模块,比如 DB、公共组建、中间件等

ps:业务的不断发展,依赖的模块不断增多。需要找出短板来进行解决

  • 链路的复杂程度在扩张

    • 一般而言,随着业务的发展,我们的接口会越来越多,系统会逐渐的做分布式
    • 业务线内部的模块越抽象越多,业务线跟其他业务线的交互也越来越多
    • 我们无法单纯的根据自己系统的处理能力来评估接口的服务能力

ps:接口的服务能力取决于模块中最低的那个)— 木桶理论

  • 对单机压测结果越来越没有自信

    • 一个很好的指标,一般而言,我们都会压一下我们自己的模块
    • 单机的压测不代表真实的线上场景,内心会越来越虚,这个时候,就要考虑全链路了

四、如何展开全链路压测?

1、梳理核心链路和边界

  • 核心链路是一个业务的核心,这一块应该可以很快梳理清楚
  • 难点在于梳理清楚链路的边界
    • 千万不要污染正常数据:认真梳理数据处理的每一个环节,确保 mock 数据的处理结果不会写入到正常库里面
  • 在核心链路的基础上,我们会有很多的分支业务,而这些分支业务有的可以参与压测,有的不能参与压测
    • 比如给用户下放 push 消息
    • 短信 / 支付 / 微信 Oauth 授权

2、数据模型构建

  • 数据的真实性和可用性:可以从生产环境完全移植一份当量的数据包,作为压测的基础数据,然后基于基础数据,通过分析历史数据增长趋势,预估当前可能的数据量
  • 数据脱敏:基于生产环境的全链路压测,必须考虑的一点是不能产生脏数据,以免对生产造成影响,影响用户体验等,因此在数据准备时需要进行数据脱敏
  • 数据隔离:千万不要污染正常数据:认真梳理数据处理的每一个环节,,可以考虑通过压测数据隔离处理,落入影子库,mock对象等手段,来防止数据污染

3、流量平台搭建

  • jmeter、Ngrinder、locust,提供分布式压测的方式(饿了么的流量平台是基于 jmeter 改造的)、压测机中的机器数据能够实时的收集查看到、可以随时停止压测、一定时间内实时错误率达到阈值自动熔断。考虑到压测量较大的情况下回传测试结果会对 agent 本身造成一定资源占用,可以考虑异步上传,甚至事务补偿机制。
  • 业务代码改造:压测请求上会打上特殊的标记,这个标记会随着请求的依赖调用一直传递下去。写请求写到影子区域(比如header头中做标记,存储、缓存、消息、日志等一系列的状态数据)、依赖的外部服务做 mock 处理(短信、邮件、push 等等)
  • 真实流量蓄水池,分批释放
  • 逐步压测

4、容量规划

4.1、为什么需要容量规划

容量规划的目的在于让每一个业务系统能够清晰地知道:什么时候该加机器、什么时候应该减机器?双11等大促场景需要准备多少机器,既能保障系统稳定性、又能节约成本
ps:什么时候增减机器、保障系统稳定性、节约成本

4.2、容量规划四步走

  1. 业务流量预估阶段:通过历史数据分析未来某一个时间点业务的访问量会有多大
  2. 系统容量评估阶段:初步计算每一个系统需要分配多少机器
  3. 容量的精调阶段:通过全链路压测来模拟大促时刻的用户行为,在验证站点能力的同时对整个站点的容量水位进行精细调整
  4. 流量控制阶段:对系统配置限流阈值等系统保护措施,防止实际的业务流量超过预估业务流量的情况下,系统无法提供正常服务

4.3、获取单台机器的服务能力

为了精准地获取到单台机器的服务能力,压力测试都是直接在生产环境进行,这有两个非常重要的原因:单机压测既需要保证环境的真实性,又要保证流量的真实性

4.4、生产环境进行单台机器压力测试的 4 个方法

  1. 模拟请求:通过对生产环境的一台机器发起模拟请求调用来达到压力测试的目的
    工具:apache ab、webbench、httpload、jmeter、loadrunner
    适用场景:新系统上线或者访问量不大的系统采用这种方式来进行单机压测
    缺点:模拟请求和真实业务请求之间存在的差异,会对压力测试的结果造成影响
    另一个缺点在于写请求的处理比较麻烦,因为写请求可能会对业务数据造成污染,这个污染要么接受、要么需要做特殊的处理(比如将压测产生的数据进行隔离)

    ps:和真实请求有差异、写请求需要处理、适合新系统上线或访问量不大的

  2. 复制请求:通过将一台机器的请求复制多份发送到指定的压测机器
    适用场景:系统调用量比较小的场景
    优点:为了使得压测的请求跟真实的业务请求更加接近,在压测请求的来源方式上,我们尝试从真实的业务流量进行录制和回放,采用请求复制的方式来进行压力测试
    缺点:同样也面临着处理写请求脏数据的问题
    另外一个缺点复制的请求必须要将响应拦截下来,所以被压测的这台机器需要单独提供,且不能提供正常的服务(不能把响应给到真实的用户了,比如涉及到发短信邮件之类的)

  3. 请求转发:将分布式环境中多台机器的请求转发到一台机器
    适用场景:系统调用量比较大的场景
    优点:请求的引流转发方式不仅压测结果非常精准、不会产生脏数据、而且操作起来也非常方便快捷,在阿里巴巴也是用的非常广泛的一种单机压测方式,这种方式怎么测试出当前系统最大能抗的流量是多少呢???

  4. 调整负载均衡:修改负载均衡设备的权重,让压测的机器分配更多的请求
    适用场景:系统调用量比较大的场景
    优点:调整负载均衡方式活的的压测结果非常准确、并且不会产生脏数据

    ps:单机压测可以基于上面的4种压测方式基础上,构件一套自动化的压测系统,可以配置定时任务定期对系统进行压测,也可以在任意想压测的时间点手动触发一次压测
    在进行压测的同时,实时探测压测机器的系统负载,一旦系统负载达到预设的阈值即立刻停止压测,同时输出一份压测报告
    通过单机压测获取的单机服务能力值也是容量规划一个非常重要的参考依据
    最小机器数=预估的业务访问量/单机能力最小机器数 = 预估的业务访问量 / 单机能力最小机器数=预估的业务访问量/单机能力

5、流程(举例)

  • 业务中需要区分流量(正常流量/压测流量)

    • 压测时需要在 http header 里加入X-Shadow 的key ,值为 true 的代表压测,key 不存在或者 key 值不等于 true代表非压测流量
  • 接收和发送 http / grpc 等请求时
    • 在向下游服务发起请求时,如果是压测流量把 header 头中的标记字段往下透传,下游继续在业务中往下透传
    • 接收到如果是压测流量,使用相应的压测数据
  • 依赖的模块
    • MySQL 使用影子表,将压测流量对 MySQL 的读写打到影子表上。即正常的业务表名为A,则影子表名为A_shadow

      • 所有涉及到的业务表都需要建一份影子表
      • 便于事后数据的清理
    • MongoDB 使用影子 collection ,将压测流量对 MongoDB 的读写打到影子表上。即正常的业务表名为A,则影子表名为 A_shadow
      • 同 MySQL
    • Redis 使用影子 key ,将压测流量对 redis 的读写打到影子 key 上。 如set key value 会变成 set key_shadow value
      • 同 MySQL
    • kafka 使用影子 topic,key 后拼接 _shadow
      - 同 MySQL
  • 不需要参与压测的做 mock 处理
    • 给用户发push、短信、支付、微信Oauth授权

6、怎么使用流量复制进行压测?

6.1、传统压测工具

  • ab、webbench、wrk、httpperf
  • 简单、成本低
  • 网络过于理想化、请求单一、同一客户端

6.2、基于web 服务器的请求复制

  • 请求多样化、成本低
  • 不具备通用性、丢失网络延迟、占用在线资源比较严重

6.3、mirror (基于应用层)

  • https://juejin.im/entry/5a4d9e10f265da43284144b0
  • https://github.com/session-replay-tools/mirror/blob/master/README.md
  • 基于应用层的流量复制工具和基于网络栈的流量复制工具。前者实现简单,但会挤 占线上应用的资源(比如连接资源,内存资源等),还可能会因为耦合度高而影响正常业务。
  • 而基于网络栈的流 量复制工具,直接从链路层抓取数据包,对应用影响较小,但是其实现也就相对复杂一些。
  • mirror是基于应用层的流量复制

6.4、tcpcopy (基于网络栈,tcp协议的流量复制)

  • https://blog.csdn.net/wangbin579
  • https://github.com/wangbin579/tcpcopy
  • http://tonylit.me/2016/10/19/tcpcopy/
  • 解决传统压测、基于web服务器请求复制的问题
  • 针对 TCP 的基于底层的在线请求复制工 具,可以用来帮助解决架构方面的大部分问题
  • 在不影响在线使用的情况下,把线上的流量 复制并且引到测试环境中去,使其达到对 server 测试的目的

6.5、goReplay (http协议的流量复制)

  • https://huoding.com/2017/05/31/620
  • http://tonylit.me/2017/09/20/tcpcopy%E7%9A%84%E5%85%84%E5%BC%9F-gor/

参考资料:

  • [1]:https://www.cnblogs.com/imyalost/p/8439910.html
  • [2]:https://github.com/youngperson/blog/issues/41

性能基础之全链路压测知识整理相关推荐

  1. Software Performance Testing - 全链路压测知识点整理

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 什么是全链路压测 基于实际的生产业务场景.系统环境( ...

  2. 干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径

    简介:全链路压测方案下,非加密场景下至少有 70% 的性能提升,加密场景下 10%的性能提升,并在 MGS 扩容完成后可实现大幅的性能提升,调优的结果远超预期. 业务背景 随着移动开发行业的步入存量时 ...

  3. 技术干货 | 应用性能提升 70%,探究 mPaaS 全链路压测的实现原理和实施路径

    简介: 全链路压测方案下,非加密场景下至少有 70% 的性能提升,加密场景下 10%的性能提升,并在 MGS 扩容完成后可实现大幅的性能提升,调优的结果远超预期. 业务背景 随着移动开发行业的步入存量 ...

  4. 深聊全链路压测之:第二十三讲 | 如何改造性能监控。

    这里写目录标题 1.引言 2.性能监控的改造 2.1 GoReplay 统计请求队列信息 2.2 GoReplay 埋点思路 2.3 GoReplay 埋点实现 2.3.1 概念 2.3.2 改造 3 ...

  5. 罗辑思维在全链路压测方面的实践和工作笔记

    业务的知名度越高,其背后技术团队承受的压力就越大.一旦出现技术问题,就有可能被放大,尤其是当服务的是对知识获取体验要求颇高的用户群体. 提供知识服务的罗辑思维主张"省时间的获取知识" ...

  6. 字节跳动全链路压测(Rhino)的实践

    1. 背景 随着公司业务的不断扩张,用户流量在不断提升,研发体系的规模和复杂性也随之增加.线上服务的稳定性也越来越重要,服务性能问题,以及容量问题也越发明显. 因此有必要搭建一个有效压测系统,提供安全 ...

  7. 全链路压测那点事(一)

    个人介绍:大家好,我是大猫,2015年加入百度质量部,负责百度前端展现架构测试工具开发.曾负责并开发基于spark的阿拉丁模板召回查询系统与搜索前端阿拉丁模板页面diff工具,均取得良好效果.2018 ...

  8. 分布式系统全链路压测方法

    目录 前言 测试策略 核心目标 技术选型 报告输出 总结 前言 继上一篇JMeter的基本使用介绍(使用Apache JMeter做压力测试),本文介绍如何做分布式系统的全链路压测.压测也叫基准测试( ...

  9. 全链路压测:构建三大模型

    压测前言 上篇文章主要介绍了在全链路压测准备阶段,最核心的一点:核心链路相关的知识. 梳理核心链路的一个重要目的是获得流量模型.但在全链路压测中,除了流量模型,业务模型和数据模型一样重要.这篇文章,为 ...

最新文章

  1. 让WPF和SL控件同时支持绑定和赋值
  2. 深度探索C++ 对象模型(4)-Default Copy Constructor(2)
  3. faiss(1):简介 安装 与 原理
  4. 赋值运算符函数严谨性的几点思考
  5. carsim输出端口2的宽度无效_PIO CORE 解析 (2)
  6. 渣本毕业两年经验,看这一篇就够了!
  7. MySQL8 Zip的下载和安装
  8. Linux安装,虚拟机VMware-workstation安装CentOS操作系统的安装手册
  9. IOS 地理编码以及反地理编码
  10. Windows10安装 virtualbox虚拟机
  11. UEditor(四)——表情包
  12. Qt疑难杂症之编译QPA插件
  13. MC9S12XS128 事件处理
  14. dedecms教程:龙书浩最新DedeCmsV5.7建站仿站VIP视频教程免费下载
  15. 电子邮件服务器的ip地址_EDM电子邮件营销,你真的了解么?
  16. 2014级学生程序设计学习大数据
  17. 树形表实现 bootstrap-table + treegrid
  18. 基于CUDA的医学影像数据处理工作站的配置方法
  19. 1月份国产手机出货量大幅下滑,iPhone却逆势增100万
  20. OpenJudge NOI 2.1 1752:鸡兔同笼

热门文章

  1. 第六章-数据库与Access
  2. 期权 证券 股票(沪深300ETF)等数据获取
  3. 查看IC中文文档的网站
  4. MyBatis入门-association标签使用
  5. 调试433M模组遇到的问题
  6. IDEA使用lombok
  7. 根据三角形的三条边长,判断三角形
  8. 开篇:RCU是什么?
  9. 电音制作宿主软件-Ableton Live Suite v11.0 x64 WiN
  10. 谈谈Java中的反射机制