大厂内部的压测方案设计分享!

· 浏览次数 : 0

小编点评

压测是为了测试系统在压力情况下的表现,目的是为了找出系统的性能瓶颈并进行优化,确保系统在高负载和过载情况下的稳定性和可用性。 如果不进行压测,可能会出现以下问题: 1. 线上容量评估不准确,可能导致资源浪费或系统稳定性问题。 2. 无法给出合理的承诺值,可能导致集群水位设置不合理。 3. 无法发现系统的性能瓶颈,可能在使用过程中出现性能劣化。 4. 验证系统在过载情况下的限流和降级预案是否有效。 5. 对于不支持压测的第三方服务,可能无法进行充分的测试。 压测方案设计主要包括模块级压测和链路级压测,它们有不同的应用场景和环境要求。线上压测需要保证安全性,包括流量隔离、数据隔离和消息屏蔽等。 压测模型包括业务模型、数据模型和流量模型。业务模型需要覆盖核心业务场景和接口,数据模型需要基于线上数据进行改造,流量模型需要模拟业务流量形态。 压测结果的评估包括观测指标和仿真度分析。观测指标包括系统指标、资源指标、连接池使用率、消息队列堆积等。仿真度分析则是比较压测结果与线上真实场景的服务表现相似度。 未来发展趋势是智能化无人值守,通过自动化和智能化的手段进行压测,减少人工干预和安全性问题,提高压测效率和准确性。

正文

 

01为什么要做压测

 

1、什么是压力测试?

不断向被测对象施加压力,测试系统在压力情况下的表现。

 

2、压力测试的目的是什么?

测试得出系统的极限性能指标,从而给出合理的承诺值或者容量告警;

找出系统的性能瓶颈,对性能做出优化;

测试系统在高负载情况下的稳定性;

验证系统在过载情况下的限流和降级预案;

 

3、不做压测会产生什么问题?

线上容量评估不准确,流量增加,服务被打挂

升级前没做压测,升级后性能出现劣化,可用性降低;

无法给出准确的承诺值,导致集群水位过低,资源被浪费或者集群水位过高

系统存在稳定性bug;

 

02压测方案设计


 

压测环境可以简单的分为模块级压测和链路级压测,它们的主要特点和区别如下:

 

1、模块级压测

应用场景:比较变更前后的性能,看性能是否有劣化;定位模块本身的性能瓶颈。

环境要求:不要求与线上环境完全一致,只需要保证变更前后两次的压测在同一个环境即可。

业界方案:维护一套固定的线下环境,进行周期性、常态的压测。

 

2、链路级压测

应用场景:做整条链路的容量评估;评估系统整体可用性。

环境要求:要求尽量与线上环境保持一致,这样的压测数据才是有借鉴意义的。

业界方案:使用线上环境,根据不同的隔离方式使用不同的方案:

 

  • 不做流量隔离,压测流量和业务流量共存,由于没有做隔离,只能在低峰期压测 

  • 逻辑隔离,通过流量调度或者分流方式,将压测流量打到一个压测环境去。压测流量和业务流量在同一个机房跑,但并不会打到同一个业务实例。

  • 物理隔离,利用异地多活的特性,将业务流量从一个机房切出,留下一个空机房做压测。

第一种方案是最接近线上真实环境的,但是存在着一些安全风险;后两种方案安全性高很多,但是没有完全利用整个线上架构,存在一定程度上的失真

 

3、线上压测怎么保证安全性?

  • 流量隔离,如上述方法做流量隔离。但是只做流量隔离是不够的,即使是物理隔离,也会对线上数据进行修改,所以还要做数据隔离。

  • 压测流量经过中间件时进行打标,做压测标记,比如http流量可以配置一个特殊的header。

  • 在业务集群对流量标记进行数据隔离,比如对压测流量产生的日志写到另一个路径(有的系统会对日志做一些分析统计);存储/缓存方面将压测流量产生的数据存储到影子表,正常流量访问正常表;

  • 消息屏蔽,如果消息队列无法识别出压测消息,则会造成线上消息堆积,影响线上流量,所以需要对压测消息进行屏蔽。

  • 对不支持压测的第三方服务进行mock。

     

03压测模型

 

压测要覆盖哪些场景?压测请求和数据如何构造?如何模拟业务流量形态?以上三个问题分别对应压测模型中的业务模型数据模型流量模型

 

1、业务模型

压测需要覆盖哪些业务场景?

需要梳理出核心业务场景,必须包含核心接口和大流量接口,大流量接口可能是一些不对用户暴露的,在内部频繁使用的接口。

 

如何模拟业务场景?

需要理清楚接口之间的关系。对待一些简单查询的接口,没有前后依赖关系,只需要关注流量配比就行了;对待一些复杂业务场景,则需要还原业务处理流程,理清楚接口串联逻辑。可以通过场景录制和场景回放来梳理。

 

2、数据模型

基于线上数据进行改造

请求部分可以直接把线上流量录制下来,对请求加压测标记,并对关键id做便宜;铺底数据可以直接将线上存储数据拷贝到另一个压测表。

 

基于模型构造

通过对线上日志和请求进行分析,梳理出对性能有影响的数据特征和请求特征,根据这些特征构造出数据,其中铺底数据需要通过真实的业务应用来构建。

 

基于线上数据改造的方式

方案很简单,数据构造快,但是强以来系统现有数据,,无法应对新增场景,模型调整不灵活,适用于老服务的线上压测;

 

基于模型构造

不强依赖线上数据,可以人工构造新增场景,维护成本低,只需要调接口就行了,不需要感知线上存储表的变化,模型可以灵活调整,但是方案比较复杂,数据构造慢,使用场景比较广泛,线上线下新老服务皆可。

 

压测模型的特例:流量录制,原样回放

特点:不用模拟业务场景、不需要构造数据;只能录制到线上已有流量的服务和接口;只能在线上环境回放,只能回放只读接口;只适用于老服务读接口的压测;

 

流量录制可以把低峰期、平峰期、高峰期的流量都录制下来,以免出现漏测的情况。

 

3、流量模型:模拟业务流量形态

  • 线上有流量

    观察线上流量形态。

    网上绝大部分开源的监控打点都是5s以上的,最理想的情况可以达到ms级别的,可以通过分析日志来进行实现。

  • 线上没有流量

    分析用户行为或者调用方行为。

    常见的业务流量形态可以分为两种,一种是连续递增型,还有一种是脉冲型(比如抢红包)

 

4、流量预估

流量形态是模拟线上流量曲线,此外我们还需要进行流量预估,计算出压测的量级。

 

已双十一活动为例,我们可以把接口分为三类:

  • 背景接口

    流量不随活动而变化,压测是仅作为背景流量,取近期峰值即可;

  • 普通关注接口

    流量随活动而变化,用通用模型计算

  • 重宝接口

    比如交易接口,取历史大促的峰值

     

04压测结果分析

 

1、观测指标

系统指标

  • qps/tps,最大tps一定是稳定的,如果存在抖动,那系统已经存在问题。

  • 响应时间,从客户端发起请求到收到请求的全过程时间

  • 错误率,根据sla来定

  • 资源指标

  • cpu利用率,一般要低于80%,avg低于60%比较保险

  • 内存使用率,低于80%比较保险,否则可能陷入GC死亡循环

  • 磁盘吞吐/网络吞吐

  • 特性指标,根据具体业务来定

  • 连接池使用率

  • 消息队列堆积

  • pps

 

2、仿真度分析:压测结果是否有价值?

比较同等水位下压测场景和线上真实场景服务表现相似度,可进行仿真度分析的指标:

  • 流量,流量比例,接口覆盖

  • 链路覆盖

  • 机器资源,cpu利用率、内存利用率

  • 可用性指标,时延,错误率

  • 业务指标

把这些指标组装成一个向量,和线上指标做比较,二者差异,差异越小,仿真度就越高。

 

05压测发展趋势

现有痛点:

  • 需要随时观察监控,需要oncall待命

  • 安全性不足

  • 方案复杂,代价大

 

未来发展趋势:

  • 智能化

  • 无人值守

与大厂内部的压测方案设计分享!相似的内容:

大厂内部的压测方案设计分享!

01为什么要做压测 1、什么是压力测试? 不断向被测对象施加压力,测试系统在压力情况下的表现。 2、压力测试的目的是什么? 测试得出系统的极限性能指标,从而给出合理的承诺值或者容量告警; 找出系统的性能瓶颈,对性能做出优化; 测试系统在高负载情况下的稳定性; 验证系统在过载情况下的限流和降级预案;

Springboot tomcat.threads线程数学习

Springboot tomcat.threads线程数学习 摘要 压测完nginx 突然想搞一下springboot内嵌的tomcat的 threads的参数 一不做二不休, 直接就着脚本进行学习和验证 修改参数 产品里面默认参数值是 500 我这边改大一下 tomcat threads: max

[转帖]jmeter 响应时间rt很小,但是tps也很小&jmeter,脚本处理,千万不要用js

一、背景: 在压测的时候,查看jmeter聚合报告,发现rt很小,但是tps也很小。 讲道理来说,响应时间越小,tps应该越大。 一共压测10分钟,发现jmeter请求的样本数量非常小,才8500个请求。 10分钟内,才打出了8500个请求。 tps= 总样本数量/总时间。 时间是固定的600s,总

[转帖]Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测

io_uring是 2019 年 Linux 5.1内核首次引入的高性能异步 I/O 框架,能显着加速 I/O 密集型应用的性能。但如果你的应用已经在使用传统 Linux AIO 了,并且使用方式恰当, 那io_uring并不会带来太大的性能提升—— 根据测试,即便打开高级特性,也只有 5%。除非你

[转帖]修改jmeter内存配置(win&mac&linux)

目录 一、背景: 二、win环境下修改jmeter内存 三、mac&linux环境下修改jmeter内存 四、验证内存是否修改成功 一、背景: 在进行大数据、高并发压测的过程性,有时会遇上JMeter卡死现象,使得测试无法进行,查看日志显示:java.lang.OutOfMemoryError: J

记一次618军演压测TPS上不去排查及优化

本文内容主要介绍,618医药供应链质量组一次军演压测发现的问题及排查优化过程。旨在给大家借鉴参考。

[转帖]Windows磁盘性能压测(1)-DiskSpd

http://www.manongjc.com/detail/59-xrydhtisrajqsxn.html 本文章向大家介绍Windows磁盘性能压测(1)-DiskSpd,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。 目录 一、腾讯

[转帖]FIO 存储性能压测

测试环境 3台服务器:ceph配置内外网分离,外网使用万兆线,内网使用千兆线,osd共21个。 1台客户端:安装fio工具、内核客户端,使用万兆线。 测试目的 针对fio工具中的iodepth(队列深度)和numjobs(线程数)参数,分析使用fio工具时,哪个参数对带宽值测试结果影响比较大。 测试

7.4 C/C++ 实现链表栈

相对于顺序栈,链表栈的内存使用更加灵活,因为链表栈的内存空间是通过动态分配获得的,它不需要在创建时确定其大小,而是根据需要逐个分配节点。当需要压入一个新的元素时,只需要分配一个新的节点,并将其插入到链表的头部;当需要弹出栈顶元素时,只需要删除链表头部的节点,并释放其所占用的内存空间即可。由于链表栈的空间利用率更高,因此在实际应用中,链表栈通常比顺序栈更受欢迎。在实现上,链表栈通过使用`malloc

压榨数据库的真实处理速度

引子 你了解你们线上数据库的真实处理速度吗?请认真思考半分钟再回答。 我先来回答一下:的确知道,因为我特别关注这块内容,咨询过DBA同学。其他朋友欢迎在评论区留言,大家一起探讨。 为什么会突然提出这样一个问题呢,因为前几天看到一篇文章是讲电商系统中如何优化库存预占能力,文中提到:“经压测数据验证,仅