性能测试分析法

引言

性能测试通常需要三项主要工作:准备、执行、分析,本篇主要讲一下针对B/S系统如何进行分析定位系统瓶颈


扩散范围

适用于需要进行性能分析及调优的工作。 预期读者为测试管理人员、测试实施人员、研发人员、项目管 理人员、质量管理人员等系统技术质量相关人员。


性能分析流程图

分析策略

  • 优先原则(关键指标)

  • 性能bug,通常很多功能低频操作很稳定,一旦并发调用就会出现很多问题,短时间需要大量 的程序、数据库、中间件、内存、缓存交互此时系统容易产生很多性能问题,测试中优先反馈 进行此类问题修复。

  • 性能测试需要确立指标项,在指标项内确立优先原则进行测试,从上图可以看出性能分析需要 很强的综合能力,分析一个系统的瓶颈绝非易事。若没有明确的指标性能测试将陷入盲目且繁 杂的分析工作中,且很难输出有效指标。

  • 设定变量

  • 在确立了优先原则后,重点进行指标项的测试。性能测试非功能测试一簇而就,需要制定优化 计划迭代改进的,每一次的计划应标定指标的测试范围和目标进行测试分析瓶颈。(即:将各 种场景、硬件属性、网络标定范围当成变量在特定范围内测试出多组数据进行分析)

  • 动态分析

  • 性能瓶颈的分析非一成不变,有些指标会随着压测的变量调整,性能瓶颈随着也产生了变化。 比如当某些应用程序的中间件、数据:线程数、连接数配置较低进行并发测试时,此时cpu使 用率通常很低的情况系统报连接超过限制或排队等现象。即可以判定程序的配置限制了高并发 的性能。但将线程配置调高后,此时高并发会使cpu使用率提升,此时系统会充分调度内存、 磁盘进行读写操作(系统的处理瓶颈也随之转移内存、磁盘需进行分析)


具体分析方案

前提

  • 场景(业务逻辑、场景、有效率,若场景有问题。所有数据都作废,若场景满足。(如:接口并发 后错误率高、丢包率高、性能bug))

  • 准备和执行过程中部署或开发了合理的监控、性能执行工具且生成相关测试数据

    扫描二维码关注公众号,回复: 14659351 查看本文章
  • 性能测试有明确的指标项(根据产品业务需求确定)

常用分析方法

  • 通过数据分析,查看关键指标是否满足要求。若不满足要求

  • USE方法全称"Utilization Saturation and Errors Method",主要用于分析系统性能问题,可以指导用户快速识别资源瓶颈以及错误的方法。使用率(Utilization)、饱和度(Saturation)以及错误(Errors)。

a、使用率:关注系统资源的使用情况。 这里的资源主要包括但不限于:CPU,内存,网络,磁盘等等。如磁 盘使用率100%
b、饱和度:这里主要是针对资源的饱和度。任何资源在某种程度上的饱和都可能导致系统性能的下降。如cpu 等待队列的长度、常见的工具中系统负载指标
c、错误:错误计数。如磁盘读写异常、错误事件等

深入分析方法

  • 网络

  • 很多情况下压测流量并没有完全进入到后端(服务端),在网络接入层可能就会出现由于各种规格(带宽、最大连接数、新建连接数等)限制或者因为压测的某些特征符合DDoS的行为而 触发了防护策略导致压测结果达不到预期。

  • 客户端

  • 性能问题几率偏低,本篇不做过多讨论。

  • 硬件

  • 指标(CPU , Memory , Disk I/O , Network I/O)若硬件指标有问题,需要进行详细分析

a、CPU资源利用率很高的话,需要看CPU消耗User、Sys、Wait哪种状态
1) 如果CPU User非常高,需要查看消耗在哪个进程,可以用top (linux) 命令看出,接着用top –H –p <pid>看哪个线程消耗资源高。如果是Java应用,就可以用jstack看出此线程正在执行的堆栈,看 资源消耗在哪个方法上,查看源代码就知道问题所在。
2) 如果CPU Sys非常高,可以用strace (linux) 看系统调用的资源消耗及时间。
3) 如果CPU Wait非常高,考虑磁盘读写了,可以通过减少日志输出、异步或换速度快的硬盘。
b、Memory操作系统为了最大化利用内存,一般都设置大量的cache,因此,内存利用率高并不是主要问 题,内存的问题主要看某个进程占用的内存是否非常大以及是否有大量的swap (虚拟内存交换) 。首先 要知道直接从物理内存读写数据比硬盘读写数据要快的多,但是内存是有限的,所以就引出了物理内存和 虚拟内存,物理内存是系统硬件提供的内存,是真正的内存,虚拟内存是为了满足物理内存不足时而提出 的策略,他是利用磁盘空间虚拟出的逻辑内存,用作虚拟内存的磁盘空间被称为交换空间 (swap space) 。作为物理内存的扩展,linux会在物理内存不足时使用交换空间,内核会将暂时不用的内存快 信息写到交换空间,这样物理内存就得到了释放,当需要用到原始内容时重新从交换空间读入物理内存。linux操作系统中当应用程序需要读取文件中的数据时,操作系统会先分配一些内存将数据从磁盘读入到内存中,然后再将数据分发给应用程序;当需要往文件中写入数据时操作系统会分配内存接收用户数据, 然后再将数据写入到磁盘中;如果有大量数据需要读写到磁盘时,系统的读写性能就会降低非常耗时间和 资源,这种情况下就引入了buffers和cached机制。buffer和cached都是内存操作,用来保存内存曾 经打开的文件和文件属性信息,所以当系统需要读取文件时会先从buffer和cache内存区查找,如果找 到直接读取发给应用程序,如果没有找到才从磁盘中找,通过缓存大大提高了操作系统的性能,但是 buffer和cache缓存的内容是不同的,buffer用来缓存块设备的只记录了文件系统的元数据以及 pages,而cached用来给文件做缓冲;通俗说buffer存得是文件内容、属性和权限,cached直接用来 记忆我们打开过的文件和程序
c、磁盘I/O一个最显著的指标是繁忙率,可以通过减少日志输出、异步或换速度快的硬盘来降低繁忙 率。
d、网络I/O主要考虑传输内容大小,不能超过硬件网络传输的最大值70%,可以通过压缩减少内容大小、 在本地设置缓存以及分多次传输等操作提高网络I/O性能。
  • 中间件

  • 指标(线程池、连接池、 GC等)若指标有问题需要进行详细分析

a、如果线程不够用,可以通过参数调整,增加线程;对于线程池中的线程设置比较大的情况,还是不够 用可能的原因是:某个线程被阻塞来不及释放,可能在等锁、方法耗时较长、数据库等待时间很长等原因 导致,需要进一步分析才能定位。
b、JDBC连接池不够用的情况下,可以通过参数进行调整增加;但是对于数据库本身处理很慢的情况下, 调整没有多大的效果,需要查看数据库方面以及因代码导致连接未释放的原因。
c、JVM主要分析GC/FULL GC是否频繁,以及垃圾回收的时间,可以用jstat命令来查看,对于每个代 大小以及GC频繁,通过jmap将内存转储,再借助工具HeapAnalyzer来分析哪地方占用的内存较高以及 是否有内存泄漏可能。简单点可以使用APM工具,例如阿里云ARMS工具
  • 数据库

  • 指标(sql慢查询、锁表等)若指标有问题需要进行详细分析

a、未建索引
b、未利用索引
c、低效索引
d 、锁表 (常发生于并发执行update、insert、delete语句中)
  • 操作系统

一般指的是windows、UNIX、Linux等操作系统。 例如,在进行性能测试,出现物理内存不足时,虚 拟内存设置也不合理,虚拟内存的交换效率就会大大降低,从而导致行为的响应时间大大增加或磁盘分区 不合理数据无法承受短时间得存储。这时认为操作系统上出现性能瓶颈
  • 应用程序

  • 指标(架构、算法、缓存机制、同步或异步)若指标有问题需要进行详细分析

一般指的是开发人员开发出来的应用程序。 例如,JVM参数不合理,容器Tomcat配置不合理,慢SQL,数据库设计不合理,程序架构规划不合理,程序本身设计有问题 (串行处理、请求的处理线程不够、无缓 冲、无缓存、生产者和消费者不协调、同步死锁等) ,造成系统在大量用户访问时性能低下而造成的瓶 颈。

感谢大家阅读,如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)


猜你喜欢

转载自blog.csdn.net/weixin_45191386/article/details/129232436