一、什么是性能测试
因为现在系统越来越复杂,有时候我们真不知道系统啥时候会出现问题,尤其是那些性能问题。所以啊,性能测试就像我们给系统做个全面体检,提前发现那些可能存在的隐患,避免问题发生。
那么,什么是性能测试呢?简单说,性能测试就是通过模拟真实场景下系统的运行情况,来评估系统的性能表现。比如说,测试系统在高并发情况下的响应速度、稳定性、可靠性等等。通过这些测试,我们可以了解系统的瓶颈在哪里,哪些地方需要优化,从而更好地满足业务需求。
二、常见的性能测试类型
性能测试有如下几种类型:
- 负载测试是在被测系统上不断增加压力,直到性能指标(如响应时间)超过预期指标或者某种资源使用已经达到饱和状态。可以找到系统的处理极限,为系统调优提供数据;
- 压力测试是系统在一定饱和状态下,例如CPU、内存等饱和情况下,系统能够处理的会话能力,以及系统是否会出现错误;
- 并发测试是模拟多用户并发访问同一个应用、模块或者数据记录时是否存在死锁或者其他性能问题;
- 可靠性测试是给系统施加一定的业务压力,让其持续运行一段时间,测试在这种条件下能否稳定运行。
三、常见的性能指标
针对不同的性能测试类型,我们要关注的性能测试指标也有不同,以下我列一下常见的性能指标有哪些:
- 响应时间:指系统对请求的处理时间,包括数据传输和处理时间,是衡量系统性能的重要指标之一。
- 吞吐量:指在单位时间内系统可以处理多少个请求或处理多少量的数据,是衡量系统处理能力的重要指标之一。
- 并发用户数:指同时在线、执行操作或访问系统的用户数量,是衡量系统可扩展性的重要指标之一。
- 资源利用率:指系统占用资源的多少,包括处理器、内存、硬盘等资源的使用率,是衡量系统性能成本的重要指标之一。
- 错误率:指系统在特定时间段内发生错误的次数,是衡量系统可靠性的重要指标之一。
- 故障恢复时间:指系统发生故障后,恢复正常运行所需的时间,是衡量系统稳定性的重要指标之一。
- 系统可用性:指系统在特定时间段内可以正常使用的百分比,是衡量系统运维的重要指标之一。
- 负载均衡:指系统在面对大量用户访问时,如何合理分配资源,以保证系统的性能和稳定性。
当然还有很多其他的,在这就不一一列举了,有兴趣的小伙伴可以自行百度下。
四、性能测试的步骤
性能测试的步骤一般如下:
首先我们要进行需求分析,确定性能测试的目标、性能需求和业务场景,例如
一般业务性能目标有如下指标:
- 吞吐量(PV)、吞吐率(TPS等)、响应时间(RT)/ 应用响应时间(ART);
- 事务成功率:99%以上;
- 稳定波动正常范围。
然后通过问或者其他方式来获取以下现状:
- 系统架构:物理架构(硬件及部署策略)和逻辑架构(系统的功能与服务),包括中间件产品与配置、数据库配置等;
- 业务流程:业务量和业务分布。分析出哪些业务纳入性能测试范围,并量化业务、业务扩展趋势包括年增长率或者未来的业务量、业务高峰的发生时间和高峰业务量、各项业务之间的比例;
- 用户信息:在线用户数、活跃用户数;
- 系统现在的性能指标:吞吐率、响应时间、事务成功率,CPU、内存、磁盘、带宽使用阀值等等。
之后我们就可以根据目标来进行制定测试计划了。制定计划中有我们要根据具体的目标使用不同的工具,下面我介绍几个常用的工具:
- JMH是Java语言的微基准测试工具(Java Microbenchmark Harness)的缩写。JMH可以帮助我们度量、分析和优化Java程序的性能,我们可以轻松地测试Java代码的运行时间、资源消耗和吞吐量等性能指标,从而更好地了解代码的性能表现,识别潜在的性能瓶颈,并进行针对性的优化。
- JProfiler:JProfiler是一种功能丰富的Java性能分析工具,可用于分析Java应用程序的性能瓶颈和内存使用情况。
- VisualVM:VisualVM是一种免费的性能监控和分析工具,可用于监视Java应用程序的性能特性和资源利用情况。
- JMeter:Apache JMeter是一种功能强大的开源负载测试工具,可用于测试Web应用程序的性能及负载测试
- LoadRunner:一款性能测试工具,能够模拟高负载场景以评估软件系统性能,适用于多种平台和协议。
当然现在也有一些国产的工具比较好用的,例如RunnerGo,它的压测模式分为并发模式、阶梯模式、轮次模式、错误率模式、响应时间模式、每秒应答数模式六种模式,我们根据不同场景可以选择适合的方式进行压测。
测试计划包含如下内容:测试内容(可能包含业务性能、可靠性、稳定性等等),业务需求目标,系统业务构成,系统节点构成,测试方法流程,需要监控的指标要求和节点等等。
对于升级、优化类的老系统,可考虑是否存有历史测试方案参考,或许可以省事很多。没有的话最直接的办法就是分析根据系统的数据、统计业务量、业务分布等信息来确定测试内容。然后对业务进行拆分对象,实现这个完整的功能包含哪些流程、环节。比如“购买商品”,具体的流程环节包括“登录->搜索商品->提交订单->支付订单->退出”。接着,明确业务占比,重要程度,目的在于:
(1)明确重点测试对象,安排测试优先级;
(2)建模,混合场景中,虚拟用户资源分配,针对不同业务功能施加不同的负载;
(3)明确下“需求分析-指标分析”中相关业务功能所需基础数据及数据量问题。
然后准备测试环境,例如配置适当的测试环境,包括服务器、网络、数据库等,然后用上述的性能测试工具执行设计的性能测试场景,并记录性能指标和监测系统行为,然后分析性能测试结果,识别性能瓶颈和优化机会,然后针对发现的性能问题,进行系统调优和性能优化,优化后再进行测试,循环往复,直到满足性能测试指标为止。
例如我们测试的目标是并发用户数测试,我们就可以使用负载测试工具逐步增加并发用户数量,模拟用户访问系统,记录系统在不同并发用户条件下的性能指标,如响应时间、吞吐量等,达到系统性能瓶颈或负载极限时,确定系统能够处理的最大并发用户数。如果系统能够处理的并发用户数量如200符合性能需求,则满足业务要求,否则则分析从页面进来的请求路径是什么,分析可能存在的优化空间有什么进行提升然后再进行测试,直到满足业务要求。
总结一下,性能测试不仅可以帮助我们发现潜在的问题,提高系统的稳定性,还可以优化用户体验和确保业务的成功。通过了解系统的架构和功能、分析业务需求、评估资源限制、制定测试计划等步骤,我们可以确定性能测试的范围并选择合适的性能测试工具和指标,从而提高系统的性能表现。但是最好不是一个一次性工作,能定期进行性能测试,要是能深究一下全链路压测这样的技术厂商例如Takin、RunnerGo等,会让性能测试做的更好。