作者:森__林蘑菇 | 来源:互联网 | 2023-05-24 15:33
1.性能测试介绍和相关概念
性能测试是一种评估在指定工作负荷下系统或应用的响应能力、可靠性、吞吐量、互操作性以及可扩展性的测试。性能测试可以定义为一种评估计算机、网络软件应用或设备的速率或效率的过程。可以对软件应用、系统资源、目标应用元件、数据库等进行性能测试。通常测试会包含一个自动化的测试套件,该测试套件了能够很容易地反复模拟各种正常值、峰值和异常值。测试过程可以比较应用在速度、数据传输率、吞吐量、贷款、效率或可靠性等方面变化。性能测试也作为评估瓶颈和单点故障的诊断工具。
1.1性能测试的一些概念:
负载测试和压力测试都属于性能测试,两者可以结合进行; 通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。
性能测试概括为三个方面:(1)应用在客户端性能的测试(2)应用在网络上性能的测试(3)应用在服务器端性能的测试。通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和瓶颈的预测。
应用在客户端性能测试的目的是考察客户端应用的性能,测试的入口是客户端。它主要包括并发性能测试、疲劳强度测试、大数据量测试和速度测试等,其中并发性能测试是重点。
并发性能测试的过程是一个负载测试和压力测试的过程,即逐渐增加负载,直到系统的瓶颈或者不能接收的性能点,通过综合分析交易执行指标和资源监控指标来确定系统并发性能的过程。负载测试(Load Testing)是确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统组成部分的相应输出项,例如通过量、响应时间、CPU负载、内存使用等来决定系统的性能。负载测试是一个分析软件应用程序和支撑架构、模拟真实环境的使用,从而来确定能够接收的性能过程。压力测试(Stress Testing)是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。
并发性能测试的目的主要体现在三个方面:以真实的业务为依据,选择有代表性的、关键的业务操作设计测试案例,以评价系统的当前性能;当扩展应用程序的功能或者新的应用程序将要被部署时,负载测试会帮助确定系统是否还能够处理期望的用户负载,以预测系统的未来性能;通过模拟成百上千个用户,重复执行和运行测试,可以确认性能瓶颈并优化和调整应用,目的在于寻找到瓶颈问题。
1.2 性能测试的基本策略:
测试的基本策略是自动负载测试,通过在一台或几台PC机上模拟成百或上千的虚拟用户同时执行业务的情景,对应用程序进行测试,同时记录下每一事务处理的时间、中间件服务器峰值数据、数据库状态等。通过可重复的、真实的测试能够彻底地度量应用的可扩展性和性能,确定问题所在以及优化系统性能。预先知道了系统的承受力,就为最终用户规划整个运行环境的配置提供了有力的依据。
(1)负载测试:是通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足系统性能指标的前提下,系统所能承受的最大负载量的测试。
也就是说,这种方法是对一个系统持续不段的加压,看你在什么时候已经超出“我的要求”或系统崩溃。
通过在被测系统上不断加压,直到性能指标达到极限,来确定系统的处理能力和能够承受的各项阈值。例如“响应时间不超过5秒 ”。
特点:
1、这种性能测试方法的主要目的是找到系统处理能力的极限。
2、这种性能测试方法需要在给定的测试环境下进行,通常也需要考虑被测试系统的业务压力量和典型场景、使得测试结果具有业务上的意义。
3、这种性能测试方法一般用来了解系统的性能容量,或是配合性能调优来使用。
(2)压力测试(强度测试):压力测试是通过逐步增加系统负载,测试系统性能的变化,并最终确定在什么负载条件下系统性能处于失效状态来获得系统能提供的最大服务级别的 测试。也就是说,这种测试是让系统处在很大强度的压力之下,看系统是否稳定,哪里会出问题。压力测试方法测试系统在一定饱和状态下,例如cpu、内存在饱和使用情况下,系统 能够处理的会话能力,以及系统是否会出现错误
特点:
1、这种性能测试方法的主要目的是检查系统处于压力性能下时,应用的表现。
2、这种性能测试一般通过模拟负载等方法,使得系统的资源使用达到较高的水平。
3、这种性能测试方法一般用于测试系统的稳定性。
(3)并发测试:是测试多个用户同时访问同一个应用、同一个模块或者数据记录时是否存在死锁或者其他问题,所以几乎所有的性能测试都会涉及一些并发测试。
因为并发测试对时间的间隔要求比较严格,通常并发测试都要借助于工具(比如jmeter和loadrunner),采用多线程或者多进程的方式来模拟多个虚拟用户的并发性操 作。也就是说,这种测试关注点是多个用户同时(并发)对一个模块或操作进行加压。
特点:
1、这种性能测试方法的主要目的是发现系统中可能隐藏的并发访问时的问题。
2、这种性能测试方法主要关注系统可能存在的并发问题,例如系统中的内存泄漏、线程锁和资源争用方面的问题。
3、这种性能测试方法可以在开发的各个阶段使用需要相关的测试工具的配合和支持。
(4)配置测试:主要是通过被测试软件的软硬件配置的测试,找到系统各项资源的最优分配原则。配置测试能充分利用有限的软硬件资源,发挥系统的最佳处理能力,同时可以将其与其他性能测试类型联合应用,从而为系统调优提供重要依据。
也就是说,这种测试关注点是“微调”,通过对软硬件的不段调整,找出这他们的最佳状态,使系统达到一个最强的状态。
特点:
1、这种性能测试方法的主要目的是了解各种不同因素对系统性能影响的程度,从而判断出最值得进行的调优操作。
2、这种性能测试方法一般在对系统性能状况有初步了解后进行。
3、这种性能测试方法一般用于性能调优和规划能力。
(5)可靠性测试:在给系统加载一定业务压力的情况下,使系统运行一段时间,以此检测系统是否稳定。
也就是说,这种测试的关注点是“稳定”,不需要给系统太大的压力,只要系统能够长期处于一个稳定的状态。
特点:
1、这种性能测试方法的主要目的是验证是否支持长期稳定的运行。
2、这种性能测试方法需要在压力下持续一段时间的运行,通常可以测出内存泄漏的问题。(2~3天)
3、测试过程中需要关注系统的运行状况。
4、平均故障间隔时间是衡量可靠性的一项重要指标。
(6)容量测试:容量测试是在一定的软硬件条件下,在数据库中构造不同数量级的记录数量 ,通过运行一种或者多种业务场景,在一定虚拟用户数量的情况下,获取不同数量级别的性能指标,从而得到数据库能够处理的最大会话能力、最大容量等。
(7)失败测试:对于有冗余备份和负载均衡的系统,通过失败测试来检验如果系统局部发生故障,用户能否继续使用系统,用户受到多大的影响。1
2.性能指标概念:
(1)内存泄漏:内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。2
(2)内存溢出:内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致的内存溢出错误,即使用户重新执行任务依然无法避免。3
(3)并发
狭义的并发:用户在同一时间内做同一事情 |
广义的并发:用户同时操作不同的功能(混合场景:登录、下订单、、支付订单) |
在性能测试中,一般先进行狭义的并发(单场景单接口做性能测试,可更好地定位问题),再进行广义的并发(混合场景(验证系统的稳定性,在多个关联接口时,会不会出现新的问题))
(4)并发用户数
系统用户数:系统的注册用户数(包含僵尸用户)
在线用户数:登录系统的用户(不一定对服务器产生压力)
并发用户数:对服务器产生压力的用户
并发用户数的确定:老系统-找运维;新系统:竞品、做过的项目、经验
(5)事务
事务是性能脚本中的一个重要特性。要度量服务器的性能,需要定义事务,每个事务都包含事务开始和事务结束标记。事务用来衡量脚本中一行代码或多行大妈的执行所消耗的时间。
(6)响应时间
响应时间=网络时间(N1+N2+N3+N4)+服务器处理时间(A1+A3)+数据库处理时间(A2)
web的HTTP请求中响应时间包括了前段渲染时间,但是loadrunner中是不统计前段渲染时间的。
tps(Transaction Pre Second)
服务器每秒能处理的事务数,用来衡量服务器处理能力。基于事务统计。
(7)吞吐量
指系统在单位时间内处理请求的数量,不严格意义上来说就是tps。
(8)点击率(Hit Per Second)
从客户端发起请求服务器的数量(衡量客户端性能,需排除网络、本机产生的影响)。
(9)资源利用率
指系统资源的使用程度,比如服务器(网络及数据库)的CPU利用率,内存利用率,硬盘利用率,网络带宽利用率等。
(10)CPU
大脑,主要进行判断和处理,能反应出系统的繁忙程度,一般分为系统CPU(%sys)与用户态CPU(%user),其中系统CPU是处理系统本身所占用的资源,用户CPU则是处理程序所占用的资源。对象不同。
用户态CPU高:代码、sql语句处理有问题;
系统态CPU高:内核、服务器资源瓶颈。
(11)Load Average
指一段时间内CPU正在处理和等待CPU处理的事务,也就是CPU使用队列的长度的统计信息。eg:地铁进站,等待乘客越多,load average越大。
(12)Memory
记忆区域,将各种信息收集起来存放。数据从内存读取要比从磁盘读取速度快,而内存经常发生内存泄漏或内存溢出的现象。
(13)队列
可以理解成进站排队的现象,队列长,说明处理可能达到了极限或者遇到了阻塞。
(14)网络
重点关注网络的流量,看是否存在网络带宽的瓶颈。4
3.性能测试的目的:
识别系统的弱点,评估系统能力,发现系统性能瓶颈,提高系统可靠性能和稳定性。
4.性能测试实施过程:
4.1 定义验收标准:负载下应用的各个模块可接受的性能指标是什么?具体来说,就是定义好响应时间、吞吐量,以及资源利用率目标和约束条件。标准由项目干系人负责,测试过程中通常需要持续关注,,标准也可能根据实际情况进行调整。
4.2 定义测试环境:熟悉物理测试环境和产品环境对一次成功的测试执行来说非常关键。需要明确的东西包括硬件、软件,以及测试下的网络环境设置,这将有助于制定有效的测试计划并已开始就是别处测试风险。
4.3 规划并设计测试用例:先了解应用的使用方法,再确定各个场景下真实的使用场景(包括变化),比如注册模块,通常一天会有多少用户注册?注册是不是在同时发生?还是分散的?通常一小时内有多少人注册?等等。
4.4 准备测试环境:配置测试环境、工具和资源。包括测试的软件硬件、网络资源环境,监控环境、测试工具的准备、数据的准备等等。
4.5 准备测试计划:使用测试工具录制好(配置好)测试场景(比如脚本、API等等)。
4.6 执行测试:首先在轻量负载下运行测试计划,验证测试脚本和输出结果的正确性,验证数据的正确性,关注服务器的性能,服务器日志的警告⚠和错误❌。例如出现频度高的错误可能代表测试脚本、被测应用或系统资源有问题,或者三者都有。
4.7 分析结果、报告和重测试:检查每一次成功只想的结果,识别需要解决的瓶颈。瓶颈可能和系统、数据库或者应用有关。可以通过调整基础设施(如增加运行能存等)、优化数据查询等。对应的结果可以和基线数据对比。
基线数据收集的一些参考点:
A.基线数据应该是应用程序特定的。
B.可以为系统、应用或者模块建立基线。
C.基线数据是指标数据/结果。
D.基线数据不应该过于概括。
E.随时间变化可能需要重新定义基线数据。
F.基线数据可以当作共享的参考框架。
G.基线数据应该是可以重用的。
H.基线数据可以帮助识别性能的变化。5
五:调优工作:
调整系统资源配置
优化数据库查询
减少应用的调用次数,有时需要重新设计有问题的模块并调整架构
扩展应用和提高数据库服务器性能
减少应用资源占用量
优化和重构代码,包括消除冗余和缩短执行时间
【1】https://www.cnblogs.com/dream-future/p/7603020.html
【2】https://baike.baidu.com/item/%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F/6181425?fr=aladdin
【3】https://baike.baidu.com/item/%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA/1430777?fr=aladdin
【4】https://www.cnblogs.com/wq-zhou/p/10631189.html
【5】Performance Testing with Jmeter sencond Edition ,Bayo Erinle
There is no smoke without fire.
An ounce of prevention is worth a pound of cure.