来聊两块钱的性能测试

转载请注明出处❤️

作者:测试蔡坨坨

原文链接:caituotuo.top/51e13a99.html


前言

你好,我是测试蔡坨坨。

作为一枚测试,或多或少都做过or听说过性能测试。说到性能测试,第一印象可能是高大上,因为它涉及到评估系统的性能、稳定性和可靠性。确实,性能测试水很深,如果玩得比较溜就能发展成性能测试专家、架构师级别。

对于初中级测试同学的要求大概就是会接口压测,能根据生成的报告分析TPS、并发量、吞吐量、资源利用率等关键指标,可以协助开发人员进行性能调优。

本篇,就来简单聊一聊性能测试,包括性能测试的概念、指标、工具、流程以及学习路线。读完本文,你大概能初步掌握性能测试的基本知识。

什么是软件性能

在聊性能测试之前,我们先来说一个概念,什么是软件性能

软件性能是软件的一种非功能特性,它关注的不是软件是否能够完成特定的功能,而是在完成该功能时展示出来的及时性。例如:一个登录功能它能实现登录操作,但是登录过程需要10s才能进入到主页面,这就说明软件的性能不好。

什么是性能测试

性能测试是指通过自动化的测试工具(例如:Jmeter、LoadRunner、Locust等)模拟多种正常值、峰值以及异常负载条件来对系统的各项性能指标(例如:响应时间、吞吐量、并发量、资源利用率、错误率等)进行测试。

功能测试关注的是1个人的操作(也就是关注该功能是否能够实现),性能测试关注的是多个人的操作(性能测试的前提是功能没有问题)。

性能测试指标

知道了什么是性能和什么是性能测试之后,我们需要了解一些性能相关的指标,只有通过性能指标的确立和分析,我们才能判断软件的性能是否符合要求。

  • 响应时间 RT(Response Time)

    用户发送一个请求用户接收到服务器返回的响应数据的这段时间就是响应时间。

    通常使用平均响应时间、最大响应时间、百分位响应时间等来衡量。

    响应时间=呈现时间+网络传输时间+服务器端响应时间+应用延时时间

  • 吞吐量(Throughput)

    单位时间内系统处理的客户端请求数量。

    通常使用请求数/秒(QPS)或请求数/分钟(RPM)作为吞吐量的单位,还可以使用页面数/秒表示,从业务的角度来说也可以使用访问人数/天页面访问量/天 作为单位。

    throughput=(number of requests)/(total time)

  • 并发数(Concurrency)

    同时并发使用系统的用户数量,通常使用最大并发用户数、在线用户数、系统用户数等来衡量。

    • 并发用户数:某一物理时刻同时向系统提交请求的用户数,提交的请求可能是同一个场景或功能,也可以是不同场景或功能。
    • 在线用户数:某段时间内访问系统的用户数,这些用户并不一定同时向系统提交请求。例如:日活——表示每日活跃用户数
    • 系统用户数:系统注册的总用户数据。

    三者之间的关系:系统用户数 >= 在线用户数 >= 并发用户数

  • 资源利用率

    对不同系统资源的使用程度,通常以占用最大值的百分比来衡量。

    通常需要关注的服务器资源有:

    • CPU使用率

      CPU就像人的大脑,主要负责相关事物的判断以及实际处理的机制。

      CPU使用率是指CPU在运行系统时的占用率,通常使用平均CPU使用率、峰值CPU使用率来衡量(一般不超过80%-90%)。

    • 内存使用率

      内存就是大脑中的记忆块区,将眼睛、皮肤等收集到的信息记录起来的地方,以供CPU进行判断,但是是临时的,访问速度快,如果关机或断电,内存中的数据就会消失。

      内存使用率是指系统运行时内存的占用率,通常使用平均内存使用率、峰值内存使用率等来衡量。

    • 磁盘I/O

      大脑中的记忆区块,将重要的数据保存起来,永久保存,关机或断电也不会丢失,速度慢,以便将来再次使用这些数据(通过查看读写)。通常使用磁盘读写速度、磁盘I/O请求数等来衡量。

    • 网络

      带宽,通常使用发送/接收的速率来衡量。

性能测试工具

  • Apache JMeter:功能强大且广泛使用的开源性能测试工具。支持多种协议和技术,包括HTTP、HTTPS、Web Services、JDBC、FTP等,可以模拟大量并发用户和生成复杂的测试场景。
  • LoadRunner:一款商业性能测试工具,适用于复杂的企业级应用程序。提供了广泛的协议和技术支持,具备强大的负载生成和监控能力,能够模拟大规模用户负载和复杂的业务流程。
  • Locust:开源的负载测试工具,使用Python编写。具有简单的语法和易于编写的脚本,可以模拟大量并发用户并执行复杂的测试场景。它还提供了实时监控和可视化报告功能。

不同的工具各具特色,在不同的测试需求和项目环境下选择适合的工具即可,这里推荐JMeter和Locust。

性能测试流程

性能测试流程通常包含以下步骤,可根据具体项目和需求进行调整和适应:

  • 分析性能需求,确定测试目标

    性能指标可由产品经理或项目经理制定,或通过日志监控分析确定性能测试场景以及指标。

    例如:事务通过率为100%,TOP99%在5000ms以内,最大并发用户数为1000人,CPU和内存的使用率在70%以下。

  • 制定性能测试计划

    制定性能测试策略,包括测试范围、测试环境、测试数据和负载配置等。

    确定测试的时间(通常在功能稳定后,如第一轮测试后进行)和资源限制,制定测试计划的时间表和里程碑。

  • 编写测试方案

    选择适合的性能测试工具,如JMeter、LoadRunner等。选择适当的监控工具,用于监测系统资源使用情况和性能指标。

  • 搭建/确认测试环境,准备测试数据

    搭建符合测试需求的环境,包括硬件、软件、网络和数据库等。
    配置测试服务器、负载发生器和监控工具,确保准备就绪。

  • 编写性能测试脚本

    根据测试场景和负载类型,编写测试脚本,定义用户操作和事务流程。
    设置性能测试工具的参数,如并发用户数、请求频率等。

  • 性能测试脚本调优(脚本增强)

    设置检查点、参数化、关联、集合点、事务、调整思考时间,删除冗余脚本。

  • 分析和优化

    对测试结果进行分析,识别性能瓶颈和问题所在,根据分析结果,提出优化建议和解决方案。

    收集相关数据和日志信息提单给开发同学。

  • 回归测试

    进行性能调优和优化测试,验证改进措施的有效性。同时业务测试也要回归,避免优化性能后影响功能的正常使用。

  • 编写测试报告

    撰写性能测试报告,总结测试结果和分析,包括性能指标和问题列表。
    提供优化建议和改进措施,供开发团队参考和实施。
    将报告交付给相关团队和利益相关者,进行讨论和反馈。

  • 进行持续性能监控

    在系统上线后,进行定期的性能监测和测试,确保系统的稳定性和可靠性。
    根据实际使用情况和变化的需求,及时调整和优化系统的性能。

性能测试学习路线

  • 理解基本概念和原理

    学习性能测试的基本概念,例如性能指标、负载、吞吐量、响应时间等。

    了解性能测试的重要性,以及如何评估系统的性能和稳定性。

  • 掌握性能测试工具

    选择一款常用的性能测试工具,推荐JMeter,学习性能测试工具的基本原理和使用方法,例如:JMeter常用的组件和元件、JMeter实现参数化的三种方法、JMeter响应结果断言和cookie管理器、同步计时器实现并发场景、接口关联性之正则表达式和JSON表达式提取器、JMeter服务器资源监控和聚合报告分析等。

  • 工具增强

    由于图形化压测需要消费资源,所以可以使用命令行脱离图形进行压测。当单机JMeter提供压力不够时,可以学学分布式压测。JMeter还可以学习基于Beanshell等第三方插件方式做二次开发,还可以将编写和调试好的脚本丢到Linux非GUI环境中执行,解决Jmeter在Windows环境下套接字太多,负载过大的痛点。

  • 分层监控学习

    简单的使用命令(例如Linux命令df、du、free、netstat等)监控服务器资源,包括CPU、内存、磁盘、网络等,会指标分析。如果感觉不够直观,还可以学习如何搭建Prometheus+Exporter+Grafana进行图形化界面展示指标,也可以监控硬件和数据库。除此之外,还可以学习下SkyWalking做分布式链路监控,并结合钉钉做报警机制。

  • 性能瓶颈分析

    学会分析常见的性能问题,例如:CPU飙升如何定位到代码级别、接口响应时间过长怎么分析、慢查询SQL问题(慢SQL可参考往期文章「慢查询 SQL 排查」)等。

    简单来说,性能测试不达标就要判断是代码问题还是服务器资源问题,例如:通过监控系统的物理资源,发现CPU占用100%,或者内存占满,带宽打满等就大概率是服务器资源问题,就提单子给运维同学。如果CPU、内存、带宽等都达标,测试发现还有性能问题,那就是开发问题,就要指派给开发去处理。

    还可以通过工具如Arthas定位代码链路问题,总之到这个段位水就比较深了,常常需要跟开发同学配合一起发现解决问题。

  • 性能测试平台开发

    到这一阶段基本属于性能测试中的大佬了,一方面需要懂性能测试的原理,另一方面需要会前后端开发技术栈,例如:前端Vue,后端SpringBoot、MyBatis等。专门做全链路压测平台的一般都是互联网大公司,有的是基于Jmeter套个壳子做二次开发,有的甚至完全脱离Jmeter开发自己的平台,就看公司需求跟成本投入了。

好了,两块钱的性能测试就聊到这里吧,关于性能测试的更多知识、工具的使用以及性能瓶颈分析和优化,我们下次再聊吧,该吃饭了,拜了个拜 ~