一 前言
JMeter工具的官方下载地址是:https://jmeter.apache.org/download_jmeter.cgi 。
JMeter是一款纯java开发的(支持跨平台)压测工具。使用JMeter工具进行压力测试之前,需要预先配置好JDK环境。最新版本JMeter-5.2.1要求JDK版本在1.8以上。
下载并解压压缩包apache-jmeter-5.2.1.zip后,既可以直接在Windows上面运行,也可以在Linux上面运行。
ps: 由于上传到博客的图片清晰度不够,看到的效果不太好。 我把博客中需要用到的所有文件都加以分享,分享链接: JMeter-5.2.1并发测试,提取码是:cw4y。
解压压缩包并在本地启动JMeter客户端后,将文件【1主3从集群并发测试计划.jmx】导入客户端中。按博客描述步骤操作,能自行在本地看到类似的测试效果图,这样学习效果更佳。
二 JMeter-GUI使用说明
2.1 JMeter-GUI主页
点击./bin/jmeter.bat,会进入JMeter-GUI工具的首页如下:
注:JMeter支持切换语言。如果对英文不是特殊熟悉的,我们可以在【Options > Choose Language > Chinese(Simplified)】,选择当前工具使用的语言为简体中文。
2.2 JMeter-GUI入门教程
下面会介绍一个简单的入门教程。
2.2.1 JMeter-GUI 测试接口说明
要测试的接口---在知乎搜索与jmeter相关的内容,其实际展示的效果图如下:
2.2.2 JMeter-GUI 配置测试计划
我们可以自定义【测试计划】的名称为“第一次使用JMeter的测试计划”,并添加一个【线程组】如下(参数为默认值即可):
在JMeter的视角,一个线程就是一个用户。要测试并发能力,可以修改线程数的值并查看其表现即可。
下面需要为【线程组】添加3个最基本的子组件
-1. 为【线程组】添加子组件---取样器下的【HTTP请求】,并设置内容如下:
这里主要是设置HTTP请求的资源路径和参数,如:我们要请求的URL( https://www.zhihu.com/search?type=content&q=jmeter )。实际组装该HTTP请求对应的资源路径和参数效果图就会上图所示(基本与postman一致)。
-2. 为【线程组】添加子组件---监听器下的【察看结果树】
在【察看结果树】中,可以查看每次发起HTTP请求的请求和响应信息
-3. 为【线程组】添加子组件---监听器下的【汇总报告】
在【汇总报告】,我们能看到最终的统计信息(发起的所有HTTP请求的相关信息汇总)。
点击绿色的启动按钮,JMeter会推荐我们持久化配置信息(将配置信息以XML的格式保存到一个jmx格式的文件中)。保存成功后,JMeter即会按配置信息,执行【测试计划】。
2.2.3 JMeter-GUI 测试计划结果解析
基于上面的配置信息,JMeter帮我们生成的配置文件(第一次使用JMeter的测试计划.jmx)的内容如下:
见文知义,我们可以直接修改该配置文件的内容,来修改【测试计划】的配置项。
在组件【察看结果树】中,查看该测试计划发起的HTTP请求的请求与响应信息如下:
在组件【汇总报告】中,查看该测试计划发起的所有HTTP请求的汇总信息如下:
测试结果简单解释说明:
- 在【察看结果树】中,能看到该接口已经调通。相关的请求参数和响应信息与设置项也基本一致。
- 在【汇总报告】中,能看到【样本---http请求测试】为1,【最小值和最大值---响应等待时间,单位是毫秒】为417ms,【异常%---失败请求次数占比】为0%,【吞吐量---单位时间处理请求数】为2.4/sec三 JMeter插件相关说明
三 JMeter插件相关说明
3.1 JMeter插件安装步骤说明
- 首先,需要下载JMeter插件管理工具包( https://jmeter-plugins.org/install/Install/ )jmeter-plugins-manager.jar。然后将该jar包放在目录./lib/ext/下,重启JMeter即可在GUI界面栏中使用JMeter插件管理工具。
- 点击【选项 > Plugins Manager】打开插件管理界面如下:
【Installed Plugins】展示的是已经安装过的插件列表;
【Available Plugins】展示的是可用的插件列表;
【Upgrades】展示的是可更新的插件列表。
勾选待安装或待更新的插件,点击【Apply Changes and Restart JMeter】即可安装或更新相关插件。
这里有两点要额外注意!!!
- JMeter和其插件的版本兼容没有想象中那么完美。如非必要,不要手动去更新插件版本。
- JMeterPlugin-Manager帮我们管理插件并没有那么神秘。其实只是将相关插件对应的jar包从官网下载并放到目录 ./lib/ext/ 下。因此在CLI模式(非图形化界面模式)下要使用这些插件,只需要自行下载这些插件对应的jar包放到该目录下即可。
ps: 所有插件都可以从JMeter官网( https://jmeter-plugins.org )下载,只是下载速度实在不敢恭维。
3.2 JMeter常用插件介绍
3.2.1 插件【3 Basic Graphs】
插件【3 Basic Graphs】中,监测并实时展示并发性能中最基本的3个指标:当前存活线程数(Active Threads Over Time),平均响应时间(Response Times Over Time),TPS每秒处理事务数(Transactions per Second)。
安装插件【3 Basic Graphs】的过程如下图,其他插件的安装不再赘述。
从安装界面很容易可以看到【3 Basic Graphs】对应的插件是【jppc-graphs-basic 2.0】,其对应的插件源码文件jmeter-plugins-graphs-basic-2.0.jar 还是会放在目录 ./lib/ext/ 下。因此,如果需要在CLI模式(大部分的Linux环境)下测试,只需要将该文件(必须先把之前的插件管理 jmeter-plugins-manager-1.3.jar)放到目录 ./lib/ext/ 下即可。
3.2.2 插件【Custom Thread Groups】
插件【Custom Thread Groups】,这个插件可以自定义线程组。以图片的形式,更加形象直观地展示线程组的工作进度。
设置线程组的工作进度有多种方式,这里更推荐使用【Ultimate Thread Group】方式,操作示意图如下:
线程组的默认值及其效果图如下:
从图片中可以很直观地看到:JMeter在30秒内逐步启动100个线程,稳定运行60秒后,在10秒内逐步释放这100个线程。
因此,我们关注测试开始的30~90秒内某个接口的并发能力表现即可。在这60s内,会同时有100个用户在访问该接口(JMeter默认是1s调用一次HTTP请求)时。这段时间该接口的并发表现能力,就基本等同于其实际承载100并发量的性能表现状况。
3.2.3 插件【KPI vs KPI Graphs】
插件【KPI vs KPI Graphs】,平均响应时间或吞吐量随当前存活线程数(用户个数)变化的趋势图。
添加平均响应时间或吞吐量趋势图的操作示意图如下:
这里就先不展示最终测试效果,只提供添加示意图的操作路径(后文会有展示效果图)。
3.2.4 插件【PerfMon(Servers Performance Monitoring)】
插件【PerfMon(Servers Performance Monitoring)】,展示的是服务器实时性能表现图。
首先,需要下载解压安装包ServerAgent-2.2.3.zip并启动【ServerAgent】服务。
以命令(startAgent.sh(Linux))或(startAgent.bat(Windows))方式启动该服务后,该服务会实时地获取服务器性能,并以TCP协议的方式在端口4444暴露服务。(配置启动服务后,JMeter可以自动从该端口获取对应服务器的性能信息)。
添加本地测试实时当前服务器性能表现的效果图如下:
四 完整压力测试
4.1 场景模拟说明
待测试接口---在知乎搜索与jmeter相关的内容。该接口请求知乎资源的URL路径如下:https://www.zhihu.com/search?type=content&q=jmeter
该接口最终的效果图,已在上文展示过,这里就不再重复添加。
本次预备测试并发量为每秒300时,该接口最终的性能表现。
具体配置是:1主client + 3 从server。
主client对应的是部署在Windows系统的JMeter-GUI图形化工具。它不会发送任何请求,但它是作为一个主调度机,能自定义去命令从执行机发送请求,并将最终的性能测试结果报告,统一交由主调度机来进行汇总。
从server对应的是部署在Linux系统的jmeter-server服务。它会基于主调度机发送的命令及测试计划,去执行HTTP请求操作。每个从server需要达到每秒100的并发量,整个压测计划就是100 * 3 = 每秒300并发量。
由于JMeter会有版本不兼容的问题,后续操作的前提是:使用统一版本的环境、JMeter及其插件、ServerAgent等。
JDK版本为 1.8 (Windows和Linux都是1.8,只是使用的安装包不同)
JMeter版本为 5.2.1
ServerAgent 版本为 2.2.3
4.2 Windows---主client配置
4.2.1 修改配置文件 jmeter.properties
修改Windows系统中主client的配置文件 ./bin/jmeter.properties 的两个参数:
# 添加远端的从server--- JMeter服务器地址,用英文逗号分隔
remote_hosts=192.168.139.149,192.168.139.150,192.168.139.151
# 取消调用远端接口的SSL认证,不设置会报异常FileNotFoundException: rmi_keystore.jks
server.rmi.ssl.disable=true
4.2.2 测试计划新建说明
新建测试计划如下:
测试计划详细说明如下:
-【1-client + 3-server集群并发测试计划】:这是一个对测试计划的重命名操作。
- 【自定义线程组---3*100并发】:添加路径是【线程(用户) > jp@gc - Ultimate Thread Group】下添加自定义线程组,并进行了重命名操作。
- 【HTTP请求】:添加路径是【取样器 > HTTP请求】,封装信息并组装HTTP请求。
- 【服务器实时性能采集】:添加路径是【监听器 > jp@gc - PerfMon Metrics Collector】,并进行了重命名操作。
- 【实时用户数】:添加路径是【监听器 > jp@gc - Active Threads Over Time】,并进行了重命名操作。
- 【实时每秒事务数】:添加路径是【监听器 > jp@gc - Transactions per Second】,并进行了重命名操作。
- 【实时平均响应时间】:添加路径是【监听器 > jp@gc - Response Times Over Time】,并进行了重命名操作。
- 【察看结果树】:添加路径是【监听器 >察看结果树】。
- 【平均响应时间/用户数的趋势图】:添加路径是【监听器 > jp@gc - Response Times vs Threads】,并进行了重命名操作。
- 【吞吐量/用户数的趋势图】:添加路径是【监听器 > jp@gc - Transaction Throughput vs Threads】,并进行了重命名操作。
- 【聚合报告】:添加路径是【监听器 > 聚合报告】。
也可以将文件【1主3从集群并发测试计划.jmx】直接导入JMeter-GUI工具(部分配置可能需要修改),安装上述【测试计划】的组件配置。
4.3 Linux---从server配置
每一个Linux虚拟机上,都需要进行如下配置。
4.3.1 配置JMeter环境变量
解压JMeter安装包后,将其加入环境变量,具体执行如下命令:
# 以vim文本编辑器,打开环境变量对应的配置文件
vim /etc/profile
# 追加JMETER_HOME的地址---这个该文件夹的实际存放位置为准
export JMETER_HOME=/home/jmeter/apache-jmeter-5.2.1
# 即时启用配置---不执行该命令,就只有在关机重启后才会生效。
source /etc/profile
4.3.2 修改配置文件 jmeter.properties
修改Linux系统及从server的配置文件 ./bin/jmeter.properties 的参数:
# 取消调用远端接口的SSL认证,不设置会报异常FileNotFoundException: rmi_keystore.jks
server.rmi.ssl.disable=true
4.3.3 启动暴露服务器性能服务ServerAgent
解压暴露服务器性能服务的压缩包,并启动该服务的详细命令如下:
# 解压压缩包
cd /home/jmeter/ServerAgent-2.2.3
unzip ServerAgent-2.2.3.zip
# 启动暴露服务器性能服务ServerAgent,相关服务器性能数据会暴露在4444端口
cd ServerAgent-2.2.3
nohup ./startAgent.sh &
4.3.4 启动从节点jmeter-server
执行如下命令即可
# 为当前用户root添加可执行权限
chmod -R 755 /home/jmeter/
# 启动jmeter-server服务,等待主client发送执行测试计划命令,hostname为本机ip地址
cd /home/jmeter/apache-jmeter-5.2.1/bin
./jmeter-server -Djava.rmi.server.hostname=192.168.139.149
4.4 启动集群压测及查看并发表现
4.4.1 启动所有server
如果配置无误,选中【远程启动】,可以查看所有待启动server对应的ip地址。可以单独启动,也可以一键启动远程所有server。由于我们这里需要测试3*100并发量,所以直接选择点击按钮【远程启动所有】即可。
4.4.2 线程组(用户群)执行计划
如下图所示,每个server都是在10秒之内启动100个线程,持续30秒后,再在10秒之内释放这100个线程。也就是说,在这中间的30秒,并发量就是3 * 100 即300的并发量。
4.4.3 HTTP请求解析效果图
将接口 https://www.zhihu.com/search?type=content&q=jmeter 进行解析,并做如下图所示的封装(实际使用时,基本与postman用户一致)。
只要关注的一点是:JMeter不会去解析HTML页面(不会执行页面的JavaScript代码)。部分测试能够看到页面所有的信息,但官方文档明确说明,解析页面不计入并发统计时间。
4.4.4 服务器实时性能图
如下图所示,我们可以实时查看每个服务器的CPU,Memory,Swap,Disks I/O, Disks I/O,NetWork I/O,TCP,JMX,EXEC,TAIl等信息。需要这些额外信息,添加该主机IP的4444端口的该字段即可。
4.4.5 实时用户数
如下图所示,我们可以查看随测试计划的推移,每秒对应的实时用户数。
4.4.6 实时每秒事务数
如下图所示,我们可以查看随测试计划的推移,每秒处理的事务数。
4.4.7 实时平均响应时间
如下图所示,我们可以查看随测试计划的推移,每秒对应的平均响应时间。
4.4.8 察看结果树
如下图所示,我们可以查看每一个HTTP请求中的请求和响应的详细信息。
4.4.9 平均响应时间/用户数的趋势图
如下图所示,我们可以查看随用户数的改变,系统处理该用户数同时发起的HTTP请求时,该接口显示的平均响应时间。
4.4.10 吞吐量/用户数的趋势图
如下图所示,我们可以查看随用户数的改变,系统处理该用户数同时发起的HTTP请求时,该接口显示的吞吐量。
4.4.11 聚合报告
如下图所示,我们可以查看最终的汇总聚合报告。
- 【Samples】样本,表示的是总共发起的请求数。
- 【Average】平均值,表示的是最终的平均响应时间,单位是毫秒。
- 【Min】最小值,表示的是耗时最短的响应时间,单位是毫秒。
- 【Max】最大值,表示的是耗时最长的响应时间,单位是毫秒。
- 【Error%】错误率,表示的是处理请求的出错率百分比。
- 【Throughput】吞吐量,表示的是平均每秒处理请求数。