性能测试理论(一)
一、什么是软件性能
所以对一个产品而言,性能的及时性是用响应时间或者吞吐量来进行衡量,一个用户操作行为,或者说是事务,比如单个的事务,响应时间就是完成事务所需要的时间,对用户而言,响应时间就是端到端的用户基本体验。比如登录打开抖音,视频显示播放,这个过程总共耗时是3秒,那么就是抖音的响应时间。下面具体说下不同视角下对性能这部分的理解。
1、用户视角
响应时间大概规范
• 1-3秒,属于优的表现
• 3-5秒,可以接受,属于中间的表现
• 5秒以上,无法接受
2、运维视角
(1)、系统资源:一般大于70% cpu 内存 可能达到瓶颈
平均负载
(2)、所有的数据都是来自数据库:
①、连接数:连接数泄露(使用了连接数,但是没有释放)
②、读写速度:IOPS
(3)、JVM(针对Java技术栈):Java应用程序的CPU和内存使用率
512M,CPU:1G 内存溢出/内存泄露:OOM
(4)、系统最大处理的任务数:
1亿,但是同时进行支付,5千万可以同时进行,另外的5千万就可以排队处理,排队的策略是什么?----》按照线程的优先级来设置的 每个任务都是有优先级的,那么最大优先级是10,最小是1,默认是5 在系统资源不紧张的时候,优先级不是那么特别的突出 但是在系统资源特别紧张的时候,那么优先级高的优先执行
3、开发视角
开发的关注度会更加的全面,毕竟代码都是程序员来编写的,具体可以汇总为如下:
• 前后交互的响应时间
• 中间件的参数设置
• 内存释放泄露
• 连接数泄露
• 是否存在不合理的内存使用方式
• 是否存在不合理的线程同步方式
• 系统中是否存在不合理的资源竞争
• 系统架构&代码结构
4、测试视角
用户关注的视角属于全栈性的,需要考虑用户视角的产品体验,也要监控以及关注运维视角和开发视角,所以性能测试中测试的具体工作职责可以总结为:
• 设计合理的场景和测试用例来验证系统的资源数据
• 验证在高并发的情况下架构是否满足
• 给架构师以及开发人员提供中间件配置参数的合理值范围
• 使用技术手段监控系统,DB,中间件,全链路监控的方式来监控系统资源情况
5、web前端
所谓前端的性能目前也是性能测试中比较热门的技术之一,关注的点具体汇总为如下:
• 浏览器的资源加载(HTML解析,图片资源加载,CSS文件资源加载)
• 前端缓存技术的优化是否合理性
• 前端与后端的交互性耗时
二、性能术语
1、响应时间
⼀次操作完成的时间,也就是客户端发送请求到服务端后,服务端返回到客户端的响应数据的时间。包含了⽤于等 待和服务的时间,也包括⽤来返回结果的时间。响应时间=⽹络时间+应⽤程序的处理时间,
2、并发用户数
性能测试的核心是验证当前系统能否支持现有用户的访问,也就是说系统可以承受在同一时间段多少用户来访问系统
并发用户数,可以说:不论从业务视角出发,还是服务端承受压力而言,描述的是同一时间同时向客户端发出请求的客户,某些时候也称为“并发测试”。这中间主要体现的是服务端承受的最大并发访问数。
3、吞吐量
吞吐量指的是操作的速度,也就是每秒操作数或者每秒业务数。或者也可以说单位时间内客户端请求的数量,直接体现系统的性能承载能力。
并发是同一时间发送的请求数,吞吐量是是否能处理完,处理速度
4、使用率
对于服务所请求的资源,使⽤率描述的是所给定的时间区间内资源的繁忙程度。对于存储资源来说,使⽤率指的就 是所消耗的存储容量。如⼀个业务中,会使⽤⼤量的内存资源,总的内存资源是4G,在⼀定数据量的情况下执⾏该 业务形态,内存使⽤率从100M⼀直占⽤到3G,然后随着业务形态内存资源得到释放呈下降的趋势,那么可以说内 存使⽤率最⾼为75%,可能会存在OOM的错误信息,也可能会存在内存泄露的情况。所以使⽤率分两个维度,⼀ 个是系统资源的使⽤率,另外⼀个是系统内部署服务对系统资源的使⽤率。
5、思考时间
思考时间英文名称是Think Time,也称为休眠时间,在业务视角,思考时间指的是用户在进行操作时,每个请求之间的间隔时间。
6、IOPS
该术语主要是针对数据库的,也就是每秒发⽣的输⼊/输出操作的次数**,是数据传输的⼀个度量⽅法。⽤于磁盘的 读写,IOPS值的是每秒读和写的次数。
7、TPS/QPS
事务指的是某个操作或者是⼀组操作的组合,如登录的事务那么就是输⼊账户和密码,点击登录按钮跳转到登录成 功的⻚⾯并且信息都加载出来。
TPS统计的是每秒处理的事务数,即系统每秒能够处理的事务的数量。
QPS指的是 每秒查询率,如DB服务器在规定时间内处理流量多少的衡量标准
三、性能测试理论
1、资源调度
在计算机里面,操作系统运行的最小单位是进程,而进程最小的运行单位是线程。线程在计算机执行的时候,是由操作系统来进行分配资源的,操作系统根据调度的算法来分配以及决定那个线程可以执行,那个线程暂时不能执行。
2、抢占式调度
根据任务的优先级,优先级高的优先分配资源,优先级低的,后分配资源。操作系统通过什么来分配资源了?是通过操作系统的时间分片,结合调度的算法来分配资源、
在操作系统级别,专 业的来说,调度器可以理解为:CPU时间划分给活跃的进程和线程,⽽且维护⼀套优先级的机制,这样更重要的⼯ 作可以更快的执⾏,调度器会跟踪所有ready-to-run状态的进程。
• CPU密集型:应⽤程序执⾏繁重的计算,通常运⾏时间⽐较⻓,会占⽤⼤量的CPU
• IO密集型:应⽤程序执⾏I/O,计算不多,会占⽤⼤量的内存资源 系统的最⼩粒度是线程,也就是说系统调度中粒度最细的就是对线程的调度。
cpu:计算型的程序 程序存在大量的计算,比如海量数据筛选出具体的数据 io:读写类的程序,程序存在大量的文件IO的读写,比如优惠卷发放,短信营销
3、等待队列
在程序中,都会涉及到等待队列的,不管是同步交互还是异步的交互中,都会涉及它的最⼤队列,这样设计的核⼼ 思想是防⽌在客户端⾼并发的情况下服务端在没有队列的情况下出现雪崩以及最终导致服务端出现瘫痪,因此队列 等待是⾮常核⼼并且是⾮常有必要的。在等待队列中,测试需要得出如下⼏个性能数据:
①、队列设置的值是多少?最⼤可以运⾏的任务是多少?
②、需要测试到排队的策略机制,也就是说模拟⼤批量的程序进⾏排队,然后⼀个任务执⾏结束后,队列位置释放 ⼀个,等待中的可以⽴刻进⼊然后执⾏,这中间就设计到先进先出还是先进后出,以及线程优先级的设计策略
③、线程在排队的过程中,设置最⼤的等待时间是多少,也就是说⼀个线程不可能永远处于等待中,那么等待多 久,还是没到执⾏的阶段,这个时候服务针对排队等待的线程处理的机制是?这个时间专业术语就是:访问等待时间
④、那么⼀个线程完整的时间是由三部分组成的,响应时间:客户端发起请求的时间+访问等待时间+逻辑执⾏时间 +返回给客户端的时间。⼀般在测试中,可以把每个线程名称设置为uuid,这样它都是独⽴的,可以依据这个 uuid,让开发同学配合输出每个阶段的时间输出,然后就可以得到每个阶段的具体时间了,根据时间再来判断时间 是否优化。
4、队列:
Queue 规范:First In First Out ----》先进先出 队列方法:
put:往队列里面放数据
get:取出队列里面的数据
empty:判断队列是否为空
5、队列注意事项:
1、当队列满了的时候,再往里面放的时候是无法放的,如果是程序,就会卡死
2、当队列为空的时候,再取出数据,也会卡死
6、生产者消费者模式:
生产者(Producer) :不断的生产数据,使用的方法是put
消费者(Consumer):不断的消费数据,使用的方法是get
四、性能测试模型
1、性能测试模型也可以理解为性能测试步骤,具体汇总为如下:
• 测试前期准备
• 测试工具技术引入
• 性能测试计划
• 测试设计与开发
• 测试执行与管理,数据收集
• 测试分析
2、 测试前期准备
①、梳理性能的目标(性能测试的目标是测试主导,然后测试制定出来后,和团队里面其他相关的人一起决定) 性能测试的目标参考依据是什么?是产品的需求文档以及产品的用户体量和系统的架构
②、能测试的数据
③、性能测试场景的设计以及性能测试用例的设计
3、 测试工具技术引入
①、LoadRunner:HP公司研发的工业级别的性能测试工具,是收费的一款性能测试工具
②、JMeter:100%使用Java语言研发的性能测试工具,是开源的,互联网公司基本使用的都是该性能测试工具
③、Locust:是基于Python的协程来设计的性能测试工具,需要编写Python代码来进行性能测试
④、Gatling:是微服务架构下高性能的性能测试工具
4、 性能测试计划
①、明确每个性能测试的任务开始的时间和结束的时间
②、明确每个任务的具体负责人
③、明确性能测试工具
5、 测试设计与开发
使用选择好的工具/代码,来设计场景/编写代码来测试设计好的性能测试用例
6、测试执行与管理,数据收集
①、多次测试执行,收集每次性能测试的数据(系统资源:CPU和内存,数据库资源:连接数和IOPS,JVM资源:内存资源 响应时间:最大,最小,平均,中位数,90%,95%,99%,吞吐量)
②、数据收集后的数据可视化展示
7、测试分析
实际收集的结果,来得到最终的结论:吞吐量,响应时间等等,与期望的目标进行对比,来判断是否达到目标
五、面试题
1、性能测试中,开发说需要添加服务器性能测试才能继续,你会怎么办?
不同意,测试环境服务器的配置与生产环境服务器的配置必须一致,这样出的结论才具有参考价值
2、日常使用什么工具进行性能测试,性能测试的指标有哪些?
①、LoadRunner:HP公司研发的工业级别的性能测试工具,是收费的一款性能测试工具
②、JMeter:100%使用Java语言研发的性能测试工具,是开源的,互联网公司基本使用的都是该性能测试工具
③、Locust:是基于Python的协程来设计的性能测试工具,需要编写Python代码来进行性能测试
指标有:系统资源:CPU和内存,数据库资源:连接数和IOPS,JVM资源:内存资源 响应时间:最大,最小,平均,中位数,90%,95%,99%,吞吐量
3、在性能测试之前,请根据顺序简述需要有哪些准备工作
①、梳理性能的目标(性能测试的目标是测试主导,然后测试制定出来后,和团队里面其他相关的人一起决定) 性能测试的目标参考依据是什么?是产品的需求文档以及产品的用户体量和系统的架构
②、性能测试的数据
③、性能测试场景的设计以及性能测试用例的设计
4、性能测试是怎么做的?
首先做好测试的前期准备,梳理好性能的目标,编写好性能测试的测试用例选择好要用的工具,编写好测试计划,使用选择好的工具或代码来设计场景或编写代码来测试设计好的测试用例,多次执行测试,收集每次数据,实际收集的结果,来得到最终结论
5、请描述下 描述下你是怎么理解IOPS,吞吐量,TPS,QPS的?
IOPS是针对数据库的术语,用于磁盘的读写
TPS是只系统每秒能处理的事务数量 QPS是指每秒的查询率
吞吐量是指每秒的业务数
6、你是怎么理解软件的性能的?
性能对软件而言是一个指标,是衡量软件用户体验最核心的指标之一,给用户最直观的感受就是响应时间。
产品的性能指标有很多,但是主要的是响应时间和吞吐量
六、性能测试的方法
1、压力测试和负载测试的区别是什么
负载测试是通过改变系统负载方式、增加负载等来发现系统中所存在的性能问题。负载测试是一种测试方法,可以为性能测试、压力测试所采用。压力测试通常是在高负载情况下来对系统的稳定性进行测试,更有效地发现系统稳定性的隐患和系统在负载峰值的条件下功能隐患等。
2、负载测试
(1)目的:
①、验证服务被部署的系统出现资源瓶颈的时候,服务依然能够提供产品的特性。
②、找到系统的最大饱和状态,或者是最大的处理极限,为系统后续的容量规划提供参考的数据
(2)、定义:
在被测系统上持续不断的增加压力,直到性能指标(响应时间等)超过预定指标或者某种资源(CPU&内存)使用已达到饱和状态。核心是找到系统的处理极限,为系统调优提供数据,从而达到了解系统性能的容量
(3)、验收负载测试
(4)①、流程:在QA的环境模拟生产运行的业务压力和使用场景组合,测试系统的性能是否满足生产环境的性能诉求。
②、流量回放:获取生产环境的网络请求,拿到QA的环境执行。
3、压力测试
(1)、定义:
该方法是指系统在一定饱和状态下,具体如CPU,内存等饱和使用的情况下,系统能够处理的会话能力,以及系统是否会出现错误,比如TimeOut(响应超时),OOM(内存泄漏),OverStackExpection(堆栈异常)。压力测试的特点:
• 检查系统在处于压力情况下时应用的性能表现
• 等价于负载测试,使系统的资源处于一个瓶颈的状态(建议CPU和内存在75%以上)
• 这种方式一般用于测试系统的稳定性
(2)、稳定性:
指的是系统在最大的极限下,依然能够正常的访问,不会对客户造成任何的影响
4、配置测试
(1)、定义:被测环境软硬件环境参数的调整,达到最优的分配原则
(2)、需要考虑的点:
JVM:CPU,内存
MySQL:连接数,超时参数
操作系统监控:CPU和内存 使用率达到多少的时候触发报警机制
(3)、一个好的系统表现应该是什么样的:服务端在高并发的情况下依然能够正常的为客户提供业务的能力和服务
5、并发测试
(1)、定义
模拟用户的并发访问,测试多用户并发访问同一个应用时是否存在死锁或者其他的问题,并发测试的特点是:
• 发现系统中可能隐藏的并发访问(线程同步和死锁)的问题
• 关注系统可能存在的并发问题,如内存泄露,线程锁,资源争用(调度算法)情况
• 使用的测试工具如profiler等
(2)、高并发情况下易发生的/文件读写的时候易发生的:线程同步、死锁
(3)、线程同步:
A和B两个任务,有100张车票,A和B同时进行抢购
加锁机制:A操作的时候,B不能操作,A操作完了,B才能够操作 解决办法:枷锁机制。
(4)、死锁:
A和B两个,为了保持线程同步,那么A操作B的时候,锁定B,B操作A的时候,锁定A。
6、可靠性测试
(1)、定义
给系统加载一定的业务压力,让应用持续运行一段时间,测试系统在这种条件下是否能稳定运行。
(2)、稳定性测试与可靠性测试的区别:
相同之处都是在系统饱和的情况下测试系统的稳定,不同之处在于可靠性测试需要在这基础上给系统增加一定的业务压力。
七、JMeter性能测试实战
1、jmeter原理:
JMerer通过线程组来驱动多个(也可以理解为LR⼯具⾥⾯的虚拟⽤户)运⾏测试脚本对⽬标服务器发起⼤量的⽹络请 求,在每个客户端上可以运⾏多个线程组,也就是说⼀个测试计划⾥⾯可以包含N个线程组
2、jmeter中的场景介绍
(1)、在取样器错误要执行的动作
①、模拟多用户:Jmeter线程组中的线程数可以理解为用户数,执行时就代表多少用户同时在登陆或者访问。
②、继续:如果有⼀个请求错误,其他的请求会继续,不会因为有⼀个请求错误的导致其他请求终⽌。
③、启动下一个进程循环
如果请求出现问题,同⼀脚本中的其他请求就都不再执⾏,直接执⾏下⼀个进程的信息。如登录后下⼀个请求是查 看个⼈主⻚,但是因为登录出错,下个接⼝查看个⼈主⻚就不会被执⾏。
④、停止线程
停⽌线程指的是如果请求失败,就停⽌当前线程执⾏,不再继续执⾏。如果线程数很多的,那么导致的结果是停⽌ 的线程就会很多,处于真正运⾏的线程会很少,最后导致服务器的负载不够,⼀般不建议构选改选项。
⑤、停止测试
如果请求失败,那么停⽌所有线程执⾏,也就是说停⽌整个测试。
⑥、立即停止测试
如果请求失败,⽴即停⽌整个测试场景的执⾏。
(2)、线程属性
①、线程数
⼀个线程可以理解为对应模拟⼀个⽤户,所以线程数越多,那么也就认为可以模拟的⽤户数越多。
②、Ramp-Up时间(秒)
该属性指的是所有线程从启动到开始运⾏的时间间隔,单位是秒,也就是说所有线程在多⻓时间内开始执⾏,如线程数设置50,设置的时间为5秒,那么计算的公式为:
例如:设置虚拟用户数是:1000,每秒并发50个用户,那么Ramp-Up时间为20
③、循环次数 (做稳定性测试可以使用)
循环次数可以理解为,请求的重复次数。如果选择“永远”,那么请求将⼀直进⾏,不建议这样操作
④、延迟创建线程直到需要
⑤、调度器
所谓调度器可以理解为设置何时开始运⾏。
持续时间
测试计划持续多⻓时间
启动延迟
从当前时间延迟多⻓时间开始运⾏测试,也就是说点击执⾏后,仅仅是做初始化的场景,不会执⾏测试,等待延迟 到达后开始运⾏测试,执⾏的时间为持续时间设置的时间
(3)、聚合报告各项代表的含义
Label:取样器名称
Samples:取样器运⾏次数
Average:单个请求的平均响应时间
Median:50%请求的响应时间
90%Line:90%请求响应时间
95%Line:95%请求响应时间
99%Line:99%请求的响应时间
Min:请求的最⼩响应时间
Max:请求的最⼤响应时间
Error%:事务错误率
Throughput:吞吐率,也就是TPS
KB/sec:每秒数据包流量
Avg.Bytes:平均数据流量
Received KB/sec:每秒从服务器端接收到的数据量
SentKB/sec:每秒从客户端发送的请求的数量
(4)、汇总报告
Std.Dev:响应时间的标准⽅差
Error%:事务错误率
Throughput:吞吐率,也就是TPS
Avg.Bytes:平均数据流量
Received KB/sec:每秒从服务器端接收到的数据量
SentKB/sec:每秒从客户端发送的请求的数量
SD(std.Dev):标准偏差为您提供了一定程度的稳定性,但是,只需注意,标准偏差不会显示最慢和最快的响应,而是有助于识别响应趋势。
低标准偏差意味着系统内的性能更稳定或更一致
Std.Dev:响应时间的标准⽅差
Error%:事务错误率
Throughput:吞吐率,也就是TPS
KB/sec:每秒数据包流量
Avg.Bytes:平均数据流量
Received KB/sec:每秒从服务器端接收到的数据量
SentKB/sec:每秒从客户端发送的请求的数量
(5)、参数化:
①、定义:相同的测试步骤,不同的测试数据,那么这个时候我们把测试的数据分离到文件中,在JMeter中,是通过CSV数据文件设置来实现的。
②、实战应用:同时使用6个不同用户登录/访问页面的实现
将不同用户的变量值保存至文件夹内,使用CSV调取文件,并定义编码、变量,然后在登录的请求数据中使用${}来调取变量,同步执行就可实现不同用户访问/登录页面。
(6)、JMeter中的资源监控:
监控流程:JMerer通过后端监听器把测试中的数据(响应时间,总的请求数,吞吐量等数据)写入到influxDB的时序数据库,最后grafana的平台从influxDB时序数据库获取数据,可视化展示在平台上。这样就能够看得出各个不同纬度数据的变化趋势图。
①、后端监听器:把JMeter执行过程中的数据写到influxDB的时序数据库
②、influxD:时序数据库,用来存储JMeter发送请求的数据(将数据上传至数据库)
③、Grafana:从influxDB获取数据,展示在Grafana的平台上(从数据库调取数据上传至平台展示)
④、访问influx的格式:influx -username "xxx" -password "xxxxx"
⑤、influx命令格式:
show databases;:查询有哪些数据库
use jmeter:进入到jmeter的数据库
show measurements :查询有哪些表
(7)、JMeter生成性能测试报告
①、更改配置:在JMeter的bin目录下,找到jmeter.properties文件,将格式改为如图所示
②、更改环境变量,将jmeter路径添加至path环境变量中
③、使用命令将保存至桌面的.jmx的报告转换成.jxl(用来存储吞吐量、请求时间等数据)的格式,通过-e -o 生成report文件夹并将转换的数据生成html保存至文件夹内
命令:jmeter -n -t xxx.jmx -l xxx.jtl -e -o report/
(8)、本地监控JVM资源信息
①、启动开发给的.jar包进行启动(java -jar xxxx(.jar名称))
②、运行jvisualvm命令打开监控平台
③、选择本地需要监控的资源进行监控