热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

性能测试基本知识理论和概念

    1.性能测试介绍和相关概念性能测试是一种评估在指定工作负荷下系统或应用的响应能力、可靠性、吞吐量、互操作性以及可扩展性的测试。性能测试可以定义为一种

 

 

 

 

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.



推荐阅读
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 热血合击脚本辅助工具及随机数生成器源码分享
    本文分享了一个热血合击脚本辅助工具及随机数生成器源码。游戏脚本能够实现类似真实玩家的操作,但信息量有限且操作不可控。热血合击脚本辅助工具可以帮助玩家自动刷图、换图拉怪等操作,并提供了雷电云手机的扩展服务。此外,还介绍了使用mt_rand函数作为随机数生成器的代码示例。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 分享2款网站程序源码/主题等后门检测工具
    本文介绍了2款用于检测网站程序源码和主题中是否存在后门的工具,分别是WebShellkiller和D盾_Web查杀。WebShellkiller是一款支持webshell和暗链扫描的工具,采用多重检测引擎和智能检测模型,能够更精准地检测出已知和未知的后门文件。D盾_Web查杀则使用自行研发的代码分析引擎,能够分析更为隐藏的WebShell后门行为。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
author-avatar
森__林蘑菇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有