ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JMeter 5.6.2接口压测全攻略:配置、脚本与容量评估

JMeter 5.6.2接口压测全攻略:配置、脚本与容量评估 简介Apache JMeter 5.6.2 是 Apache 组织维护的开源压力测试工具基于 Java 开发可跨平台运行于 Windows、Linux、macOS 等环境。面向需要开展性能测试、负载测试的开发者与测试人员用于评估系统在高并发下的稳定性和响应速度。该资源为 rar 压缩包约 88.26MB文件总数为 0具体文件清单暂未提供解压后可直接运行 bin 目录下的启动脚本。JMeter 内置线程组、采样器、监听器、断言、定时器、配置元件等核心组件可帮助用户模拟多用户并发操作、验证服务器响应并收集测试数据从而定位系统瓶颈、优化性能。目前已有 327 人学习/下载适合正在学习性能测试或需要快速搭建压测工具的初中级测试人员。 JMeter 5.6.2 是我最近在压测任务里固定下来的版本。之前团队里有人还在用 3.x、4.x 的老包结果新机器上动不动就报 TLS 协议、JSON 解析之类的问题改脚本的时间比压测本身还长。这次从环境配置、脚本设计再到结果解读我完整跑了一遍流程发现很多坑只要提前设好参数就能绕过去所以整理成这篇能直接照着操作的笔记给刚开始做接口压测、性能测试的同学当参考。这篇文章围绕 JMeter 5.6.2 展开覆盖安装配置、HTTP 接口压测、文件上传、HTTPS 证书、MD5 签名、聚合报告分析等高频场景。无论你是要做简单的接口测试还是要给有小程序后端、Web 服务、甚至人脸识别系统做压力测试都可以按下面的步骤去搭一套自己的压测方案。1. 压测前的思维梳理先搞清楚 JMeter 5.6.2 在什么场景下最顺手很多人一上来就下载 JMeter然后照着教程建线程组、加 HTTP 请求跑完拿到报告却不知道怎么判断系统行不行。所以动手之前最好先理顺两个问题这个工具适合干什么以及你手上这个项目能不能直接用。1.1 为什么我这次选 5.6.2而不是旧版本JMeter 5.6.2 是 Apache 官方在 2023 年底到 2024 年初持续维护的一个稳定版本相比 4.x 或者更早的版本有几点对实际压测影响很大。第一是 JDK 兼容性。JMeter 5.6.2 官方要求 Java 8 以上但我实际使用下来推荐直接装 Java 17。原因是新版本里很多协议库尤其是 HTTPS、HTTP/2、WebSocket 相关的组件在高版本 JDK 下的表现更稳定也不容易出现“本地环境正常、压测机环境报证书错误”这种玄学问题。第二是插件兼容性。现在做压测几乎绕不开第三方插件比如jpgc系列、WebDriver Sampler、PerfMon等。老版本 JMeter 用插件时经常遇到“插件安装成功但在菜单里看不到”的问题5.6.2 配合插件管理器使用至少我踩过的插件兼容性坑少了很多。第三是 JSON 处理能力。接口压测里大量场景是发送 JSON 请求体并且从响应里提取 token 或某个字段作为下一个请求的参数。JMeter 5.6.2 内置的 JSON 提取器、JSON 断言器已经比较成熟不需要额外写太多 Beanshell 代码脚本维护成本低很多。所以结论很简单如果你的 JMeter 还停留在 3.x、4.x可以趁这次直接换到 5.6.2。如果是新项目直接用它没必要从旧版本开始学。1.2 适合的项目类型和人脸识别、接口等真实场景JMeter 本质上是基于 Java 的负载测试工具用它最舒服的场景有三类。第一类是 HTTP / HTTPS 接口压测无论 GET、POST、PUT还是带 Header、Cookie、Token、文件上传都能覆盖。比如“Jmeter 怎么测接口”这个需求本质上就是构造一个符合业务参数的 HTTP 请求再放到线程组里循环跑。第二类是模拟多用户并发场景。比如你要验证某个系统能不能扛住 1000 个用户同时登录JMeter 可以通过线程组直接模拟出这种压力。这里要理解一点JMeter 的“并发数”是把压力发送到服务端的请求并发能力不是真实用户数。真实用户会在页面上停留思考而压测请求是连续打过去的所以并发模型要按业务特征去设计。第三类是数据库、FTP、MQ、WebSocket 等协议层的扩展场景。虽然 JMeter 官方原生支持这些协议但很多人用到的主要还是 HTTP。至于“Jmeter 人脸识别系统压力测试”这类需求本质上也是接口压测。人脸识别系统通常暴露出来的是一个 HTTP 接口前端把图片上传过去后端返回识别结果。压测时要注意的一点是图片上传比普通 JSON 请求更消耗带宽和内存所以在设计线程数和压测机资源时要预留更多余量否则结果出来你会发现瓶颈在 JMeter 压测机上而不是被压的系统。2. 环境搭建JDK、安装目录、环境变量一次配置到位环境配置看起来简单实际踩坑的人特别多。多数启动报错都不是 JMeter 本身的问题而是 JDK 环境没配好。这里按 Windows 环境为例把每一步写清楚。2.1 JDK 安装与 JAVA_HOME 配置手把手JMeter 5.6.2 需要 Java 运行环境所以第一步是安装 JDK。建议从 Oracle JDK 或 OpenJDK 下载 Java 17 版本安装时记住安装路径。安装完成后需要手动配置环境变量。右键“此电脑” - “属性” - “高级系统设置” - “环境变量”在“系统变量”区域新增变量名JAVA_HOME 变量值C:\Program Files\Java\jdk-17注意这里的路径要换成你实际安装 JDK 的路径。然后在Path变量中追加一行%JAVA_HOME%\bin配置完成后打开一个新的命令行窗口输入以下命令验证java -version能正常输出版本号就说明 JDK 环境 OK。这里有个容易犯的错改完环境变量后如果终端是之前打开的一定要关掉重新开否则读取不到新配置。2.2 JMeter 下载、解压与 JMETER_HOME 配置JMeter 的官方下载入口是 Apache 官网的 JMeter 下载页面。选择二进制包apache-jmeter-5.6.2.zip下载后直接解压。解压路径建议不要带中文和空格比如D:\apache-jmeter-5.6.2否则某些脚本或插件在读取路径时会出现奇怪的问题。解压后同样需要配置 JMETER_HOME 环境变量变量名JMETER_HOME 变量值D:\apache-jmeter-5.6.2然后在Path中追加%JMETER_HOME%\bin配置完成后打开命令行输入jmeter -v能输出版本信息说明安装成功。如果提示“不是内部或外部命令”先检查环境变量是否有拼写错误再检查终端是否重新打开。2.3 启动验证与 GUI 界面说明环境配置好之后双击进入 JMeter 安装目录的bin文件夹运行jmeter.bat即可启动 GUI 界面。启动过程中不要关闭黑色的命令行窗口那个是 JMeter 的运行日志窗口关闭它会把 JMeter 直接带掉。在真实压测中我建议遵循一个原则GUI 模式只用来调试脚本正式压测用命令行模式。原因是 GUI 本身会消耗大量内存和 CPU尤其在线程数超过 100 时GUI 的光标闪烁、结果树刷新都会影响压测结果真实性。调试完成后保存为.jmx文件用下面的命令行执行jmeter -n -t test.jmx -l result.jtl -e -o report其中-n表示非 GUI 模式-t指定测试脚本-l指定结果文件-e生成 HTML 报告-o指定报告输出目录。这样跑完就能直接看到一份比较完整的 HTML 压测报告。3. 从零跑通一个性能测试任务测试计划、线程组、HTTP 请求配置好环境之后接下来就是把一个最简单的接口压测跑通。这里我用一个假想的登录接口来举例地址为https://api.demo.com/api/login请求方式为 POST请求体是 JSON。3.1 测试计划、线程组、HTTP 请求三层结构的理解JMeter 脚本的基本结构是三层测试计划 - 线程组 - 采样器。测试计划是根节点代表整个压测工程。线程组在测试计划下面用来定义压测的用户模型。采样器用来具体发送请求最常用的是 HTTP 请求采样器。前面会有个很容易搞混的概念“线程组”和“并发用户数”。在 JMeter 里线程组中的“线程数”就等于你要模拟的并发用户数量级。比如设置线程数为 50JMeter 就会启动 50 个虚拟用户每个用户按照你的脚本发出请求。如果设置循环次数为 10那就是每个用户连续执行 10 次请求。添加 HTTP 请求采样器的具体操作右键线程组 - Add - Sampler - HTTP Request。在采样器配置面板里填写协议、服务器名称、端口、请求方法、路径和请求体。如果接口需要传 JSON在 Body Data 里直接粘贴 JSON 字符串即可。这里有一个实操重点如果接口需要动态参数比如登录 token每次执行都要变化那么直接在 Body Data 里写死是不行的。解决办法是配合“用户自定义变量”或“CSV 数据文件设置”把参数值做成变量然后用${变量名}引用。3.2 线程数、Ramp-Up、循环次数怎么定线程组面板中有三个关键参数线程数、Ramp-Up Period、循环次数。线程数就是并发用户数这个好理解。Ramp-Up Period 表示在多少秒内把线程全部启动。比如线程数 100、Ramp-Up 设置为 20 秒那么平均每 0.2 秒启动一个线程。这样做的目的是逐步加压避免瞬时请求全部打过去导致服务端直接被打满结果全报超时反而测不出真实容量。循环次数可以填具体数字也可以勾选“永远”。在“每分钟吞吐量”或“单用户跑 1 分钟”这类场景下可以设置循环次数为永远再用“运行时控制器”添加持续时间比如运行 60 秒。或者用更简单的方法在调度器配置中勾选“持续时间”Seconds为 60。线程数、Ramp-Up 和循环次数的组合没有固定公式通常的做法是先小规模跑比如 10 线程、Ramp-Up 5 秒、循环 10 次确认脚本没有报错后再逐步加大压力。如果你做的是“内存压力测试”还要额外关注 JMeter 自身的内存设置后面第 5 节单独讲。3.3 添加断言和聚合报告判断结果好坏光有请求还不行必须能判断每个请求是成功还是失败。如果接口返回 HTTP 200但业务码其实是失败你看到的错误率就是 0导致结果失真。所以每个线程组下建议都加一个“响应断言”。右键线程组 - Add - Assertions - Response Assertion。常用做法有两种。第一种是“响应文本”包含某个标识。比如登录接口成功时返回{code:0}就在断言里选择“响应文本”模式匹配规则选“包含”填写code:0。如果响应是纯 JSON也可以用“JSON 断言”填写表达式$.code并期望值为 0。第二种是检查响应状态码匹配200。但这种方法只适合简单连通性测试不能代表业务成功。加了断言之后还需要加一个“监听器”来看结果。最常用的是“聚合报告”Summary Report。右键线程组 - Add - Listener - Summary Report。聚合报告里能直接看到样本数、平均响应时间、中位数、90% 响应时间、错误率、吞吐量等关键指标。跑完脚本后基本靠这个表就能判断系统表现。4. 接口压测里的硬骨头上传文件、HTTPS 证书、MD5 签名接口测试做到后面一定会遇到几个比较麻烦的协议细节文件上传、HTTPS 证书、以及需要动态加密的参数。这里逐个拆开讲。4.1 文件上传接口的参数怎么填上传文件是很多人的痛点尤其是图像识别、人脸识别、文档处理接口。在 JMeter 中配置上传文件需要在 HTTP 请求采样器里选择 POST 方式然后切到 “Files Upload” 标签页。Files Upload 标签页有几个字段需要注意文件名称File Path本地文件的绝对路径比如D:\test\face.jpg。参数名称Parameter Name对应后端接口规定的 form-data 字段名。如果接口用file作为表单字段名这里就填file。MIME 类型常见的有image/jpeg、image/png、multipart/form-data。MIME 填错了部分后端会解析失败。是否需要“使用 HTTP Client 4 实现”这个选项在 JMeter 5.6.2 中默认用的是 Java 实现。对于部分上传接口Java 实现不如 HttpClient4 稳定。遇到上传失败时可以切换试试。注意JMeter 上传文件时如果有多个文件字段或还要附带其他普通字段比如图片 ID、用户 ID除了 Files Upload 外还可以在请求体的同页面添加参数。实操中我遇到过很多次“接口明明能上传但 JMeter 跑出来一直是 415 Unsupported Media Type”的情况大部分原因是 Content-Type 被 JMeter 自动设置成了 application/x-www-form-urlencoded。解决办法是在请求采样器中不要手动设置 Content-Type让 JMeter 根据 multipart 请求自动生成。4.2 HTTPS 录制与安全证书导入步骤很多人一听到要“录制 HTTPS 脚本”就头大。JMeter 有一种使用方式叫“HTTP(S) Test Script Recorder”它可以像中间人代理一样把浏览器发出的请求全部捕获下来自动生成脚本。做法是在测试计划下添加“HTTP(S) 测试脚本记录器”HTTP(S) Test Script Recorder端口保持默认 8888。然后在浏览器里把局域网代理设置为localhost端口8888。这样浏览器发送的所有请求都会经过 JMeter 的录制器JMeter 自动生成对应的 HTTP 请求采样器。问题的坑在于HTTPS 请求经过代理时会校验证书浏览器会提示“不是安全连接”。解决方法是先让浏览器信任 JMeter 的根证书。JMeter 的证书文件在安装目录bin下名字是ApacheJMeterTemporaryRootCA.crt启动录制器后会自动生成。把这个证书导入到浏览器的“受信任的根证书颁发机构”里之后再录制就不会报警了。录制脚本虽然快但我建议只把录制出来的脚本当草稿用然后手动清理掉多余的静态资源请求比如图片、CSS、JS 等只保留真正需要压测的业务接口。否则压测时这些静态资源请求会严重占用线程资源导致结果失真。4.3 用 JSR223 处理 MD5 加密等业务逻辑现在的接口为了防篡改经常会在请求体中加一个签名参数最常见的就是 MD5 加密。比如要求把用户 ID、时间戳拼接后做 MD5 作为 sign。JMeter 里处理这种逻辑推荐用 JSR223 预处理程序JSR223 PreProcessor语言选择 Groovy。示例场景需要把userId1001timestamp1699999999拼接后取 MD5把结果放进变量sign然后在请求体中使用${sign}引用。在 HTTP 请求采样器下添加 JSR223 预处理程序脚本如下import org.apache.commons.codec.digest.DigestUtils String userId 1001 String timestamp 1699999999 String raw userId timestamp secretKeyxxx String sign DigestUtils.md5Hex(raw) vars.put(sign, sign) vars.put(timestamp, timestamp)这里vars.put是 JMeter 提供的变量存取方法可以在脚本里存值然后在请求体的 Body Data 中写成{ userId: 1001, timestamp: ${timestamp}, sign: ${sign} }为什么推荐 Groovy 而不是老的 Beanshell因为 Beanshell 在并发执行时存在明显的性能瓶颈而且部分 Java 语法兼容性差。Groovy 性能更稳定JMeter 5.6.2 内置支持不需要额外安装插件。如果团队里没有 Groovy 基础可以先理解成是一种“能在请求前跑一段 Java 风格代码”的机制应对 md5 加密这类需求足够了。5. 从测试结果推算系统容量的方法并发数、TPS、响应时间压测脚本跑完只是开始能不能读懂聚合报告才是判断系统容量的关键。很多人在这一步会问“我压了 100 个用户吞吐量 2000那系统到底能支持多少并发”这里就需要看几个核心指标之间的关系。5.1 解读聚合报告中的 TPS、平均响应时间、错误率聚合报告Summary Report里的关键字段是这些Samples样本数总请求次数。Average平均响应时间所有请求的平均耗时单位毫秒。Median中位数50% 请求的响应时间小于该值比平均值更抗极端值影响。90% Line90% 请求的响应时间小于该值是评估用户体验的重要指标。Min / Max最小和最大响应时间。Error %错误率。Throughput吞吐量每秒完成的请求数也就是 TPS。判断系统好坏的通用标准是错误率越低越好一般不超过 0.1%响应时间要看业务要求登录类接口一般要求 90% 响应在 300ms 以内TPS 要达到业务预估峰值。这里要特别提醒一个误区TPS 并不是越高越好。如果 TPS 很高但错误率也高说明系统虽然能接收大量请求但大量请求没有正确返回这种情况反而说明系统已经在超负荷运行。5.2 压测机资源占用对结果的干扰做压力测试时最容易忽略的是压测机本身的资源。JMeter 是 Java 应用默认堆内存只有 1GB。如果并发线程数很高、请求体很大、监听器又多JMeter 自己就可能内存溢出表现就是从某个时间点开始大量请求报错但实际上被压系统根本没到极限。所以正式开始压测前需要调整 JMeter 内存参数。打开bin目录下的jmeter.bat或者新建的setenv.bat设置set HEAP-Xms1g -Xmx4g -XX:MaxMetaspaceSize512m如果是 Linux 环境在bin目录下新建setenv.sh写入export HEAP-Xms1g -Xmx4g -XX:MaxMetaspaceSize512m4GB 只是一个常见值。如果压测机内存比较大比如 16GB可以给 JMeter 分配到 6GB 或 8GB但不要把全部内存都分给它系统本身和 agents 服务也要留余量。另外跑压测时请关闭 GUI 模式只保留非 GUI 的命令行模式。监视压测机资源也很重要。可以用系统自带的任务管理器看 CPU 和内存也可以用 PerfMon 插件监控。如果发现压测机 CPU 已经打满 90% 以上那压测结果就要打问号了因为压力没有完全送达到目标服务端。5.3 如何粗略确认系统并发数“怎么确认系统的并发数”这个问题没有统一答案因为不同系统、不同硬件、不同业务逻辑的极限差很多。这里说一个我用得比较多的方法逐步加压法。第一步先用低并发摸底。比如 10 个线程Ramp-Up 5 秒循环 50 次先跑一轮确定脚本本身没问题、系统能正常返回。第二步翻倍加压。从 10、20、50、100、200、500 这样逐步提升并发数。每次压测后记录下当前并发数下的 TPS 和 90% 响应时间。你会发现一个规律一开始并发数增加TPS 也近乎线性增长响应时间缓慢上升当并发数增长到某个临界点后TPS 不再明显增长甚至下降响应时间开始急剧上升。这个“拐点”就可以认为是系统当前配置下的容量上限。第三步结合业务目标确定并发数。比如你的业务要求是 500 用户同时在线但峰值集中在 10 分钟内。那么可以用 500 个线程、Ramp-Up 60 秒、运行 10 分钟来压。如果 90% 响应时间在可接受范围、错误率低于 0.1%那么当前系统配置基本可以满足 500 并发的需求。如果你只有一个固定目标比如“单用户 1 分钟跑 60 次请求”那直接把线程数设为 1循环次数设为 60然后看响应时间是否符合预期。这种情况下你测的其实是请求链路稳定性而不是系统容量。6. 高频问题排查踩过的坑和解法建议直接收藏整理几个实操中高频出现的问题。这些问题在官方文档里未必写得很清楚但几乎每个用 JMeter 的人都躲不开。6.1 启动时报 Java 环境错误双击jmeter.bat后窗口一闪而过或者提示“JAVA_HOME environment variable is not defined correctly”。这种情况 90% 是环境变量没配好。打开新命令行执行java -version如果提示不是内部或外部命令说明JAVA_HOME或Path配错了。常见问题是安装 JDK 后没有在Path里加%JAVA_HOME%\bin或者加在了用户变量而不是系统变量。还有一种隐藏情况是电脑里装了其他软件自带的旧版 JRE导致 Java 命令实际指向了错误路径。可以执行where java看当前 java 命令的真实路径如果指向了别的目录那需要把%JAVA_HOME%\bin调整到系统Path的前面。6.2 聚合报告弹窗 resultcollector.action_if_file_exists这个报错在使用命令行压测时很常见。现象是执行命令后弹出一个提示框内容大概是resultcollector.action_if_file_exists问是否覆盖已有结果文件。原因是.jtl结果文件已经存在而 JMeter 默认会询问如何处理。解决方式有三种任选一种第一种直接删除旧的.jtl文件再重新执行命令。第二种在命令行加上-f参数强制删除结果文件并重新写入jmeter -n -t test.jmx -l result.jtl -e -o report -f第三种在jmeter.properties配置文件中修改默认行为。找到这一行#resultcollector.action_if_file_existsAPPEND如果是 Windows 下把注释符去掉并将值改为DELETEresultcollector.action_if_file_existsDELETE如果你用的是脚本执行自动化压测建议直接用命令行-f参数避免因为弹窗卡住流程。6.3 内存溢出、证书报错、GUI 卡死内存溢出最常见的表现是日志中抛出java.lang.OutOfMemoryError: Java heap space。解决办法是调大堆内存参考第 5.2 节的方法。另外注意不要在结果树中保留大量样本结果树不要一直开着跑高并发它会把每个请求的完整响应存到内存里很容易把内存撑爆。HTTPS 证书报错比较典型的是SSLHandshakeException或者PKIX path building failed。这说明 JMeter 的 Java 运行环境不信任被测系统的证书。如果你是在压测自己的测试环境被测系统用的是自签名证书可以把证书导入到 Java 的信任库中或者临时用 HTTP 方式访问。如果被测系统是正式域名证书检查 JMeter 运行时的 JDK 版本是否需要更新旧 JDK 可能不识别新 TLS 证书。GUI 卡死的问题常见原因是开了过多的监听器。线程数小的时候看不出来一旦并发上去每个请求都要实时刷新到图表和树形结构GUI 线程直接被拖死。解决办法是调试阶段用 GUI正式压测全部改为命令行执行完成后用聚合报告或 HTML 报告看结果。零零碎碎写了这么多最后说一点我自己的习惯压测最大价值不是证明系统“能扛多少并发”而是提前发现那些在功能测试里永远不会暴露的隐患比如慢 SQL、连接池不够、缓存失效时峰值拖垮服务。所以在压测之后建议把 TPS、响应时间、错误率和服务器端的 CPU、内存、磁盘 IO 放到一起对比来看。哪一个先到瓶颈系统下一步的优化方向基本就清楚了。JMeter 5.6.2 只是那根“压力探针”真正要把容量测准还得靠这些数据结合起来反复调参这个过程急不来。本文还有配套的精品资源点击获取
返回列表