引言


什么是全链路压测?
相对于传统的单接口压测,全链路压测旨在能完全模拟真实的用户的施压场景在生产环境或类生产环境执行的压测。在服务器、中间件、数据库等所有软硬件配置上,和线上保持一致;在压测场景上,通过线上流量录制回放模拟真实用户的使用场景;调用链路上,尽可能全链路调通,不做和少做mock。

原理

全链路压测的原理,基本上可以用4个四字短语进行概括:流量分区、存储隔离、参数偏移、场景模拟。
为了方便大家了解整体逻辑,盗了一个网上的图:

流量分区

通过在压测流量入口请求中增加压测标志并在整个压测链路上保持压测标志来和线上真实流量区分开。具体实施方式上,采用在HTTP请求的 header部分和RPC(dubbo、thrift等)请求的protocol header部分增加一个isTest=true字段来标识压测流量。

存储隔离

项目中使用的数据库、缓存和各种中间件,通过上游请求是否有压测标志来判断是否为压测流量。
数据库层面,压测前需要将所有的生产数据库表在导出一份影子表(数据库资源占用量会放大一倍),压测时根据上游请求中是否有压测参数,判断是走真实数据表还是影子表进行数据读写。
Redis等缓存方面,和数据库类似,通过判断请求中有无压测标志,判断是否走影子缓存进行数据读写
MQ:MQ producer传递压测标志,MQ consumer获取压测标志后,判断是否走数据库的影子表进行消息读取和写入处理。

参数偏移

参数偏移是一种兜底策略,防止前面2步“流量分区”和“存储隔离”出问题导致压测流量进入了真实的生产数据库污染线上数据(心惊肉跳的线上事故)。一般说来,就是在请求时将能唯一标识业务的某些ID,比如商品ID、订单ID等,加上一个偏移值(一般取一个远超业务ID长度的值,注意不要超过设置的数据库字段长度),一旦由于压测标志未传或者丢失,或者存储隔离失效导致压测数据请求到了真实的线上库,由于关键ID做了偏移,生产库对应的ID不存在(未偏移),数据库的更新类操作往往是无法成功的,同时也可以在代码中通过偏移的参数作为特征值对于压测数据写入真实生成库的情况进行异常捕获或者在压测结束后通过特征值对写入的部分新数据进行清理。
需要注意的是,参数偏移策略,需要在导入影子表时,在执行的SQL中增加偏移值。

场景模拟

全链路压测的核心思想,在于尽可能模拟用户的真实使用情况对尽可能真实的生产环境施加压力。基于线上流量录制回放的施压方式,是一种比较好的选择,在阿里、美团等互联网公司中被陆续使用。
通过将生产环境机器上的请求日志进行结构化存储,http请求可以提取nginx日志(nginx需要根据流量录制需要的参数进行配置),rpc请求可以将通过filter的日志入库。压测时可以根据需要,从数据库提取出指定时间的某些符合需求的请求,通过对流量数据进行一定的预处理——比如,通过脚本将请求中的token替换成永久有效的token,对请求的参数进行偏移处理,等等——然后作为压测流量进行回放施压。

实施

业务梳理

基于压测场景入口,从头到尾梳理调用链路,保证流量染色有始有终,流量出口都在掌握中,确保涉及的各类存储、中间件无遗漏,梳理结果输出文档,方便后续业务改造和压测配置时使用。

业务改造

  • 异步线程改造
    针对异步线程可能会丢失压测标志的情况,需要进行对应的业务改造,定制开发线程池,保证压测标志透传。
  • 跨服务间透传
    大部分中间件支持在网络协议传输中将压测标志透传,如果遇到不支持的中间件,需要进行定制化的业务改造。
  • 参数反偏移
    为了支持压测请求的参数偏移,可能需要基于业务逻辑在代码中对部分涉及影子表数据读取的地方进行参数反偏移处理,将请求参数减掉偏移值。

压测场景的选取

数据覆盖分析

  • 数据量
  • 数据分布

链路覆盖分析

  • 核心链路

技术指标分析

  • 线上访问量
  • 链路瓶颈

压测的实施

压测报告与调优

全链路压测原理剖析(Coding)相关推荐

  1. 大促之前全链路压测原理

    全链路压测方案 线下压测 顾名思义就是在测试环境进行压测,针对一些重点项目进行测试,因为测试环境硬件资源以及压测数据与线上差别太大并且服务间依赖关系错综复杂,测试环境很难模拟且不够稳定,压测出来的数指 ...

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

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

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

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

  4. “敏捷版”全链路压测

    作者:子矜 审核&校对:风云.雨芙 编辑&排版:雯燕 客户的故事 全链路压测被誉为大促备战的 "核武器" ,如果之前有关注过阿里双 11 相关的技术总结,对 &qu ...

  5. dubbo 服务压测_全链路压测资料汇总——业内大厂解决方案

    最近忙于公司的全链路压测平台调研和技术规划文档输出工作,参考了全网能搜到的业内大厂的全链路压测方案,这里做个汇总,以及将个人认为可以落地的方案做一个关键点整理. 技术链接 滴滴全链路压测解决之道 阿里 ...

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

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

  7. 深聊全链路压测之:第二十一讲 | 如何搭建GoReplay压测平台。

    搭建GoReplay压测平台 1.引言 2.GoReplay 2.1 什么是GoReplay 2.1.1 定义 2.1.2 原理 2.2 环境安装 2.2.1 Golang安装 2.2.2 GoRep ...

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

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

  9. 微服务:全链路压测和容量规划

    什么是全链路压测? 基于实际的生产业务场景.系统环境,模拟海量的用户请求和数据对整个业务链进行压力测试,并持续调优的过程 主要特征: 真实流量 线上环境 实时监控和过载保护 全链路压测组成 单链路指一 ...

最新文章

  1. arm32 linux 内存分布,gcc代码反汇编查看内存分布[2]: arm-linux-gcc
  2. 【Rsync项目实战一】备份全网服务器数据
  3. inrange函数_Python 初学者必备的常用内置函数
  4. [译]多线程网络服务模型
  5. cfg桩设备型号_什么是CFG桩?带您看下CFG桩施工工艺及流程,检测项目
  6. 2018年C语言期末考试题及答案,HZNUOJ--2018年秋季学期程序设计基础(C语言)期末考试(补题)...
  7. oracle给表赋清空权限,oracle建表赋权限
  8. python socket connection_Python socket.create_connection方法代码示例
  9. linux certutil删除命令
  10. hexo+github
  11. 手把手教你架构3D引擎高级篇系列四
  12. oracle 定时任务plsql,最简单的一个Oracle定时任务
  13. 什么是平面设计?详细讲解平面设计
  14. vue——菜鸟教程学习
  15. linux服务器运维工程师怎么样,怎样才算合格的运维工程师?linux运维技术
  16. 口袋妖怪金心银魂详细图文攻略(上)及游戏下载
  17. 【转载】C语言嵌入式系统编程修炼之二:软件架构篇
  18. 找回密码功能的流程总结
  19. 如何用海思HI3516DV300/3518EV200推流H.264
  20. vue语法、跨域报错等问题集合

热门文章

  1. 初识物联网开发-硬件开发板选择
  2. python匹配ip地址
  3. PHP 处理多重数组
  4. VM Player 安装xp虚拟机
  5. 删除下拉框只找23火星软件_下拉框软件找24火星软件
  6. 在VSCode中使用Compaq Visual Fortran编译运行Frotran程序
  7. Work20230605
  8. 捷报连连 | 拓保雇主品牌建设屡获认可,荣获“最爱人才雇主奖”
  9. VC2012/VS2012 MFC串口通讯上位机程序教程笔记(转)
  10. 4月3日工作总结及次日计划