首页 > 其他分享 >如何设计高效的基准场景?揭秘大厂的实战策略!

如何设计高效的基准场景?揭秘大厂的实战策略!

时间:2023-04-07 17:37:53浏览次数:35  
标签:实战 场景 性能 接口 TPS 大厂 基准 线程 揭秘

RESAR性能工程中,场景分为基准、容量、稳定性、异常。每类场景对应不同目标。

基准场景是为找到系统中明显配置及软件Bug,也为容量场景提供可对比的基准数据。基准场景要有确定结论。

线程数应该如何确定,压力线程的连续递增的重要性,以及如何将之前所讲的分析思路应用在具体的分析案例中。

1 性能场景分类

通常拿到的需求:

  1. 评估系统能支持的最大容量。为知道当前的系统容量,目标很明确
  2. 测试并优化系统以支持线上业务。有优化必要
  3. 测试并评估未来几年内,性能容量是否满足业务发展。要求测试未来业务场景

把场景按照目标划分三类:

  1. 验证:评估当前系统容量
  2. 调优:评估并优化当前系统
  3. 推算:评估并推算未来系统容量

这种分类和我们一直强调的按类型分类(也就是基准、容量、稳定性、异常)的关系:

如何设计高效的基准场景?揭秘大厂的实战策略!_响应时间

先确定性能场景目标,再设计对应具体场景。

对于图中的三种目标,位于下方的目标是包含它上方的目标的,比如以调优为目标的场景,包括了以验证为目标的场景。

1.1 按目标

按目标划分出的这三种性能场景,结合RESAR性能过程图:

如何设计高效的基准场景?揭秘大厂的实战策略!_响应时间_02

1.1.1 性能验证(测试)

针对当前系统、模型、环境,验证版本是否有性能变化。这阶段中,不做复杂的性能监控,不做性能分析,不调优。

目前性能市场大部分项目都处于性能验证状态。若对一个已在线上稳定运行很久的系统,去做版本更新的验证倒无可厚非,只要比对下数据。这种项目周期通常在一两周内,不会更长,且也不用更长,除非有大性能瓶颈。

性能验证的项目,很多人一直在做“性能场景执行”和“性能结果/报告”这两步。其他步也不是不做,只是会拿之前文档做个修改,走个过场,想着反正也没人看。所以,性能验证项目就变成:来个版本,用同样脚本、环境、数据,执行一遍。

这样的执行多了后,你会产生误解:原来性能就是这样无聊地重复一轮轮执行,很多人都是在这样项目中认识性能,从而认为自己的技术还挺好,觉得性能也不难嘛。

1.1.2 性能调优

针对当前系统、模型、环境,做性能监控、性能分析和性能优化,并给出具体结论。这是大部分项目都应做到,但实际没做到的。

若一个项目要给出“系统上线后以什么样容量能力运行”这样的结论,那这场景目标的细化相当关键。

很多性能项目最缺少的就是给明确结论。什么叫“给结论”?写TPS多少、CPU使用率多少,叫结论吗?这不叫结论。结论应该有业务含义,如支持1000万用户在线、支持1万用户并发等,这叫结论。

不管你给多少TPS,只要老板或是其他人问:“那我上1000万用户后,系统会死吗?”你知道咋回答?给人感觉,你这性能做得没具体价值。

性能如何体现价值?

我说,我做的项目,我会给承诺:我执行的性能场景范围内,我要保证线上不会死。死了,我觉得这性能项目就不该收费。

像你买个手机,回来一用,发现打不了电话,这时咋办?退货换货还生气。

那做性能为何就给不了这样承诺?若你做完个项目,却不能告诉对方这系统能不能好好活着,那人家要你干嘛,直接砍掉这项目就好,还省成本。

从RESAR性能工程的过程图来看,对性能调优的项目,需完成从“性能需求指标”到“生产运维”的整个过程。这整个过程不是走过场,而是每步都要精雕细琢。

1.1.3 性能推算

性能估算针对的是未来的系统、模型、环境,要对此做出严谨的业务增长模型分析,并在场景执行过程中进行性能监控、分析和优化,同时给出具体的结论。很多项目都想做到性能估算,可往往都只走过场。

性能估算的场景目标中,如要估算未来时间不远,根据业务的发展趋势的确可推算,并且也是合理场景。就怕狮子大开口需求,一说到估算,就是系统十年不宕机。

性能估算项目,也要完成从“性能需求指标”到“生产运维”整过程。有两个环节与性能调优项目中的不同:“性能需求指标”和“性能模型”。

在性能估算项目中,性能需求指标和性能模型一定不是由性能测试人员来决定的,而是由整个团队来决定。上到老板,下到基层员工,都要有统一的认识。要不然等项目做完了之后,你就无法回答老板那个“能不能支持1000万在线“的问题。

1.1.4 小结

如何设计高效的基准场景?揭秘大厂的实战策略!_响应时间_03

1.2 按过程分类

“过程”就是我们应该怎样执行性能场景、性能场景应该从哪里开始的问题:

如何设计高效的基准场景?揭秘大厂的实战策略!_性能分析_04

这四种场景执行过程:

  • 基准场景
  • 容量场景
  • 稳定性场景
  • 异常场景

性能场景中需要且仅需要这四种场景。

正式的性能场景(要给出结果报告的性能场景),关键词:“递增”和“连续”。在性能场景中一定要做到的。因为生产环境没有不连续情况,并且在生产环境中,用户量肯定由少到多、有起伏变化。也只有这两个关键词能把场景的基调给定下来。

1.2.1 基准场景

对系统完全不了解时,先要清楚系统大概容量能力,从哪开始呢?基准场景。

如电商系统,测试11个业务。一上来就把这11个业务脚本做出来,上去压?肯定不行,因为还不知道每个业务能跑多大TPS,有无性能瓶颈。直接混合压,会导致多个性能问题一起暴露并相互影响,难以分析。

所以,先做单接口的基准场景。

先做“单接口的基准场景”,这的单接口在jmeter脚本中是否可理解为一个线程组下面只有一个HTTP请求?若是,那对于那种有上下关联参数的接口,个别入参只能使用一次的情况怎么解决?提前造足够的数据。

① 具体咋做?

拿几个用户测试登录接口的基本性能(这尝试过程本身不是基准场景):

如何设计高效的基准场景?揭秘大厂的实战策略!_性能分析_05

可见1个压力线程大概产生20TPS。

单接口的容量达到多少才不影响混合的容量场景?

若这是单登录接口,须高过50TPS。而我们现在用的是8C 16G,根据CRUD测试经验,即使不走缓存,这样操作要达到500TPS没啥问题。

在一个线程能产生20 TPS前提下,先假设接口能达最大500 TPS都是线性的,就需:

如何设计高效的基准场景?揭秘大厂的实战策略!_性能分析_06

因1个压力线程大概产生20 TPS,从TPS曲线看还是上升较快,所以考虑把Duration(场景的持续时间)放长,让压力不要增加太快,而在这缓慢增加过程中观察曲线变化,以判断后续动作及最大容量。我会这样来确定场景的加压过程。

如何设计高效的基准场景?揭秘大厂的实战策略!_spring_07

在图中,我上到了30个线程,这里也可以不要高出那么多,只要高出25个线程就可以了。我把Ramp-up period设置为600秒,也就是20秒上一个线程,这样就会产生一个明显的连续递增的过程。

② 思路总结
  1. 先确定单线程运行时的TPS值
  2. 根据系统最大的预估容量,设置场景中的线程数、递增参数等。若你不会预估容量,可直接多加一些线程,然后在递增过程中查看曲线变化
  3. 确定正式基准场景的压力参数

当然,对于这个过程,也要在测试过程不断修正。

③ 基准场景的目的
  1. 获得单接口最大TPS:如果单接口最大TPS没有超过容量场景中的要求,那就必须要调优。如某容量场景的目标TPS 100,里面包含某单接口的调用,那这单接口的基准场景测试的TPS就不应低于100。
    若超过了,是否就无需调优了呢?再看第二目的。
  2. 解决单接口基准场景中遇到的性能问题:做单接口测试时,碰到性能瓶颈一定要分析,这就涉及性能分析逻辑。

所以,性能分析基本分为两阶段:

  • 第一阶段:硬件资源用完。基准场景中,要把CPU、内存、网络、IO等资源中的任一耗尽,因为此时易从全局监控的性能计数器看到现象,可以接着去跟踪分析
  • 第二阶段:优化到最高TPS。基准场景中要把单接口TPS调到最高,以免成为容量场景中的瓶颈点

若第一阶段目标达不到,肯定要找瓶颈点:

  • 若硬件资源已用完,TPS也满足容量场景的要求,从成本考虑,这项目无需再继续
  • 若硬件资源用完,但TPS没满足容量场景的要求,须优化

执行一个单接口场景,将上面思路落地。

2 登录接口实战

按基准场景的设计步骤,先试运行接口的基准场景。

基准测试中,试运行只为看下基本的接口响应时间,并非为完成基准场景:

如何设计高效的基准场景?揭秘大厂的实战策略!_响应时间_08

满目疮痍!虽场景执行时间不长,但10个线程上来就报错,响应时间、TPS也达到失望程度,仅12.5TPS,咋办啊?只能分析它!来看如何将性能分析思路落地。

你肯定好奇,报错是报啥错了呢?我认为应先跑下单接口,测试单接口的响应时间(虽然上10个线程也能暴露问题),但一看单接口响应时间就5s+,应该先解决这个问题,再上压力也不迟。

报错就是没断言到“成功”。解决的就是响应时间的问题呀。不解决问题响应时间怎么会下来呢。

2.1 问题现象

如图所示,现象不言而喻。

2.2 分析过程

按RESAR性能分析逻辑,针对响应时间长,先要做拆分时间。通过SkyWalking看时间浪费在哪:

如何设计高效的基准场景?揭秘大厂的实战策略!_spring_09

一个Token的SelfDuration居然要5s多!开源项目坑就是多。看起来功能似乎都实现,Star好几万,但完全没性能。既然Token接口响应时间长,在SkyWaking又看不到完整调用栈,接下来就有两个动作:

  1. 打印一个完整栈,看调用链路
    即使看到调用链路,也还是要跟踪具体方法的耗时,只有这样才能把证据链走下去
  2. 不打印栈,直接连到Java进程,看方法时间消耗
    直接用该法

看方法时间消耗,像JDB/JvisualVM/Arthas这些工具都可。我用Arthas跟踪。

先跟踪Token方法。

trace com.dunshan.mall.auth.controller.AuthController postAccessToken '#cost > 1000' -n 3
 trace org.springframework.security.oauth2.provider.endpoint.TokenEndpoint postAccessToken '#cost > 1000' -n 3
 trace org.springframework.security.oauth2.provider.token.AbstractTokenGranter getOAuth2Authentication '#cost > 1000' -n 3
 trace org.springframework.security.authentication.AuthenticationManager getOAuth2Authentication '#cost > 500' -n 3
 trace org.springframework.security.authentication.ProviderManager authenticate '#cost > 500' -n 3
 trace org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider authenticate '#cost > 500' -n 3

用上面语句层层跟踪,最终到:

如何设计高效的基准场景?揭秘大厂的实战策略!_性能分析_10

其他工具也可达类似效果,别迷恋工具。

既然这authenticate方法耗时比较长,就打开源码看这段:

如何设计高效的基准场景?揭秘大厂的实战策略!_spring_11

Debug进去:

如何设计高效的基准场景?揭秘大厂的实战策略!_性能分析_12

原来,这里是个加密算法BCrypt。

2.3 优化方案

Bcrypt加密时,每次HASH出的值不同,且特慢!用更快的加密方式或去掉这加密算法。

先去掉该加密算法,继续往下走。

2.4 优化效果

如何设计高效的基准场景?揭秘大厂的实战策略!_性能分析_13

同样线程数,现TPS从20涨到80。

可见,通过响应时间的拆分跟踪,知道哪个方法慢,再分析该方法,确定解决方案。

这是最简单的RESAR性能分析七步法应用,似乎分析过程跳过了七步法中的分析架构图这种步骤?实际上在我们分析过程中,也离不开,因为不管看架构图,还是看调用链,都要在脑子中有架构逻辑。

3 总结

根据RESAR性能工程理论,在性能场景中,按执行过程,将场景分类,这些场景各有目的。基准场景的重要目的:

  1. 获得单接口最大TPS
  2. 解决单接口基准场景中遇到的性能问题

这两个目的对我们很重要,都是为了容量场景打基础的。

感受性能分析过程。最后的这个优化效果其实还没有达到对性能的要求。后面将看到更多分析逻辑。

4 FAQ

如果这是一个单登录接口,就必须高过 150TPS,这是最起码的。而我们现在用的是 8C16G 的机器,根据 CRUD 的测试经验,即使不走缓存,这样的操作要达到 500TPS 应该没什么问题。高过150TPS和500TPS怎么来的?

150TPS应写为50TPS,跟业务模型中的数据一致才是。

500是根据经验来的。8C 16G,若是写操作,达到500TPS应该没问题。若是读操作,还会更高,应能达1000TPS以上。

基准测试到底是测接口or测单业务?

看制定的场景目标。容量场景是为模拟被测系统的生产场景。在这之前都放到基准场景中做。 所以按我的逻辑就是,基准场景中是:1, 先测单接口;2. 后测单业务。这两个都放在基准场景中。 由单业务组成的线上真正场景,应该放到容量场景中做。

利用计算公式,利用在线用户数等得到的请求级线程数是为了回答TPS、并发用户、在线用户之间的关系的。

基准场景中,压力线程数通过预估或者直接不断加大线程数得到单接口最大TPS,那个计算的线程数是压测过程中作何用?压力线程预估是为了在实际执行场景过程中来判断的。

基准测试,先测出每个接口单线程的TPS,再根据评估的单接口容量计算要多少线程,最后计算出的线程设置单接口的性能测试?

对压力工具这边的操作,是这样的。不过基准场景中,还要监控分析。

标签:实战,场景,性能,接口,TPS,大厂,基准,线程,揭秘
From: https://blog.51cto.com/u_11440114/6171155

相关文章

  • 实战-JAVA应用程序CPU占用率飙升,定位线程的堆栈信息
    分以下几个步奏:(1)使用命令top-p<pid>,显示你的java进程的cpu情况,pid是你的java进程号,比如14203。(使用jps可以获取到java的进程id或者top直接查看)(2)按H,获取每个线程的CPU情况。(shirt+H)(3)找到内存和cpu占用最高的线程tid,比如14204。(4)转为十六进制得到377C,此为线程id的十六进......
  • 实战项目-美多商城(六)购物车
    购物车应该存储那些数据sku_id(商品ID)count(购买数量)selected(是否被勾选)-登录用户:允许使用服务器资源-存储到redis,每条数据分两种格式存储(为了演示,所以这么搞)-Set:{sku_id_1,sku_id_2......}#有放入集合(自带去重功能),就表示已勾选......
  • 开源云原生存储rook:块存储快速入门实战
    BlockDevices(块存储)在Rook中,块存储有两种存储类型:副本存储和纠删码存储。这两种存储类型都可以在Kubernetes集群中使用,可以通过在CephBlockPool中指定不同的存储类别来实现。「副本存储:」 是一种基于副本的存储方式,其中数据被复制到多个节点上,以提高数据的可靠性和可......
  • Web前端开发必看的100道大厂面试题
    1.说说gulp和webpack的区别开放式题目Gulp强调的是前端开发的工作流程。我们可以通过配置一系列的task,定义task处理的事务(例如文件压缩合并、雪碧图、启动server、版本控制等),然后定义执行顺序,来让Gulp执行这些task,从而构建项目的整个前端开发流程。通俗一点来说,“Gulp就像是一......
  • 实战:硬盘还有空间,却提示磁盘已满怎么破
    今天loginserver的一个网站,发现login后没有生成session。根据以往经验,一般是空间已满导致session文件生成失败。创建个文件看一下:提示文件无法创建,我们来查看磁盘空间是否已满使用df -h查看磁盘空间发现空间剩余16G,可以排除磁盘空间已满的情况,导致文件生成失败还有另一个原因......
  • 谷歌seo搜索留痕揭秘:如何轻松管理与保护您的在线足迹?
    在数字时代,我们的在线足迹比以往任何时候都更加重要。为了保护我们的在线隐私和安全,我们需要了解如何使用谷歌SEO搜索留痕功能。在本文中,我将分享我的个人经历,并介绍使用谷歌搜索留痕的好处。去年,我开始关注个人隐私和网络安全问题,尤其是与我的在线足迹有关的问题。我意识到我需要......
  • 王道C语言笔记NOTE-中级阶段Note8-排序算法真题实战
    一、2016年43题1、问题描述2、答案解析(1)、算法的基本设计思想由题意知,将最小的n/2个元素放进A1中,剩余元素放在A2中,分组结果即可满足题目要求。仿照快速排序的思想,基于枢轴把n个整数划分成两个子集,根据划分后枢轴所处的位置i分别处理:①、若i=n/2,则分组完成,算法结束;②、若i<......
  • 实战项目-美多商城(五)全文检索
    商品搜索需求当用户在搜索框输入商品关键字后,我们要为用户提供相关的商品搜索结果实现可以选择使用模糊查询like关键字实现(效率极低,多字段查询不方便)全文检索方案引入全文检索的方案来实现商品搜索全文检索即在指定的任意字段中进行检索查询全文检索方案需要......
  • 互联网项目实战——Athena-OSS分布式文件存储服务设计
    摘要在系统中需要有统一的存储系统,用于较大型的文件和图片进行存储,Athena系统中利用开源的FastDFS来构建Athena分布式文件存储系统OSS服务。用于整个系统的存储服务。博文将详细的介绍分布式存储系统的背景和意义以及相关的技术选型与原理,供大家学习参考。一、分布式文件存储系统背......
  • python入门到实战系列一
         学习 pyhton 语言首先需要掌握它的基本规则,还有它支持什么数据类型,下面画一张图来了解它支持的数据类型有哪些?  上面这几个数据类型在工作中经常使用,下面不分先后介绍每一种数据类型基本使用。一、字符串  第一,字符串基础对于它的定义就不在这里说明,下面介绍......