迈向及格线的开发必备的JMeter性能测试总结1:基础概念与环境搭建

1,584 阅读17分钟

一、背景

最近几年经常发现,不管是面试也好,还是日常工作也好,各个公司的领导总是希望自己下面的员工能够快速成长,能多承担一些责任,能主动的去发现和解决当前环境存在的一些现象和不足,而在这其中,不管是刚毕业的学生还是工作了一段时间的程序员,都会觉得在某一时期,感觉当前自己的工作没啥工作质量和水平,每天坐着重复性且很常见的开发工作,而在这其中会忽略一项东西,就是:性能测试

当出去面试的时候,如果想体现自己的系统的业务量和并发情况的时候,面试官则会通过与自己的交谈,来了解当前项目的QPS等性能指标。此时,我相信大多数不在互联网大厂的程序员们,都是没有主动做过当前系统的性能测试的,可能领导没要求做、客户没要求做、项目工期紧、业务量不高、测试岗位的人员负责等。

而我觉得,一个程序员的及格线的标准其中一条可能就是:
对自己的开发的代码、工作范围、结果进行负责,做到有始有终,事事有交代,且持续更新迭代和关注

而现实大部分环境下,很多人其实都缺乏主动承担的能力(钱不到位哈等等原因),可能当前没要求做或者没环境,自己可能也就一直处于没有使用的状态。

性能测试则是检验我们日常开发的代码自身健康性、稳定性的其中一个环节,我们做完了自己职责内的工作情况下,可以去执行一下性能测试来检验我们的代码,是否具备了基本性能要求。

准备写一写自己的经验吧,顺便也学习点知识分享一下。

二、性能测试概述

2.1、测试灵魂三问

问题1:什么是压力测试&性能测试?

压力测试(英语:Stress testing)是针对特定系统或是组件,为要确认其稳定性而特意进行的严格测试。会让系统在超过正常使用条件下运作,然后再确认其结果。 

性能测试就是通过特定的方式对被测试系统按照一定测试策略施加压力,获取该系统的响应时间、TPS、吞吐量、资源利用率等性能指标,来检测系统上线后能否满足用户需求的过程。

说白了就是对系统不断施加压力,来预估系统负载能力的一种测试。:

问题2:为什么要对系统进行压测呢?有必要么?:

 一般而言,只有在系统基础功能测试验证完成、系统趋于稳定的情况下,才会进行压力测试。:

问题3:压测目的是什么?

1. 当负载逐渐增加时,观察系统各项性能指标的变化情况是否有异常

2. 发现系统的性能短板,进行针对性的性能优化

3. 判断系统在高并发情况下是否会报错,进程是否会挂掉

4. 测试在系统某个方面达到瓶颈时,粗略估计系统性能上限

简单来说:

2.2、性能测试的指标

在性能测试的过程中,QPS和TPS是常见的统计指标,衡量一个系统性能的重要指标之一。

**QPS,**全名 Queries Per Second,意思是“每秒查询率”,是一台服务器每秒能够响应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

**TPS,**即 Transactions Per Second的缩写,每秒处理的事务数目。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。 客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息作出的评估分。

Qps 基本类似于 Tps,但是不同的是,对于一个页面的一次访问,形成一个 Tps;

但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“Qps”之中。

常见的核心指标如下:

性能指标常见简写与含义表示如下:

2.3、性能测试的指标的关系图

针对主要的四种性能指标【响应时间、并发用户数、吞吐量、资源使用率】,它们之间存在一定的相关性,共同反映出性能的不同方面。 这里放一张非常经典的图片:

如何速记这个图:2333 ,即两个点,三条线,三个区,三个状态 

在这个图中,定义了三条曲线、三个区域、两个点以及三个状态描述。 

  • 三条曲线:
  1.  吞吐量的曲线(紫色),表示在不同负载下系统的吞吐量变化情况。吞吐量指的是系统在单位时间内能够处理的请求数量。
  2.  利用率(绿色) ,表示在不同负载下系统资源的利用率变化情况。利用率指的是系统资源(如CPU、内存、网络带宽等)的使用程度。
  3. 响应时间曲线(深蓝色),表示在不同负载下系统的响应时间变化情况。响应时间指的是系统处理请求所花费的时间。
  • 三个区域:
  1.  轻负载区(Light Load) ,表示系统处于较低负载状态,吞吐量高、响应时间低、资源利用率较低。
  2. 重负载区(Heavy Load) ,表示系统处于较高负载状态,吞吐量可能达到峰值,响应时间可能增加,资源利用率较高。
  3. 塌陷区(Buckle Zone), 表示系统负载过高,无法正常处理请求,吞吐量下降,响应时间急剧增加,资源利用率过高。
  • 两个点:
  1.  最优并发用户数(The Optimum Number of Concurrent Users) ,表示系统负载过高,无法正常处理请求,吞吐量下降,响应时间急剧增加,资源利用率过高。
  2. 最大并发用户数(The Maximum Number of Concurrent Users) ,表示系统能够处理的最大并发用户数量。超过该数量,系统的性能可能开始下降,响应时间增加,吞吐量下降。
  • 三个状态描述:
  1. 资源饱和(Resource Saturated),表示系统资源已经达到或接近极限,无法满足当前的负载需求。此时,系统的性能可能下降,响应时间增加。
  2.  吞吐下降(Throughput Falling),表示系统的吞吐量开始下降,无法处理更多的请求。这可能是由于资源不足或系统负载过高导致的。
  3. 用户受影响(End Users Effected) ,表示系统性能下降,影响到最终用户的体验。用户可能遇到延迟、超时或错误等问题。

2.4、性能测试的时机

压测的时机很重要,如果时间选择不对,可能会做无用功,简单总结下5个常见的时机:

2.4.1、上线前压测

常规操作是在上线前,对系统进行一个摸高压测,根据预估的流量,对系统配置进行优化调整,保证运行期间,系统能正常运行。

2.4.2、项目上线稳定后,对系统评估

系统上线后,随着用户量不断增加,承受的压力会越来越大,为了让系统在未来的时间内稳定运行,需要通过压测对系统进行评估,以调整配置或优化接口,来充分应对不断增长的用户量。

2.4.3、项目研发后期,对系统的检验

在项目后期,由于领导或团队的要求,需要对系统的稳定性做校验,保证系统短时间内流量陡增时能稳定运行,可以给系统的部署提供参考。

2.4.4、线上出现性能问题

有些项目为了抢占市场,节省时间,完成了基本的功能就上线了,没有做压测,当用户突然增加出现线上性能问题后,反过来做压测,这种情况的风险是很大的,不推荐。

2.4.5、合作方要求

有些合作方对性能有明确的要求,并且写进了合同,这种情况下就必须去做压测了。

2.5、性能测试的步骤

1、需求分析:明确定义性能指标,响应时间、QPS、CPU占用率等

2、基于性能指标定义到实际的性能场景以及测试数据的量级

3、脚本准备:单业务场景、混合场景等

4、执行脚本:关注到关键指标的变化,吞吐量,响应时间等

5、性能诊断:内存、CPU、磁盘IO、网络IO等

2.6、性能测试的工具

简单测试场景:

wrk:一个快速而现代的HTTP基准测试工具,适用于命令行使用。它支持多线程,能够模拟高并发负载,并提供详细的性能报告。

ApacheBench (ab工具):Apache HTTP服务器附带的工具,用于进行基本的HTTP性能测试。它可以发送并发请求并测量响应时间和吞吐量等指标。

复杂测试场景:

Apache JMeter: 

优势:免费且开源,支持多种协议(HTTP、FTP、JDBC等),可模拟高并发负载,具有灵活的测试脚本编写和调试功能。 

使用场景:适用于Web应用程序和Web服务的性能测试,支持复杂的测试场景和流程

LoadRunner: 

 优势:功能强大且广泛使用,支持多种协议和技术,具有分布式测试能力,提供可视化的测试脚本录制和编辑工具。 

使用场景:适用于复杂的企业级应用程序和系统的性能测试,支持大规模负载和复杂的测试场景。 

Locust

优势:开源且易于使用,基于Python编写,支持分布式测试,可用于编写可读性强的测试脚本。 

使用场景:适用于Web应用程序和API的性能测试,具有简单的脚本编写和扩展性。

2.7、性能测试监控工具

Linux系统的命令:top、vmstat、iostat、ss、netstat

可视化监控:Prometheus+Grafana+InfluxDB+Skyworking

其他监控工具:nmon、arthas

三、性能测试的类型

性能测试的类型包括如下几个方面:

这几个类型内容来自于书籍《企业性能测试:体系构建、落地指导与案例解读》一书,感兴趣的小伙伴可以去阅读一下。

四、JMeter的下载和安装

作为最常用的开源测试软件,这里选择了JMeter进行操作。

JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。不仅体积小功能全,而且使用起来也非常方便和简单。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器等等。

4.1、下载

访问JMeter官方的下载主页,jmeter.apache.org/download\_j…

JMeter官方地址:jmeter.apache.org

JMeter中文网:www.jmeter.com.cn/

4.2、安装与启动

下载后,提前配置好Java的环境变量,然后解压ZIP压缩包,双击启动bin目录下的jmeter.bat文件即可,启动成功后的界面如下所示:

4.3、常用的基础配置

为了符合我们日常测试的习惯,需要修改某些基础的配置。具体如下:

4.3.1、修改页面配置为中文语言

在JMeter的bin的目录下,编辑jmeter.properties文件中的国际化配置选项,打开或取消如下注释,并更改为中文配置,大概在文件的39行:

#Preferred GUI language. Comment out to use the JVM default locale's language.
language=zh_CN

4.3.2、更改配置解决响应乱码的问题

在JMeter的bin的目录下,编辑jmeter.properties文件的编码配置,大概在文件的1098行:

# The encoding to be used if none is provided (default ISO-8859-1)
sampleresult.default.encoding=UTF-8

从 JMeter 5.6.1版本开始,默认调整为了UTF-8

4.3.3、更改操作系统注册表

如果当前JMeter的机器是Window系统的机器,在测试的时候,可能会发现某些Socket无法创建的问题,此时需要更改操作系统的TCP连接参数限制:

java.net.SocketException: Socket operation on nonsocket: connect

参考如下链接

zhuanlan.zhihu.com/p/470234648…

  • 新建DWORD值,name:TcpTimedWaitDelay,value:30(十进制)设置为30秒

  • 新建DWORD值,name:MaxUserPort,value:65534(十进制)最大连接数65534

4.3.4、更改默认启动内存

当并发数量过多时,JMeter内存配置不满足此时并发需求,会导致请求出现异常使结果不正确。Windows下右键编辑jmeter/bin/jmeter.bat,默认是1G的内存,修改以下配置即可:

# 修改Xmx的值来增大JMeter内存配置
set HEAP=-Xms1g -Xmx2g

4.4、常用的插件安装

通过插件可以更好的帮助我们完成测试。

4.4.1、JMeter插件管理器下载

该插件是一个管理插件的插件。下载页面(jmeter-plugins.org/downloads/a…

文档说明地址:jmeter-plugins.org/wiki/Plugin…

重启后,在选项中可以看到plugins Manager菜单,如下所示:

4.4.2、待安装的插件列表

1、Basic Graphs(可选插件的前两个)

2、Additional Graphs (可选插件的前两个)

3、jpgc - Standard Set (最后一个)  

4、PerfMon (Servers Performance Monitoring)     

操作图片如下所示:

插件1和2:

插件3:

插件4:

五、一步一步操作的JMeter的第1个案例

5.1、启动JMeter添加线程组

TIPS**:在添加接口请求之前需要先添加线程组,用来管理所有接口请求,一般一个功能模块为一个线程组**

在默认的【测试计划】节点下,鼠标右键添加-》线程-》线程组,如下所示:

然后在线程组中设置待模拟的并发用户数5,如下所示:

其中:

线程组常用来模拟一组用户访问系统资源(API接口)。假如客户机没有足够的能力来模拟较重的负载 ,后续可以使用 JMeter分布式压力测试,通过一个JMeter的Master来远程控制多个JMeter的Salve完成测试。

线程数:用来发送http请求的线程的数量

Ramp-Up:多少时间范围内启动所有线程,用于告知JMeter 要在多长时间内建立全部的线程。 这里保持默认。 如果n=1,那就表示要在1s以内把5个线程全部启动起来。

循环次数:根据需求进行选择,这里也可以选择调度器中的持续时间为1分钟。循环次数直接决定整个测试单个线程的执行时间,和整体测试执行时间

单线程执行时间 = 单请求平均响应时间 x 循环次数

整个测试耗时 = 单线程执行时间 + (Ramp-Up - Ramp-Up / 线程数) 

5.2、为线程组添加HTTP请求

在线程组的节点下,鼠标右键添加=》取样器=》HTTP请求,如下所示:

以百度的地址为例,填写相关协议、服务器的地址、请求方法、路径、和请求参数:

5.3、为线程组添加汇总报告

在测试的HTTP请求节点下,鼠标右键选择添加-》监听器-》汇总报告,如下所示:

5.4、为线程组添加聚合报告

在测试的HTTP请求节点下,鼠标右键选择添加-》监听器-》聚合报告,如下所示:

5.5、为线程组添加查看结果树

在测试的HTTP请求节点下,鼠标右键选择添加-》监听器-》查看结果树,如下所示:

5.6、开始执行测试

以上操作配置完成后,我们单击保存按钮,执行保存测试计划:

然后单机上方的绿色按钮,开始执行测试,测试的结果会显示在聚合报告和结果树中。

聚合报告样例如下:

关于这个结果的说明如下:

样本(sample): 发送请求的总样本数量

响应时间【单位ms】:

平均值(average):平均的响应时间

中位数(median): 中位数的响应时间,50%请求的响应时间

90%百分位(90% Line): 90%的请求的响应时间,意思就是说90%的请求是<=1765ms返

回,另外10%的请求是大于等于1765ms返回的。

95%百分位(95% Line): 95%的请求的响应时间,95%的请求都落在1920ms之内返回的

99%百分位(99% Line): 99%的请求的响应时间

最小值(min):请求返回的最小时间,其中一个用时最少的请求

最大值(max):请求返回的最大时间,其中一个用时最大的请求异常(error): 出现错误的百分比,错误率=错误的请求的数量/请求的总数

吞吐量TPS(throughout): 吞吐能力

Received KB/sec----每秒从服务器端接收到的数据量

Sent KB/sec----每秒从客户端发送的请求的数量

结果分析说明参考资料:www.cnblogs.com/YouJeffrey/…

5.7、小结

上面测试遇到的几个概念描述如下:

1、测试计划:是使用 JMeter 进行测试的起点,它是其它 JMeter测试元件的容器 

2、线程组:代表一定数量的用户,它可以用来模拟用户并发发送请求。实际的请求内容在Sampler中定义,它被线程组包含。 线程组元件是任何一个测试流程的起始点,在一个测试计划中的所有元件都必须在某个线程组下。

 线程组概括说明: 线程组是一个测试流程的起始点。 线程组中可以有多个线程。线程组也可以看作是一个虚拟用户组,线程组中的每一个线程都可以理解为相当于一个“虚拟用户”。 

线程组中一个取样器代表一个请求,一个请求等同于一个线程。 每个线程都会独立的运行测试计划,互不干扰,多个线程用于模仿对服务器的并发访问。

 线程组元件可以设置线程数、设置执行测试的次数等操作。

 3、配置元件:维护Sampler需要的配置信息,并根据实际的需要修改请求的内容。 

 4、取样器(Sampler):是性能测试中向服务器发送请求,记录响应信息、响应时间的最小单元,如:HTTP Request Sampler、FTP Request Sample、TCP Request Sample、JDBC Request Sampler等,每一种不同类型的sampler 可以根据设置的参数向服务器发出不同类型的请求。 

 5、监听器:负责收集测试结果,同时确定结果显示的方式。

六、总结

好,今天主要的内容就是这些了,简单的说了一些基本介绍了入门的一个基础案例,在并发测试的时候,建议不要一上来就搞超大规模的并发数测试,这个是非常不推荐的,目前大部分推荐的玩法是逐渐递增请求线程数的方式,来测试系统的性能,我们也叫他梯度测试。

后续我看看在写一写实际工作中我们常用的一些玩法,比如:CSV数据文件变量、梯度测试、分布式压测、服务器指标监控监控、Grafana可视化监控展示等。

喜欢本篇文章的,请点赞、收藏、分享、评论哦,一起和我交流吧。