您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
 
     
   
 
 订阅
性能测试分析
 
作者: 美得冒泡的姗迪
   次浏览      
 2022-6-8
 
编辑推荐:
本文将介绍 性能分析的基本概念:QPS/TPS ,希望同样对你有所帮助。
本文来自于简书 ,由Alice编辑、推荐。

很多人不会做性能分析或者调优的关键点在于:不知道怎么做性能分析。很多人觉得性能调优是一件很难的事情,无从下手。其实这些都有方法,只要掌握了一定的方法和技巧,这不是一件很复杂的事情。

两个最朴实的概念:QPS/TPS

QPS : Query Per Second TPS : Transactions Per Second 这两个概念起源于数据库系统,是衡量数据库性能的重要指标。 数据库的操作可以分为增、删、改、查这几类。 QPS用在对于查询类的性能统计,这类查询基本不需要在事务块中进行限制,不用在独立的事务块中保持独立;对于非查询类,通常是需要在事务块中进行数据的ACID保证,所以对事务或者资源具有独占性,性能情况会受制于独占资源的消耗。` 在应用系统中,QPS和TPS的概念经常已经混淆。 但是其基本语义未变:可以泛指在特定周期内的处理能力。

影响QPS/TPS的主要因数

先举例几个压测是经常遇到的几个场景

场景1:**线程池和QPS的关系**

某一天一个开发做压力测试。在一台4核机器上测试。先是用10个用户压测,测出QPS为60;

再用20个用户压测,测试QPS 为100;

最后一次用30个用户压测,测试QPS为100,怎么30个用户的QPS 就不增加了呢?

于是他增加了线程池的线程数量由10调整到30,再次使用30个用户进行压测,居然QPS还是200左右。

他索性又把线程池的线程数量增加到50,再次30个用户压测,奇怪了!

怎么QPS还是200左右,没有增加呢!

请问:为什么增加线程池,QPS先是上升,再次增加就不上升了呢?

场景2:**什么是瓶颈资源**

某一天这个开发做压⼒测试。

在一台4核机器上测试。

这次是一个新的业务,此业务中含有数据库事务,对单条记录操作的时候会上锁。

于是他开始测试,用10个用户压测,测试QPS为40左右; 于是他用20个用户压测,居然还是40左右;30个用户,依然如此。

好吧,既然不想,老招数,加⼤大线程池,由10上升到20,再到30依然没有。

绝望了,性能实验室,有台8核机器,来吧,试试。。。。 QPS居然还是40左右。。。

请问:为什么增加线程池,甚⾄至增加CPU核数,QPS没有增加呢?

场景3:**响应时间和QPS的关系**

某⼀天这个开发接到一个任务。

又是烦人的外围配合改造,改造是这样的:某个系统做了性能优化,老的服务调用需要50ms,⽽现在只需要20ms。

这个开发一想,这不是很好嘛,可以减少业务处理时间,那请求的响应时间自然就变少了,那QPS不是就增加了么?

想的倒是很美。。。

于是配合改造,发布上线,到线上一看,XX的,响应时间确实少了,但是怎么QPS没有增加呢?

请问:为什么响应时间变少,QPS没有增加,响应时间和QPS的关系是什么呢?

通过上面的几个场景,没有经验的人可能会比较迷惑。

传统QPS公式可以写成:QPS = 1000ms/响应时间 * CPU核数,这个是多数人的理解: 当机器由4核换成8核的时候,QPS一定是会增加的,因为可以用于处理的CPU更多了 当响应时间变少的时候,分母变小了,所以QPS增加了。

但是通过上面的例子可以看出,实验结果不是想得这样。

(当然如果你怀疑列举的场景,可以自己做下实验)

那么问题来了:**是什么影响了QPS,QPS和CPU、线程、响应时间、并发量之间的关系是什么?

关系图.png

深入剖析响应时间

多数人不能正确的去分析QPS,绝大部分的原因是不知道响应时间具体消耗在什么资源上,所以做不了正确的分析和判断。 所以自己先从响应时间上去解释,下列的响应时间模型是我自己提炼的,未必是完全符合理论或者所有人的理解。 V1版本的响应时间模型:响应时间=请求传输时间+服务端处理时间+响应传输时间 这个版本的服务端处理时间很笼统。

V2版本的响应时间模型:

响应时间=请求传输时间+内部服务处理时间+外部服务处理时间+响应传输时间 这个版本的服务端服务端处理时间拆分成两部分

V3版本的响应时间模型:响应时间=请求传输时间+服务内部CPU运算+服务内部IO时间+外部服务处理时间+响应传输时间 这个版本的服务端服务端处理时间进一步拆分,拆分为不同的资源消耗

V4版本的响应时间模型:响应时间=请求传输时间+服务内部CPU运算+服务内部IO时间+内部共享资源时间+外部服务处理时间+响应传输时间

通过上面的分解,对响应时间有个分解。最后把响应时间的组成提炼为如下内容

理解最优线程数

最优线程数的定义:使用最少的线程保持资源最大化的使用。 常有两种情况: 当线程数较少的时候,压力情况下,可能造成线程资源不足,请求需要等待线程释放后,才能处理。 当线程数量较多的时候,线程自身也是需要消耗内存资源,导致资源的浪费;同时,线程较多的时候对于线程的调度和争用也会影响性能。 对于最优线程数常常有一些经验或者理论上的值: N+1:保证CPU在一定的阻塞情况下,也有可以运行的线程进⾏调度,进 而保证CPU的运⾏和利用 N-1:减少线程和线程调度间的争用和调度 这些理论值常常是没用的!!!

理解响应时间、最优线程数、CPU之间的关系

下面以一个例子来说明这几个的关系:假设一个请求的响应时间是100ms,1个CPU,1个线程的情况下推演。

一个请求的执行快照如上图。处理过程大概为:请求1绑定到线程1,线程1绑定到cpu1,cpu1上执行100ms完成本次请求; 线程1继续处理后续请求,比如请求2、请求3。 但是通过上面响应时间模型可以得知,一个请求的响应时间不一定全部都是CPU耗时组成,那么可能运行的快照如下图:

当一个请求只有20ms在CPU上运行,其余的80ms都在等待外围的响应,那么可以得出:线程1会在等待外围80ms是阻塞;cpu1会在线程1阻塞时空闲。 那么为了让CPU满转,资源使用最大化,那么需要使用几个线程呢?

通过上图可以看出,当有线程阻塞,不断的补充线程进行执行,就可以让CPU满转。大概可以得出:最优线程数=线程总时间/线程CPU执行时间 * CPU核数。 似乎分析到这里,应该就快清晰的知道答案了,但是我们离的还远。下面进一步分析

理解瓶颈资源:多资源情况下的线程调度分析

假设这样的一个场景: 假设一个请求的服务器端处理时间为10ms。其中cpu执行5ms,4个CPU;数据库操作时间5ms,应用总共有2个可用连接 那么最后线程数是多少?如果按照上一步计算:最优线程数=线程总时间/线程CPU执行时间 * CPU核数=10ms/5ms * 4 = 8 上面的计算正确吗?为了解释多资源情况下的线程调度,使用如下几个快照分析。 把CPU时间划分为5ms为一个时间段区域 1、第1个5ms快照的运行情况如下:同时有4个线程在4个CPU上运行,cpu处于满转。

2、第2个5ms快照的运行情况如下:同时有4个线程在4个CPU上运行,cpu处于满转;2个线程处理数据库操作。

3、第3个5ms快照的运行情况如下:同时有4个线程在2个CPU上运行,cpu处于满转;2个线程处理数据库操作;其他被阻塞

4、第4个5ms快照的运行情况如下:同时有4个线程在2个CPU上运行,cpu处于满转;2个线程处理数据库操作;其他被阻塞。

5、第5个5ms快照的运行情况如下:同时有4个线程在2个CPU上运行,cpu处于满转;2个线程处理数据库操作;其他被阻塞。

通过上面的内容可以看出,最优线程数不仅仅取决于CPU核数,当在多资源的情况下时:取决于资源短板。 这个类似于水桶原理:

说了这么多,是不是感觉没啥鸟用!

通过上面的推导,简单明了的告诉几个理论上的公式

最优线程公式

最优线程数量=线程总时间/瓶颈资源时间 * 瓶颈资源并行数

一个线程1S可以处理的请求数

1000/线程总时间

QPS公式1

QPS =最优线程数量* 1000/线程总时间

QPS公式2

QPS=1000/瓶颈资源时间 * 瓶颈资源并⾏行数 通过公式2可以看出:影响QPS的关键因素受限于瓶颈资源,所以大部分的性能优化问题都是在解决:如何找出瓶颈资


 

 
   
次浏览       
相关文章

微服务测试之单元测试
一篇图文带你了解白盒测试用例设计方法
全面的质量保障体系之回归测试策略
人工智能自动化测试探索
相关文档

自动化接口测试实践之路
jenkins持续集成测试
性能测试诊断分析与优化
性能测试实例
相关课程

持续集成测试最佳实践
自动化测试体系建设与最佳实践
测试架构的构建与应用实践
DevOps时代的测试技术与最佳实践

最新活动计划
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
LLM大模型应用与项目构建 12-26[特惠]
UML和EA进行系统分析设计 12-20[线上]
数据建模方法与工具 12-3[北京]
SysML建模专家 1-16[北京]
 
 
最新文章
大数据平台测试
微服务架构下的测试之道
从零开始掌握微服务软件测试
如何进行测试需求分析:从接收需求到用例设计
python_selenium自动化测试框架
最新课程
测试需求分析与测试用例设计
性能测试方法与技术
自动化测试框架设计高级实践
接口自动化测试方法与工具
软件测试方法与实践(贯穿案例)
更多...   
成功案例
某支付企业 单元测试与重构培训
北京 用户体验、可用性测试与评估
某军工研究单位 自动化测试方法、案例与工具
知名消费金融公司 探索性测试与测试分析
北京 航天科工某子公司 软件测试架构师
更多...