什么是预热 压测_换个角度,聊聊全链路压测

2023-11-05

前言

之前自己也写过好几篇关于全链路压测的文章或者博客,最近看了infoQ上infoQ-数列科技杨德华的专栏,复盘了下自己以往在全链路压测实施方面的工作,发觉还有很多可以做的更好的地方。就以这篇文章来做个总结,顺带说说我自己实施全链路压测工作方面的一些收获和经验。

18年初:聊聊全链路压测

19年初:再谈全链路压测

20年初:全链路压测探索实践之路

19年双十一备战:全链路压测第一次实践

20年618大促总结:生产全链路压测实践之道

20年双11大促总结:全链路压测落地和演进之路

观点

很多同学问过我关于全链路压测如何实施落地,如何在生产环境实现的技术问题。这里我想借用上面infoQ专栏大佬的一句话:生产全链路压测,表面是一个技术工程,实际上是一个很有难度的组织协调项目

下面我会从几个方面来谈谈我个人现在对于全链路压测的一些思考和经验总结。

技术

很多同学说起全链路压测,都喜欢深究它的技术细节,这没错。但全链路压测想要成功的在生产环境实施,更多的是考验组织协调能力的一个项目。至于技术层面,能说的有很多,这次我们先聊聊比较核心的一些技术点。

隔离方案

流量隔离

既然我们的前提是在生产环境进行压测,那么无论是趁着业务流量低峰期,还是生产全链路压测常态化,对于压测流量的隔离区分,是一定要首先解决的。如下图所示:

目前业内比较常见的方案,有如下两种:

1)中间件改造+流量标透传(业务侵入较多);

2)agent+字节码增强技术(业务侵入较低);

这两种方案的选型,需要基于研发团队的整体技术栈以及业务迭代情况等因素综合考虑。比如我司,采用的是第一种方案。基础架构团队基于spring cloud全家桶二次开发了一套全链路压测框架的脚手架,由业务研发团队接入。

资源隔离

资源隔离主要指的服务器、Redis、MQ、DB等资源。一般来讲大部分企业的业务都是白天流量较高,凌晨是流量低谷。在流量低谷期,直接压测生产的服务,风险相对较小且可控。如果生产服务稳定性较好,且能做到按比例资源隔离以及压测流量识别透传,那么第二种方案反而可以考虑。

且如果要采用资源隔离方案,那么核心链路梳理和区分工作是必须要做的。区分核心和非核心业务,核心业务分级(P0/P1/P2),由小及大的不断覆盖。

数据隔离

压测会产生大量的数据,这些数据如何处理是DBA团队面临的最大挑战。目前来说,业内比较通用的方式都是采用影子库表或者压测数据带特殊标识进入生产业务库表,以tag或者特殊字段做区分。他们的区别如下:

1)影子库+影子表:一般生产库和影子库都是在同一个DB实例上,基础数据会脱敏后同步过去;

2)生产业务表标识:在生产业务表中新增压测标识字段,压测数据需要定时清理(饿了么采用这套方案);

我司采用的方案如下:

DB路由:①.同instance不同schema(风险大);②.不同instance同schema(安全性高,成本高);

Redis路由:①.key值加统一前缀;②.Redis-client做路由;

MQ路由:采用影子topic模式,带压测标识的数据进入影子topic;

ES路由:①.index统一加前缀,提供统一ES client做数据访问,由client做路由;

日志隔离

压测会产生大量日志,为了便于正常的业务问题跟进排查和压测区分,个人建议还是对带压测标的日志进行前缀处理,这样运维同学也可以快速的清理,以免磁盘写满导致生产故障。

改造工作

监控平台

监控系统需要透明化,且压测监控大盘和业务监控大盘需要单独配置。其中有如下的点需要注意:

1)设定告警阈值、告警降噪、专项业务告警;

2)专项告警,需要覆盖核心接口、监控大盘、业务大盘;

3)优点:问题快速定位,避免不透明影响问题的发现和修复速率;

4)容量规划:借助监控平台的赋能,快速梳理清楚系统架构、拓扑关系,才便于做容量规划;

流控平台

流量发起和服务保护功能是全链路压测成功开展的必要前提。服务保护方面,业内常用的组件有Sentinel、Hystrix,他们一般都是基于线程池/信号量来进行流控。

预案平台

常说大促时候,服务稳定性有三大利器:限流、熔断和降级。前面介绍了流控(限流和熔断),那么降级是什么呢?按照我个人的经验,降级预案一般分为主动降级和紧急降级。

主动降级:商品首页缓存&数据兜底、小红点、客户端限流浮层、重试机制等;

紧急降级:收货地址、浮动费率、运费计算、运营位固定等方案;

当然,无论是主动降级方案还是紧急降级方案,都是需要进行业务梳理和细化拆分的,还要和产品运营等团队的同学提前沟通好,避免跨团队沟通的Gap产生。

还有些前置事项,比如业务拆分(订单拆分为正逆向),比如不同业务服务集群隔离,比如DB垂直拆分、读写分离、分库分表等方案,这些都是需要考虑的。

至于异地多活、故障演练、灾备演练,这些更需要成熟的技术体系建设和多方达成一致,才能更好的保障生产服务的稳定性。总的来说,全链路压测除了技术,更多的还需要沟通与协调。

压测实施

到了压测实施阶段,基本就只能硬着头皮硬上了,特别是第一次搞生产全链路压测,至今记忆深刻。生产全链路压测,需要注意以下几点:

服务扩容

需要注意的是,在生产开始压测前,系统需要进行前置扩容,避免资源不足导致整体容量瓶颈。还需要注意的是,在大促峰值流量来临时,尽可能不要去执行扩容操作。

压测方式

至于压测执行方式,业内能玩的基本就是这几种方式。当然,压测前的预热,是必不可少的。压测执行方式方面,主要有如下几项:

1)阶梯递增:这种方式的目的在于不断递增流量,找到系统的性能拐点;

2)峰值脉冲:有些特殊场景,需要区分流量是逐渐变大,还是骤升后保持高峰;

3)系统摸高:关闭熔断降级限流等fallback功能,提高压测流量观察系统性能转折点;

4)预案验证:开启熔断限流等fallback功能,功能是否生效,系统是否能扛得住;

5)破坏性测试:主要为了验证预案的有效性,类似于容灾演练时的预案执行演练,验证后手抢救方案。

注意:执行第4/5项时,建议进行生产业务的功能正确性验证!

预案评审

在预案评审和演练阶段,进行预案演练的目的主要有如下几项:

1)验证预案是否生效;

2)针对预案设定阈值进行测试调优;

3)验证预案生效时服务本身的性能表现;

4)针对上述专项场景进行实战演练;

建议:按照我个人的实施经验,建议输出对应的全链路压测SOP&大促作战SOP

管理

前面关于全链路压测的观点,已经提到了:生产全链路压测,表面是一个技术工程,实际上是一个很有难度的组织协调项目。从管理的角度出发,下面三项是管理者或者项目推动者应该高度重视的。

目标

大家应该都了解SMART体系,在考虑实施全链路压测时候,下面几点SMART目标,也是需要重点考虑的。

目标与标准:SMART5大元素

1)目标必须是具体的(Specific)——业务指标、技术指标、容量指标等;

2)目标必须是可以衡量的(Measurable)——从不同的维度和数据来评估;

3)目标必须是可以达到的(Attainable)——不要设定过高的脱离现实的目标;

4)目标必须和其他目标具在相关性(Relevant)——对业务以及技术团队有什么价值;

5)目标必须说明明确的截止期限(Time-based)——根据日期和任务资源倒排期,保障项目成功;

流程

总结一下,生产全链路压测这个技术项目,可以用三个维度和五个阶段来概括。

五个阶段:准备阶段、执行阶段、故障修复、项目复盘、项目结项;

三个维度:做什么、风险如何处理、事项review(保持信息同步)。

组织

日常工作中,我们一般有版本迭代的常规需求以及一些特殊的独立项目。非业务或者弱业务的事情,可以通过虚拟的组织架构来明确定义不同岗位的职责,避免混乱。

一般来说,生产全链路压测中,虚拟的组织架构一般有如下几种角色:

Sponsor:发起&组织人;

PMO:项目管理、项目经理;

Principal:(主)负责人;

Owner:业务&技术某一领域负责人(领头人);

价值

最开始我司推动实施全链路压测时,我画了下面这张图,用来体现全链路压测的价值:

从我个人角度来说,全链路压测的最大价值在于:

1)成本:降低环境成本,人力成本(不断实践,投入的人力越来越少);

2)问题:提前发现大流量下系统潜在的隐患,提升系统稳定性;

3)容量:提升性能,识别短板,机器配比有了明确的数值,避免不必要的冗余;

4)限流:倒逼各个服务&系统进行限流降级等服务稳定性保障措施,预案验证演练;

5)ROI:降低沟通成本,团队练兵协调组织能力提升,形成自己的一些技术规范和手册;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是预热 压测_换个角度,聊聊全链路压测 的相关文章

  • 查看服务器用户所占空间

    查看服务器个人账户所占空间大小 du h max depth 1 wangsx localhost du h max depth 1 0 mozilla 32K config 46G project 3 7G software 0 data
  • Spring中IOC容器

    IOC入门案例思路分析 1 管理什么 Service和Dao 2 如何将管理的对象存放到IOC容器 配置applicationContext xml 第二步 3 将管理的对象存放到IOC容器 如何获取IOC容器 第三步 4 获取到IOC容器
  • Dos环境变量修改

    批处理修改环境变量 修改用户变量 系统变量 全局变量 永久 临时设置环境变量 设置Java环境变量 关于路径问题 在执行批处理命令时 需要用到路径变量 这里先说明路径相关的变量参数 echo 当前盘符 d0 echo 当前盘符和路径 dp0
  • 6.830 / 6.814: Syllabus 2021 - MIT Lab 2 - SimpleDB Operators

    文章目录 1 参考链接 2 SimpleDB Architecture and Implementation Guide 2 1Filter and Join 2 2 Aggregates 2 3HeapFile Mutability 2
  • 在你的 Android 手机上运行 Golang 程序

    在我们日常开发中 运行一个服务 都是在 shell 或 cmd 下执行命令 像是使用 go run main go 直接编译运行 或是 go build 编译生成可执行文件后 以 xxx 方式运行 Go 支持交叉编译生成各平台的可执行文件
  • Linux中makefile

    第一个版本的makefile Makefile的依赖是从上至下的 换句话说就是目标文件是第一句里的目标 如果不满足执行依赖 就会继续向下执行 如果满足了生成目标的依赖 就不会再继续向下执行了 Make会自动寻找依赖条件所用到的文件 其中 我
  • 2018-12-22-jekyll-theme-H2O

    layout post title jekyll主题theme H2O categories jekyll GitHub tags jekyll GitHub theme H2O jekyll theme H2O 基于Jekyll的博客主题
  • Django基础入门⑩:Django查询数据库操作详讲

    Django基础入门 Django查询数据库操作详讲 Django查询数据库操作 基础操作 查询数据 比较运算符 逻辑符号 去重查询 分组集合 排序查询 分页操作 模糊查询 多表查询 执行原生 SQL 个人简介 以山河作礼 Python领域
  • 【数据结构】数组

    1 计算一维数组存储地址 a i 公式 a i L a 起始地址 i 当前i个元素下标 L 每个元素所占字节 例 int a 10 已知a 1000 sizeof int 4 求a 3 地址 1000 3 4 1012 2 计算二维数组存储
  • SQL注入之时间盲注 和 报错注入(sql-lab第一关为例)

    什么是时间盲注 时间盲注指通过页面执行的时间来判断数据内容的注入方式 通常用于数据 包含逻辑型 不能返回到页面中的场景 无法利用页面回显判断数据内容 只能通过执行的时间来获取数据 时间盲注的过程 1 找到注入点 并选择合适的注入语句 2 爆
  • hexo搭建博客-butterfly主题详细版

    Hexo搭建博客 butterfly主题 前置知识 对于Github和Gitee的基本了解与使用 最关键的是你要知道github为什么访问的这么慢 如何魔法上网访问github 或者说不用魔法如何访问github 本文在可能遇到的问题说明了
  • c语言用串口读温度值,温度传感器与串口

    1 题目要求 有时候我们需要知道在一段时间里温度传感器测量的温度的历史数据 之前的温度传感器例程只是在液晶屏上实时显示出数据而已 并不能查看它的历史数据 所以我们运用之前所有学过的知识来完成这个任务 首先我们先从简单的理念入手 利用串口每隔
  • 数学推导+纯Python实现机器学习算法12:贝叶斯网络

    Python机器学习算法实现 Author louwill 在上一讲中 我们讲到了经典的朴素贝叶斯算法 朴素贝叶斯的一大特点
  • 计算机图形技术在游戏领域应用,计算机图形图像技术在美术领域中的应用

    摘 要 现如今科学技术日益发展的时代 图像的发展已经不能够满足人类的需求 它不只是表現人们视野中的影像 通过各个领域的先进的专业的软件和技术 能够更加成功的表现出来 计算机图形图像技术已经不断的实践在各个领域 下文是对其主要应用的分析研究
  • java iterable 使用_Iterable(迭代器)的用法

    一 前言 在开发中 经常使用的还是for each循环来遍历来Collection 不经常使用Iterable 迭代器 的 下面记录一下terable是一般用法 二 说明 迭代器是一种设计模式 它是一个对象 它可以遍历并选择序列中的对象 而
  • U盘提示格式化怎么办?3个方法轻松解决!

    我的u盘已经很久没用了 今天刚把u盘插入电脑就显示需要进行格式化 但是我还有很多重要的文件都保存在里面呢 这可怎么办呀 有什么方法恢复里面的数据吗 u盘是我们日常生活中常用的移动存储设备之一 但有时可能会遇到一个让人烦恼的问题 那就是当插入
  • TypeScript基础小课堂二

    上期简单的介绍了一下TS的安装和运行环境 现在正式进入知识点阶段 1 TS类型注解 TypeScript 是 JS 的超集 TS 提供了 JS 的所有功能 并且额外的增加了 类型系统 TS中定义变量 常量 可以指定类型 A类型的变量不能保存
  • Mysql Too many connections

    程序启动过程中 连接mysql异常 信息如下 Caused by com mysql cj exceptions CJException Data source rejected establishment of connection me
  • Android 开发简易失物招领二手交易平台

    一 开发环境 1 android studio 客户端 eclipes 服务端 2 java语言 二 效果展示 视频地址 https www bilibili com video BV1Ng4y1v7XC 三 客户端开发 1 首先设置mai

随机推荐

  • 交换机与路由器技术-37-端口安全

    目录 一 端口安全 1 1 课程引入 1 2 基本概念 1 3 作用 1 4交换机端口安全配置 1 4 1 配置最大活跃地址数量 1 4 2 配置静态MAC地址和接口绑定 1 4 3配置接口老化时间 1 4 4 配置MAC地址违规后的操作
  • 什么是微服务架构,有何优缺点?

    什么是微服务架构 通常而言 微服务架构是一种架构模式或者说是一种架构风格 它提倡将单一应用程序划分成一组小的服务 每个服务运行独立的自己的进程中 服务之间互相协调 互相配合 为用户提供最终价值 服务之间采用轻量级的通信机制互相沟通 通常是基
  • npm link的作用与使用

    1 npm link 使用场景 库包在开发或迭代后 不适合发布到线上进行调试 过程繁琐且会导致版本号膨胀 这个时候就可以通过npm link将包放入到node的安装目录下的node modules文件夹中 这样就可以直接使用包名直接在本地调
  • js 实时监听input中值变化 【转】

    文章出处 js 实时监听input中值变化 h1 h1
  • 弗洛伊德算法(floyd)

    弗洛伊德算法和迪杰斯特拉算法都是求两点之间最短路径的问题 弗洛伊德算法使用了动态规划的思想 用二维矩阵记录了所有点之间最短的距离 虽然代码只有几行 但是思想还很值得回味的 其主要的思想就是两个点之间的直接距离能否使用第三个点来缩短 公式 v
  • 看过来——用Python探索《红楼梦》的人物关系

    数据准备 红楼梦 txt 文件一份 金陵十二钗 贾宝玉 人物名称列表 宝玉 nr 黛玉 nr 宝钗 nr 湘云 nr 凤姐 nr 李纨 nr 元春 nr 迎春 nr 探春 nr 惜春 nr 妙玉 nr 巧姐 nr 秦氏 nr 该分列表是为了
  • SpringBoot Admin服务离线、不显示健康信息的问题

    SpringBoot Admin服务离线 不显示健康信息的问题 问题1 SpringBoot Admin服务一直离线 原因 解决方法 重启电脑 重新加载配置文件 问题2 数据显示不全 解决方法 问题1 SpringBoot Admin服务一
  • 进程篇----获取进程句柄(提权、打开)OpenProcess

    对目标进程提权 然后打开 提权的目的是为了防止当前进程的权限无法打开目标进程 获取句柄 BOOL EnableDebugPrivilege TRUE 代表需要提权 BOOL EnableDebugPrivilege FALSE 代表不需提权
  • Python:统计子矩阵(前缀和、尺取法)

    问题描述 给定一个 N M 的矩阵 A 请你统计有多少个子矩阵 最小 1 1 最大 N M 满足子矩阵中所有数的和不超过给定的整数 K 输入格式 第一行包含三个整数 N M 和 K 之后 N 行每行包含 M 个整数 代表矩阵 A 输出格式
  • arduino python scratch_arduino怎么和scratch用

    展开全部 arduino可以和scratch在一起使用62616964757a686964616fe58685e5aeb931333433633365 但环节比较复杂 每个环节都需要注意 具体方法如下 1 由于scratch软件和ardui
  • SpringBoot Bean指定初始化顺序详解

    最近遇到SpringBoot容器外类初始化依赖容器内bean的问题 由于容器内bean初始化有一定顺序 网上查了查资料 这里记录一下 0 前言 本文将介绍几种可行的方式来控制 bean 之间的加载顺序 Order指明顺序 AutoConfi
  • 计算机操作系统的最基本特性,操作系统有哪几大特征?其最基本的特征是什么?...

    操作系统有哪几大特征 其最基本的特征是什么 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 操作系统有哪几大特征 其最基本的特征是什么 操作系统的基本特征 1 并
  • Java串口包Javax.comm的安装

    安装个java的串口包安装了半天 一直找不到串口 现在终于搞定了 做个记录 因为是windows下开发 去下载 http mdubuc freeshell org Jolt javacomm20 win32 zip 完整的2 0版本 还有e
  • visual studio 2008 试用版评估期已结束的解决方法

    在 控制面板 中启动 添加删除程序 选中Vs2008 点击 更改 删除 输入序列号 PYHYP WXB3B B2CCM V9DX9 VDY8T
  • 深入ZooKeeper——ZooKeeper原语和架构

    ZooKeeper基础 设计一个用于协作需求的服务的方法往往是 提供原语列表 暴露出每个原语的实例化调用方法 并直接控制这些实例 这种设计存在一些重大的缺陷 首先 我们要么预先提出一份详尽的原语列表 要么提供API的扩展 以便引入新的原语
  • 输出斐波那契数列前n项以及前n项和

    首先介绍一下斐波那契数列 1 1 2 3 5 8 13 21 34 55 在数学上 斐波那契数列以递推的方法定义 F 0 0 F 1 1 F n F n 1 F n 2 n 2 n N 代码的实现 斐波那契数列 int fibonacci
  • Koa笔记 01:基础入门

    文章目录 目的 基础介绍 Koa Context Request Response 错误处理 总结 目的 Node js最基本的是用来搭建HTTP服务器使用 它内置的模块基本上可以满足基础的HTTP服务器功能 但是如果要实现比较完整的HTT
  • pinyin4j 常见用法

    1 简单介绍 有时候 需要将汉字编程对应的拼音 以方便数据的处理 比如在Android手机应用的开发上 要查询联系人的姓名 通常都是用拼音进行查询的 比如要查询 曹孟德 就可以输入 cmd 即 曹孟德 三个汉字的拼音 caomengde 各
  • 两种方式修改jar内配置文件(1 解压jar,修改并重新打包;2 直接修改jar内指定配置文件)

    参考 修改jar包中的配置文件 木头房子的的博客 CSDN博客 一 jar工具直接修改包内文件 1 列出jar包中的所有目录及目录下文件 找到需要修改的文件并复制路径 如果知道文件具体位置 则跳过此步 列出jar下所有目录及目录下文件 ja
  • 什么是预热 压测_换个角度,聊聊全链路压测

    前言 之前自己也写过好几篇关于全链路压测的文章或者博客 最近看了infoQ上infoQ 数列科技杨德华的专栏 复盘了下自己以往在全链路压测实施方面的工作 发觉还有很多可以做的更好的地方 就以这篇文章来做个总结 顺带说说我自己实施全链路压测工