一、软件性能:
对一个产品而言,性能的及时性是用响应时间+吞吐量来进行衡量。
事务:一个用户操作行为,或者说是事务,比如单个的事务,响应时间就是完成事务所需要的时间,对用户而言,响应时间就是端到端的用户基本体验。比如登录打开抖音,视频显示播放,这个过程总共耗时是3秒,那么就是抖音的响应时间。
下面具体说下不同视角下对性能这部分的理解:
1、用户视角
在用户的角度而言,软件性能就是用户操作的响应时间。⼀般而言关于响应时间的说法具体如下:
• 1-3秒,属于优的表现
• 3-5秒,可以接受,属于中间的表现
• 5秒以上,无法接受
在实际的测试中,如果响应时间超过5秒以上,就需要提交bug给开发。
2、运维视角
运维除了关注响应时间外,也会关注更多底层的资源信息,这些资源信息具体可以汇总为如下:
• 系统资源(CPU和内存):查看系统资源的指标有:cpu 、内存、 资源的负载情况
当cpu和内存的资源>=70%,系统可能会出现瓶颈的情况。
• 数据库资源(IOPS资源):所有的数据都是来自数据库:
a、连接数:连接数泄露(使用了连接数,但是没有释放)
b、读写速度:IOPS
• JVM(针对Java技术栈)内存是否够用:Java应用程序的CPU和内存使用率。
比如:分配JVM资源:512M,CPU:1G,用完,就会出现内存溢出/内存泄露:OOM
• 系统的最大容量: 系统最大处理的任务数:
比如:双11,总共有1亿个用户,但是同时进行支付,5千万用户可以同时进行,另外的5千万用户就可以排队处理,排队的策略是什么?→按照线程的优先级来设置的。
每个任务都是有优先级的,那么最大优先级是10,最小是1,默认是5。
在系统资源不紧张的时候,优先级就会显得不是那么特别的突出,但是在系统资源特别紧张的时候,优先级高的优先执行。
而优先级一般是按照顾客所支付的资源大小来进行优先级的排序,比如上述例子,顾客支付的金额越多,就享有的优先级越高。
3、开发视角
开发的关注度会更加的全面,毕竟代码都是程序员来编写的,具体可以汇总为如下:
• 前后交互的响应时间 :duration时间=request时间+response时间
• 中间件的参数设置:比如设置JVM的合理内存大小等
• 内存释放泄露
• 连接数泄露
• 是否存在不合理的内存使用方式
• 是否存在不合理的线程同步方式:
线程同步:A和B两个任务,有100张车票,A和B同时进行抢购,就有可能会出现A和B同时各抢了100 张,这明显不合理,解决方式:加锁机制
加锁机制:A操作的时候,B不能操作,A操作完了,B才能够操作
• 系统中是否存在不合理的资源竞争
• 系统架构&代码结构
4、WEB前端
所谓前端的性能目前也是性能测试中比较热门的技术之一,关注的点具体汇总为如下:
• 浏览器的资源加载(HTML解析,图片资源加载,CSS文件资源加载)
• 前端缓存技术的优化是否合理性:页面的所有图片可以放到一个缓存的地方,方便下次的调用
• 前端与后端的交互性耗时
5、测试视角
测试关注的视角属于全栈性的,需要考虑用户视角的产品体验,也要监控以及关注运维视角和开发视角,所以性能测试中测试的具体工作职责可以总结为:
• 设计合理的场景和测试用例来验证系统的资源数据
• 验证在高并发的情况下架构是否满足
• 给架构师以及开发人员提供中间件配置参数的合理值范围
• 使用技术手段监控系统,DB,中间件,全链路监控的方式来监控系统资源情况
二、软件性能的的常用术语
1、响应时间
⼀次操作完成的时间,也就是客户端发送请求到服务端后,服务端返回到客户端的响应数据的时间。包含了用于等 待和服务的时间,也包括用来返回结果的时间。响应时间=网络时间+应用程序的处理时间,具体如下图所示:
前端:vue框架→nginx:Web Server
前端:django基于Python的开源web应用框架:应用Server
数据库:MySQL:Data Server
2、并发用户数
性能测试的核心是验证当前系统能否支持现有用户的访问,也就是说系统可以承受在同一时间段多少用户来访问系统,具体如下图所示:
并发用户数,可以说:不论从业务视角出发,还是服务端承受压力而言,描述的是同一时间同时向客户端发出请求的客户,某些时候也称为“并发测试”。这中间主要体现的是服务端承受的最大并发访问数。
3、吞吐量
吞吐量指的是操作的速度,也就是每秒操作数或者每秒业务数。或者也可以说单位时间内客户端请求的数量,直接体现系统的性能承载能力。
并发和吞吐量的区别:并发是在同一时间里客户向服务端发送的请求,而吞吐量是在同一时间里客户发送了请求但服务器不一定会立即处理,会使用排队策略。比如:双11,在零点有1亿个客户向服务端发送请求,但是支付的时候不一定处理这1亿个用户的支付操作。
4、使用率
对于服务所请求的资源,使用率描述的是所给定的时间区间内资源的繁忙程度。
对于存储资源来说,使用率指的就是所消耗的存储容量。如一个业务中,会使用大量的内存资源,总的内存资源是4G,在⼀定数据量的情况下执行该业务,内存使用率从100M一直占用到3G,然后随着业务形态内存资源得到释放呈下降的趋势,那么可以说内存使用率最高为3/4=75%,可能会存在OOM的错误信息,也可能会存在内存泄露的情况。所以使用率分两个维度,一个是系统资源的使用率,另外一个是系统内部署服务对系统资源的使用率。
5、思考时间
思考时间英文名称是Think Time,也称为休眠时间,在业务视角,思考时间指的是用户在进行操作时,每个请求之间的间隔时间。
6、IOPS
该术语主要是针对数据库的,也就是每秒发生的输入/输出操作的次数,是数据传输的一个度量方法。用于磁盘的读写,IOPS指的是每秒读和写的次数。而磁盘的读写反映在硬盘上。
7、TPS/QPS
事务指的是某个操作或者是一组操作的组合,如登录的事务那么就是输入账户和密码,点击登录按钮跳转到登录成 功的页面并且信息都加载出来。
TPS统计的是每秒处理的事务数,即系统每秒能够处理的事务的数量。
QPS指的是每秒查询率,如DB服务器在规定时间内处理流量多少的衡量标准。
三、软件性能测试理论
1、资源调度
在操作系统级别,专业的来说,调度器可以理解为:CPU时间划分给活跃的进程和线程,而且维护⼀套优先级的机制,这样更重要的工作可以更快的执行,调度器会跟踪所有ready-to-run状态的进程。
在计算机里面,操作系统运行的最小单位是进程,而进程最小的运行单位是线程。线程在计算机执行的时候,是由操作系统来进行分配资源的,操作系统根据调度的算法来分配以及决定哪个线程可以执行,哪个线程暂时不能执行。最常见的是抢占式调度:根据任务的优先级,优先级高的优先分配资源,优先级低的,后分配资源。操作系统通过系统的时间分片,结合调度的算法来分配资源。
调度器(调度策略)可以动态的调优先级以提升工作负载的性能,工作负载可以做如下的区分:
• CPU密集型:应用程序执行繁重的计算,通常运行时间比较长,会占用大量的CPU,占用极少数的内存资源。即计算型的程序 ,程序存在大量的计算,比如海量数据筛选出具体的数据。
• IO密集型:应用程序执行I/O,计算不多,会占用大量的内存资源,占用极少数的CPU。系统的最小粒度是线程,也就是说系统调度中粒度最细的就是对线程的调度。即读写类的程序,程序存在大量的文件IO的读写,比如优惠券发放,短信营销等。
2、等待队列
在程序中,都会涉及到等待队列的,不管是同步交互还是异步的交互中,都会涉及它的最大队列,这样设计的核心思想是防止在客户端高并发的情况下,服务端在没有队列的情况下,出现雪崩以及最终导致服务端出现瘫痪,因此队列等待是非常核心并且是非常有必要的。
在等待队列中,测试需要得出如下几个性能数据:
a、队列设置的值是多少?最大可以运行的任务是多少?
b、需要测试到排队的策略机制,也就是说模拟大批量的程序进行排队,然后一个任务执行结束后,队列位置释放 一个,等待中的可以立刻进入,然后执行,这中间就设计到先进先出还是先进后出,以及线程优先级的设计策略。
c、线程在排队的过程中,设置最大的等待时间是多少,也就是说一个线程不可能永远处于等待中,那么等待多 久,还是没到执行的阶段,这个时候服务针对排队等待的线程处理的机制是?这个时间专业术语就是:访问等待时间 。
d、那么⼀个线程完整的时间是由三部分组成的,响应时间:客户端发起请求的时间+访问等待时间+逻辑执行时间 +返回给客户端的时间。
一般在测试中,可以把每个线程名称设置为uuid,这样它都是独立的,可以依据这个uuid,让开发同学配合输出每个阶段的时间输出,然后就可以得到每个阶段的具体时间了,根据时间再来判断时间是否优化。
补充:队列:Queue 规范:First In First Out :先进先出
队列方法: put:往队列里面放数据
get:取出队列里面的数据
empty:判断队列是否为空
队列注意事项: a、当队列满了的时候,再往里面放的时候是无法放的,如果是程序,就会卡死。
b、当队列为空的时候,再取出数据,也会卡死。
生产者-消费者模型: 生产者(Producer) :不断的生产数据,使用的方法是put。
消费者(Consumer):不断的消费数据,使用的方法是get。
四、性能测试模型
性能测试模型也可以理解为性能测试步骤,具体汇总为如下:
• 测试前期准备
1、梳理性能的目标(性能测试的目标是测试主导,然后测试制定出来后,和团队里面其他相关的人一起决定)
性能测试的目标参考依据是什么?是产品的需求文档以及产品的用户体量和系统的架构。
2、性能测试的数据
3、性能测试场景的设计以及性能测试用例的设计
• 测试工具技术引入
1、LoadRunner:HP公司研发的工业级别的性能测试工具,是收费的一款性能测试工具。
2、JMeter:100%使用Java语言研发的性能测试工具,是开源的,互联网公司基本使用的都是该性能测试工具。
3、Locust:是基于Python的协程来设计的性能测试工具,需要编写Python代码来进行性能测试。
4、Gatling:是微服务架构下高性能的性能测试工具。
• 性能测试计划
1、明确每个性能测试的任务开始的时间和结束的时间。 ’
2、明确每个任务的具体负责人。
3、明确性能测试工具。
当然也会进行性能测试计划的评审,这期间会涉及很多人员:架构师、测试、开发、产品经理等。
• 测试设计与开发
1、使用选择好的工具/代码,来设计场景/编写代码来测试设计好的性能测试用例。
• 测试执行与管理,数据收集
1、多次测试执行,收集每次性能测试的数据(系统资源:CPU和内存、数据库资源:连接数和IOPS、JVM资源:内存资源 、响应时间:最大,最小,平均,中位数,90%,95%,99%、吞吐量) 2、数据收集后的数据可视化展示。 • 测试分析 1、实际收集的结果,来得到最终的结论:吞吐量,响应时间等等,与期望的目标进行对比,来判断是否达到目标。
性能测试的注意事项:测试环境服务器的配置与生产环境服务器的配置必须一致,这样出的结论才具有参考价值。
标签:优先级,性能,时间,内存,测试,线程 From: https://www.cnblogs.com/wangwt123/p/16591182.html