JMeter 从入门到实践:接口压测、脚本编写与性能分析全攻略

发布时间:2026/10/9 8:23:56
JMeter 从入门到实践:接口压测、脚本编写与性能分析全攻略 很多人第一次接触 JMeter 的时候都是因为老板丢过来一句“这个接口压一下看看性能怎么样”然后你就开始在搜索引擎里搜“jmeter 下载安装教程”“性能测试步骤”最后装好了工具却不知道从哪儿下手线程组是什么取样器往哪儿加聚合报告里的数字到底怎么看这篇文章我就把这几年用 JMeter 做接口测试和性能压测的经验完整梳理一遍用一万字左右的篇幅把安装部署、核心组件、脚本编写、性能分析这些内容全部串起来。不管你是刚入行的测试新人还是已经写过几年用例想系统补一下性能测试底子的开发看完这篇应该都能直接把 JMeter 用起来至少不用再被工具本身卡住脖子。说实话JMeter 这个工具最大的特点就是“下限低、上限高”。下限低是指你装上就能用图形界面点一点就能发起一个 HTTP 请求上限高是指它几乎能覆盖接口测试、数据库压测、分布式压测、自定义协议扩展这些重型场景。很多人用了两三年 JMeter其实一直停留在“录制脚本改参数看聚合报告”这个阶段遇到文件上传中文乱码、HTTPS 证书报错、命令行压测失败这类具体问题就卡住了。这篇文章不光是讲怎么用更多是想把那些“文档里不会写、网上又搜不完整”的实操细节讲清楚让你少走弯路。1. JMeter 到底是什么又是靠什么跑起来的先花点篇幅把 JMeter 的定位讲透。Apache JMeter 是一个纯 Java 写的开源压测工具最初是专门为 Web 应用设计的后来因为插件体系完善逐渐扩展到了数据库、FTP、JMS、WebService、TCP 自定义协议等一大堆场景。它最核心的能力就是模拟大量用户并发地访问某个系统然后收集响应时间、吞吐量、错误率这些指标从而判断系统在不用的压力水平下表现如何。1.1 为什么接口测试和性能测试都选它市面上做压测的工具不少LoadRunner、Gatling、Locust 各有各的拥趸但 JMeter 在“功能覆盖上手成本生态丰富度”这三者之间取得了一个很不错的平衡。LoadRunner 商业授权贵、脚本语法老派Gatling 和 Locust 性能好但需要写代码JMeter 则提供了图形界面可以做到“不写代码也能完成 80% 的压测需求”剩下 20% 的复杂场景又能靠 BeanShell、JSR223 脚本补齐。它天然跨平台Windows、macOS、Linux 都能跑这也是很多团队拿它当统一压测工具的原因。另一个关键点是 JMeter 的“线程模型”。它用线程组来模拟并发用户每个线程就是一个虚拟用户线程在运行时会循环执行取样器里的请求。这个模型直观且符合直觉你想模拟 100 个用户同时访问登录接口那就往线程组里填 100 个线程设置好 Ramp-Up 时间让这 100 个线程陆续启动。相比起写代码实现并发、自己管理线程池和结果收集JMeter 把这一整套都封装好了你只需要关注业务参数和有意义的配置。1.2 JMeter 的工作机制简述JMeter 大致的工作流是这样的测试计划Test Plan作为根节点里面挂着线程组线程组里放取样器Sampler取样器负责真正发请求。一个请求发出去之前和之后可能还要经过配置元件Config Element、前置处理器Pre-Processor、定时器Timer、后置处理器Post-Processor、断言Assertion最后结果由监听器Listener收集展示。理解这些东西之间的执行顺序非常重要。很多人一开始搞不清楚为什么自己在“用户自定义变量”里定义的参数在请求里取不到其实就是因为没有搞清楚配置元件的作用域和优先级。JMeter 的配置元件在同级作用域内对所有子节点生效比如线程组下的“用户定义的变量”对整个线程组的所有取样器生效而放在某个取样器下的变量则只对这个取样器生效。这些细节后面我会展开讲先有个整体印象就好。2. 安装这一步就不简单JDK 版本和三种系统的坑先说一个很多人都会踩的坑下载 JMeter 之前先确认你的 JDK 版本。JMeter 5.x 官方要求 Java 8 以上但“以上”不代表无限向上兼容JDK 17 太新的话容易遇到一些奇怪的 GUI 或命令行报错。我自己测下来最稳的组合是 JDK 8 配 JMeter 5.4.1 或者 JDK 11 配 JMeter 5.6.x。如果是老项目留下来的旧脚本那更要留意JMeter 5.6 以下和 JDK 8 的组合兼容性最好新版本对旧版插件支持也更好。另外一个常见误区是只装 JRE 够不够我的建议是最好完整安装 JDK原因有二。第一JMeter 的某些扩展功能比如编译 BeanShell 脚本、运行 JSR223 脚本依赖 JDK 的编译能力纯 JRE 环境有时会报 ClassNotFoundException 之类的异常。第二JDK 自带的 keytool、jstack、jvisualvm 这些工具在你后续做性能分析和排查问题的时候都用得上既然都要装了一步到位装 JDK 更省事。2.1 Windows 安装的正确姿势Windows 上安装 JMeter最省事的方式是去 Apache JMeter 官网下载二进制包选 zip 格式就好。下载下来解压到一个路径里——注意路径中绝对不要有中文或空格我不止一次见过因为解压到“C:\Users\张三\压测工具”这种目录导致启动失败的情况JMeter 对路径中的特殊字符非常敏感。解压完成后进入 bin 目录Windows 用户双击 jmeter.bat 就能启动 GUI。如果双击后一闪而过那基本就是 JDK 没配好环境变量。你需要确认 JAVA_HOME 已经正确指向 JDK 安装目录并且 Path 里包含 %JAVA_HOME%\bin。验证方式是在命令行输入 java -version如果能正常输出版本信息再试启动。注意JMeter 的 GUI 启动后默认会弹出一个安全警告问你要不要使用某些插件。这是 JMeter 在加载自定义插件时的正常提示如果你没装额外的插件直接忽略即可。2.2 安装 jdk 8 和 JMeter 的老版本兼容问题因为热词里专门提到“jmeter 安装 jdk 8”这里必须多说几句。有些人电脑上装的是新版 JDK但项目用的还是 JMeter 4.0 或更老版本这就会遇到 “UnsupportedClassVersionError” 的报错意思就是 JMeter 的 class 文件编译版本比当前 JDK 支持的版本新。解决办法就两条路要么把 JMeter 升级到对应你 JDK 版本的新版要么把 JDK 降级到 8。实际工作中你会发现很多公司内部保存的历史测试脚本是用老版本 JMeter 写的升级 JMeter 之后界面变了没关系但插件不兼容就麻烦所以保留一套 JDK 8 老版本 JMeter 的环境挺有必要的。如果你要在本机多版本 JDK 共存推荐用环境变量切换的方式管理比如 JDK 8 装完后把 JAVA_HOME 指向 JDK 8 的目录。要切换时改一下 JAVA_HOME 就行。千万别把两个 JDK 的 bin 目录都塞进 Path那是给自己埋雷。2.3 macOS 和 Linux 安装方式macOS 用户可以直接到官网下载 tarball 解压也可以使用 Homebrew 安装brew install jmeter。用 Homebrew 的好处是后续升级方便但缺点是版本可能不是最新的不过用于学习和日常测试完全够了。Linux 服务器上压测一般分两种用法。如果只是远程做压测、需要 GUI可以下载 tarball 解压后使用 xvfb 之类的虚拟显示工具跑 GUI也可以直接在本地写好测试计划上传到服务器用命令行模式跑。命令行模式才是 Linux 上 JMeter 的正确打开方式后面第三大章我会详细介绍。热词里有“sudo apt install jmeter”Ubuntu/Debian 系的系统确实可以直接用这一条命令装但注意 apt 源里的 JMeter 版本一般偏旧而且安装路径和官方包略有差异配置文件都在 /etc/jmeter 下。我是更推荐官方 tarball 方式可控性更强。3. 核心组件拆解测试计划、线程组、取样器、监听器拿到一个装好的 JMeter打开 GUI 你会看到左侧的树形结构这就是测试计划的组织形式。默认情况下只有一个“测试计划”节点所有东西都需要往这里面加。我见过不少人刚开始用的时候特别迷茫不知道该在哪个节点上右键添加“线程组”还是“取样器”。这里先说结论在“测试计划”上右键可以添加线程组、配置元件、监听器等一级元素在线程组上右键可以添加取样器、断言、定时器、监听器等二级元素在取样器上右键可以添加前置处理器、后置处理器、断言等三级元素。层级关系决定了作用域不要乱挂。3.1 测试计划与线程组压测模型的设置测试计划是整个测试的根容器里面可以配置一些全局变量、指定第三方 jar 包的 classpath以及设置“独立线程组”之类的运行规则。大部分情况下你不用在测试计划层级做太多配置但要养成一个好习惯把常用的环境地址、账号密码等变量定义在“用户定义的变量”里这样脚本迁移到不同环境时只改这里就够了。线程组是压测模型的核心三个参数决定了一个压测场景的基本形态线程数模拟的并发用户数量。注意不是“请求数”而是“同时在线/同时操作的虚拟用户数”。Ramp-Up 时间多长周期内启动完所有线程。比如线程数 100、Ramp-Up 10 秒就是每秒启动 10 个线程。循环次数每个线程执行脚本的次数。勾选“永远”时脚本会一直跑直到手动停止或达到压测时长。这三个参数配合使用就构成了不同的压测模型。简单说线程数代表压力的大小Ramp-Up 代表压力增长的速度循环次数代表压力持续的时间。想模拟“100 个用户瞬间全部涌进来”就把 Ramp-Up 设成 0想模拟“10 分钟内逐步增加到 200 个用户”就把线程数设为 200、Ramp-Up 设为 600。性能测试里的“阶梯加压”就是靠调整这几个参数来实现的。3.2 取样器真正干活的组件取样器是 JMeter 中真正发送请求的组件HTTP 请求是最常用的一种。HTTP 请求取样器的配置看起来简单真正用起来需要关注的细节却不少协议http 还是 https默认 http。服务器名称或 IP直接填域名或 IP不要带 http://。端口号默认 80HTTPS 是 443自定义端口要显式填写。方法GET、POST、PUT、DELETE 等。Path接口路径。参数区GET 请求的 query 参数和 POST 请求的表单参数都在这边添加。Body Data当 POST 请求是 JSON 格式时在这里直接填请求体同时把“消息体数据”的内容类型在 HTTP 头管理器里设置为 application/json。很多人用 JMeter 测过一次 GET 请求后就以为自己会了直到遇到上传文件才发现事情没那么简单。关于上传文件和中文文件名乱码的问题我在第四大章专门讲这里先埋个伏笔。除了 HTTP 请求JDBC 请求是除了 HTTP 之外最常用的取样器类型数据库压测脚本就是基于 JDBC 请求实现的核心配置方法我也会在第四大章展开。3.3 配置元件和监听器搭好脚本和看结果的左右手配置元件听起来抽象实际就是“提供变量的元件”。咱们前面说的“用户定义的变量”、HTTP 请求默认值、HTTP 信息头管理器、CSV 数据文件配置都属于配置元件。CSV 数据文件配置非常实用当你需要从外部文件读取多组测试数据时用它可以省去手动添加变量的烦恼。配置元件是有作用域的放在线程组下面则整个线程组共享放在某个取样器下面则只对这个取样器生效。监听器则是负责把测试结果收集和展示出来的组件包括查看结果树、聚合报告、汇总报告、简单数据写记录等。“查看结果树”主要用于调试脚本可以看到每个请求的请求体和响应体“聚合报告”是性能测试中最常用的结果分析视图后面第五大章讲性能分析时会重点解读每个字段的含义。监听器在调试阶段一定要有但在大规模压测时建议尽量减少监听器的数量因为监听器本身也会消耗资源影响压测结果的准确性。4. 从录制脚本到实战场景三个高频需求全拆解热词里出现最多的场景分别是录制 HTTPS 脚本、上传文件测试时中文文件名乱码、数据库压测。这几个问题恰好覆盖了 JMeter 使用的几条主线脚本从哪来、请求特殊格式怎么处理、非 HTTP 协议怎么压。下面逐个场景拆解。4.1 用 HTTP 代理服务器录制 HTTPS 脚本很多刚接触 JMeter 的人并不习惯手动去构造 HTTP 请求更习惯把浏览器里的操作录制下来变成 JMeter 脚本。JMeter 自带一个 HTTP 代理服务器可以作为一个中间层拦截浏览器的请求并生成对应的取样器。配置方法如下在测试计划下添加“非测试元件” - “HTTP 代理服务器”。设置端口号默认 8080。在“目标”里选择你希望脚本生成到的线程组。在浏览器里配置代理地址填 127.0.0.1端口填 8080。操作完成后停止代理JMeter 会把你浏览过程中的请求自动生成到目标线程组里。录制 HTTPS 脚本的核心问题是证书。当你用代理方式录制 HTTPS 请求时JMeter 会临时生成一个 CA 证书如果你的客户端不信任这个证书HTTPS 请求就无法正常发送。JMeter 的安装目录 bin 下会生成一个名为 ApacheJMeterTemporaryRootCA 的证书文件你需要把这个证书导入到浏览器的受信任证书列表中。这样录制 HTTPS 脚本的链路就打通了。这里有个特别容易出错的点导入证书时一定要选“受信任的根证书颁发机构”或“信任此证书以标识网站”只导入到“个人”证书里是没用的。而且录制结束后别忘了把浏览器代理设置还原否则你会发现浏览器上不了网。提醒录制生成的脚本通常包含大量静态资源请求图片、CSS、JS这些请求在压测时通常应该被排除掉。可以在代理服务器的“排除模式”里添加正则表达式把 .js、.css、.png、.jpg 结尾的请求过滤掉只保留核心业务接口。4.2 上传文件测试与中文文件名乱码问题接口测试中经常遇到文件上传接口JMeter 的 HTTP 请求里有一个“文件上传”选项卡配置项包括文件名称、参数名称、MIME 类型。文件名称是本地文件的完整路径参数名称是接口约定的字段名通常是 fileMIME 类型就是文件的 Content-Type比如图片是 image/jpeg。上传文件时最常见的问题是中文文件名乱码。具体表现是上传到服务器后文件名里的中文变成了一串问号或者乱码字符。这个问题的根源在于 JMeter 默认使用 ISO-8859-1 编码来解析 multipart/form-data 请求体而中文 UTF-8 编码的字节序列被错误地解码了。解决办法有三个方向在 HTTP 请求里添加“HTTP 信息头管理器”设置 Content-Type 为 multipart/form-data同时在“消息体数据”里手动构造 multipart 请求体这种方式最可控。修改 bin 目录下的 jmeter.properties 文件把 sampleresult.default.encoding 改成 UTF-8同时取消注释重启 JMeter。这个方法能解决结果查看和响应解析阶段的乱码但未必能解决上传文件名乱码问题。在 JMeter 的“用户定义的变量”中定义文件名变量时使用 CSV 数据文件配置读取并确保 CSV 文件的编码为 UTF-8。注意CSV 文件本身如果不是 UTF-8 编码读出来一样是乱的。我曾经在实际项目中遇到过一种更隐蔽的情况上传接口是正常的但压测之后到服务器上查看文件时文件名里的中文全部变成了类似 “%E6%B5%8B%E8%AF%95” 的 URL 编码格式。这是因为 JMeter 把文件名当成了 URL 参数的一部分做了编码处理而服务器端没有做 decode。解决方法是手动构造 multipart 请求体完全绕开 JMeter 的表单自动构造逻辑。4.3 数据库压测脚本与 JDBC 请求配置数据库压测是 JMeter 的一个重要应用场景。很多人以为数据库压测就是用 SQL 工具打几条语句其实真正到了高并发场景必须借助 JMeter 这类工具来模拟大量连接并发执行 SQL才能发现数据库连接池、慢查询、锁竞争等问题。要使用 JMeter 压测数据库你需要准备好三样东西JDBC 驱动包、JDBC Connection Configuration 配置元件、JDBC Request 取样器。JDBC 驱动包是第一步。不同数据库驱动包不同MySQL 用 mysql-connector-javaPostgreSQL 用 postgresqlOracle 用 ojdbc。下载好 jar 包后放到 JMeter 安装目录的 lib/ext 目录下然后重启 JMeter。很多人把 jar 放到了 lib 目录下却发现加载不了原因就在这里lib 目录是 JMeter 自身运行的依赖库第三方扩展 jar 应该放到 lib/ext 下才有效。JDBC Connection Configuration 的配置项里需要关注几个Variable Name给这个数据库连接池起个名字比如 mysql_pool。名字可以任意取但别用默认的 test不然后面 JDBC Request 里关联不上容易混淆。Database URLjdbc:mysql://127.0.0.1:3306/testdb?useUnicodetruecharacterEncodingUTF-8注意加上编码参数防止中文乱码。JDBC Driver Classcom.mysql.cj.jdbc.DriverMySQL 8.x 的驱动类名老驱动用 com.mysql.jdbc.Driver。Username / Password数据库账号密码。连接池参数Max Number of Connections 建议不要设置太大比如 20 或 50这本身就是在模拟真实应用连接池的大小设太大反而起不到压测数据库连接池的效果。JDBC Request 取样器里Query Type 可以选择 Select Statement、Update Statement、Callable Statement 等。压测读场景就用 Select写场景用 Update。如果你需要压测存储过程用 Callable Statement然后在 SQL 查询框里写 {call 存储过程名(?)}。SQL 查询语句里支持使用 ?配合 Parameter values 和 Parameter types 两个输入框使用相当于 PreparedStatement 的传参机制。5. BeanShell 断言与 JSR223 脚本的进阶应用热词里单独把“jmeter beanshell断言”列出来说明很多人在常规断言满足不了需求后开始尝试用脚本来做更灵活的判断。BeanShell 是 JMeter 内置的一种脚本语言语法上接近 Java可以直接访问 JMeter 提供的上下文变量。常用的内置变量包括varsJMeterVariables可以通过 vars.get(变量名) 获取 JMeter 变量通过 vars.put(变量名, 值) 设置变量。prevSampleResult前一个取样器的结果对象可以拿到响应码、响应信息、响应体等。log日志对象通过 log.info(日志内容) 输出到 JMeter 日志。一个典型的 BeanShell 断言场景是接口返回的 JSON 里有一个字段值需要动态校验而 JMeter 自带的“JSON 断言”插件又没安装这时你可以用 BeanShell 断言来解析响应内容。比如使用 prev.getResponseDataAsString() 拿到响应体字符串再用正则或字符串查找判断是否包含某个预期的值。BeanShell 断言里还有一个很实用但很多人不知道的写法配合 vars 跨线程组传递数据。比如第一个线程组登录后拿到了 token第二个线程组的所有请求都需要带上这个 token。你可以在第一个线程组里用“后置处理器” - “BeanShell 后置处理器”先把 token 提取出来再用 vars.put() 把 token 存成一个全局一样的变量。注意跨线程组时普通 vars.put() 不生效你需要改用 JMeter 的 props 对象或者使用“属性”来传递。这一步是很多 JMeter 新手做登录态保持时卡住最多的地方。这里也提醒一下BeanShell 的性能并不好。因为 BeanShell 每次执行都要动态解释脚本在高并发压测时如果断言逻辑里用了大量 BeanShell 脚本会导致 JMeter 本身的 CPU 占用率显著上升进而影响压测数据的准确性。官方推荐的做法是使用 JSR223 取样器或 JSR223 断言配合 Groovy 语言Groovy 脚本会被编译执行性能比 BeanShell 高一个数量级。如果你现在还没有特别依赖 BeanShell 的旧脚本建议直接学用 JSR223 Groovy。6. 常见报错与排查这里是一份问题速查表前阵子有个同事跟我抱怨说 JMeter 跑压测的时候弹了个错“jmeter:could not delete existing file c:\windows\system32”。这个报错看起来非常吓人像是 JMeter 要删除系统文件其实完全不是这么回事。这个错误的本质是 JMeter 在 Windows 系统下尝试操作某个临时文件或缓存文件时没有足够的权限去删除或者覆盖旧文件。JMeter 的工作目录或者临时文件目录被占用、杀毒软件锁定了文件、或者 JMeter 本身没以管理员权限运行时都可能触发这类异样。这个报错的排查思路其实很简单先用管理员身份重新运行 jmeter.bat如果是 64 位系统但安装的是 32 位 JDK也建议换成 64 位 JDK。再有就是检查环境变量 TEMP 指向的路径是否存在且当前用户有写权限。杀毒软件方面把 JMeter 安装目录和工作目录加入白名单基本都能解决。归根到底这是 Windows 文件权限的问题不是 JMeter 逻辑的问题。下面我把实际项目里遇到频率最高的几个报错和解决方式整理成一张速查表建议收藏。报错现象根本原因解决方式Could not delete existing file 或文件访问失败无权删除/覆盖临时文件或缓存文件以管理员身份运行 JMeter为 JMeter 目录和临时目录添加例外/白名单UnsupportedClassVersionErrorJMeter 编译版本和 JDK 版本不匹配降级 JDK 到 8或升级 JMeter 到匹配版本证书相关报错 / SSLHandshakeException未导入 JMeter CA 证书或证书过期重新生成并导入 ApacheJMeterTemporaryRootCA到受信任根证书位置JVM memory exhausted / OutOfMemoryError压测线程数过大、监听器过多、堆内存不足修改 bin/jmeter 配置文件中的 JVM 堆大小参数减少监听器增加 -XmxResponse code: Non HTTP response code: java.net.ConnectException目标端口没开、IP 或端口错误先 telnet 试一下端口连通性中文乱码响应体或文件名编码设置不一致修改 sampleresult.default.encoding 为 UTF-8CSV 文件另存为 UTF-8HTTP 请求头设置 Content-Type charsetUTF-8CSV 文件读取路径错误相对路径解析失败使用绝对路径或在 JMeter 的 bin 目录下寻找相对路径除了上面这些硬核报错还有两个实操层面的问题需要专门提醒一下。第一个是不要在 GUI 模式下做正式的压测。GUI 模式本身会消耗大量内存和 CPU而且界面绘制、结果树刷新都会拖慢测试速度。正式压测时应该回到命令行用 jmeter -n -t 脚本.jmx -l 结果.jtl 这种无界面模式跑。第二个是压测结束后保存的 .jtl 结果文件默认不包含响应信息如果你需要分析失败的请求原因需要在 jmeter.properties 里开启对响应数据相关字段的保存。7. 性能分析的硬核视角聚合报告到底透露了哪些秘密热词里最后一个核心词是“性能分析”这也是整个 JMeter 使用中最难、最容易被忽略的一环。很多人在压测结束后看着聚合报告里几十个字段一脸茫然只抓了一个“Average”就开始写结论。但 Average 恰恰是最容易被平均值掩盖问题的指标。比如 100 个请求99 个都跑了 100 毫秒只有一个跑了 10 秒平均响应时间就是 199 毫秒看起来“挺快”但真实体验却是每 100 个人里就有 1 个人卡了 10 秒。7.1 聚合报告关键指标解读聚合报告里的字段虽然多但核心的其实就几个。Label 表示取样器名称#Samples 表示请求总数Average 是平均响应时间Median 是中位数响应时间表示有一半请求低于这个值90% Line / 95% Line / 99% Line 表示有 90%、95%、99% 的请求响应时间低于这个值这几个百分位指标比平均值更能反映体验极差的情况Min 和 Max 是最小和最大响应时间Error % 是错误率Throughput 是吞吐量单位为“每秒请求数”或“每分钟请求数”取决于配置。一个健康的压测结果至少应该满足三个条件错误率为 0 或极低99% Line 不超过业务要求的目标响应时间吞吐量达到了预期的业务峰值。如果 99% 线远高于平均值说明存在明显的长尾延迟需要进一步排查是不是有慢查询、GC 停顿或者线程池排队而不是急着看平均值下结论。多少吞吐量才算合格这个问题没有标准答案完全取决于业务场景。比如一个登录接口的目标可能是 200 QPS 且 99% 响应时间不超过 500 毫秒一个内部报表接口只需要 5 QPS 但 99% 响应时间要小于 3 秒。性能测试的关键在于先定指标再跑压测最后对着指标评估是否通过。没有目标的压测就像没有终点的跑步跑完也不知道算好还是不好。7.2 用命令行生成可视化 HTML 报告JMeter 从 3.0 开始支持直接生成 HTML 格式的可视化报告这个功能非常实用。命令行压测结束后可以通过以下命令生成报告jmeter -n -t test_plan.jmx -l result.jtl -e -o report_dir参数的含义是-e 表示生成报告-o 指定报告输出目录。提醒一点report_dir 目录必须不存在JMeter 不会自动覆盖或清空已有目录如果目录已存在会直接报错。生成出来的 HTML 报告包含 APDEX 指数、响应时间分布图、吞吐量趋势图、错误率变化等丰富内容比手动打开聚合报告截图要专业得多。如果 .jtl 结果文件是之前压测保存的也可以单独用 -e 和 -o 参数重新生成报告不需要重跑压测。实测下来这个功能对于需要向团队汇报压测结果的场景特别有用省去了手动整理图表的麻烦。7.3 分布式压测一台机器不够时的必备技能当单台压测机性能成为瓶颈时JMeter 支持分布式压测模式。原理很简单一台主控机Master负责调度和汇总数据多台执行机Agent运行 jmeter-server 模式实际去执行脚本。配置分布式压测有三个关键点先在执行机上启动 jmeter-server.bat 或 jmeter-server.sh它会监听一个端口等待主控机下发任务。然后修改主控机 bin 目录下 jmeter.properties 文件里的 remote_hosts 配置把执行机的 IP 和端口填进去。最后在主控机的命令行加 -r 参数即可远程执行。执行机和主控机的 JDK 版本、JMeter 版本最好保持一致否则容易出现脚本执行失败或数据传输异常。这里有个实操细节执行机上不需要保留压测用的 CSV 数据文件但如果脚本里确实用了 CSV 数据文件配置文件路径在两台机器上必须都能访问到。最简单的方案是把 CSV 文件复制到执行机的相同路径下或者使用共享存储目录。很多人在分布式压测时报“Cannot find file: xxx.csv”错误基本都是这个原因。8. 脚本设计中的几个优良习惯踩过的坑多了以后我慢慢总结出了一些 JMeter 脚本设计上的好习惯。先要建立“脚本即资产”的意识测试脚本和代码一样需要维护、需要版本管理。千万不要在 GUI 里手动点出一份很复杂的测试计划之后就只保存一个 .jmx 文件连注释都不写。JMeter 的测试计划支持添加“测试计划注释”和“线程组注释”虽然这不会影响执行但对后续接手脚本的人来说是莫大的帮助。我见过很多老测试脚本三个月后连写脚本的人自己都忘了线程组里的那个“120”是线程数还是循环次数。加上注释可以减少很多沟通成本。合理使用变量不要硬编码。测试环境地址、端口、账号密码、超时时间这些东西全部用“用户定义的变量”定义。这样做的好处是换环境时只需要修改一处不用满脚本找。我在实际项目里还见过一个更进阶的用法把 awk 或者 shell 脚本跑在外的变量通过 JMeter 的“属性”传入脚本内部实现“同一份脚本参数化不同压力模型”。关于 CSV 数据文件的使用也多说一句。建议把测试数据和测试脚本分离数据文件单独维护。文件路径尽量使用绝对路径因为相对路径在不同操作系统下的表现不一致很容易导致脚本在 Linux 服务器上跑不了。当然如果你的脚本只在自己机器上跑相对路径可以省事但一旦需要共享给团队或迁移到服务器绝对路径更稳妥。9. 命令行模式真正适合压测的执行方式前面反复提到命令行模式这里完整地把它的正确用法讲一遍。JMeter 提供了一整套命令行参数我常用的组合如下jmeter -n -t test_plan.jmx -l result.jtl -j logs/test.log-n 表示非 GUI 模式-t 指定测试计划文件-l 指定结果输出文件-j 指定日志文件。如果需要在压测过程中动态修改线程数和持续时间可以加上 -J 参数来覆盖脚本里的属性值比如jmeter -n -t test_plan.jmx -Jthreads200 -Jduration600 -l result.jtl对应在测试计划的 jmx 文件里线程组的线程数应该是 ${__P(threads,100)} 这种引用属性的形式。这样你就不需要为不同压力档位准备多份脚本一份脚本通过传参就能实现线程数和持续时间的灵活调整。这个用法在持续集成和自动化压测平台里特别有用可以让压测流水线实现参数化驱动。命令行模式下结果文件 .jtl 格式默认只保存少量字段通常包括时间戳、响应时间、标签、响应码等。如果你需要更详细的数据需要编辑 bin/jmeter.properties 中与结果保存相关的配置项把需要保存的字段取消注释。但要注意保存字段越多对磁盘 IO 的压力越大对压测机性能的影响也越大一般只在结果分析阶段开启正式压测保持默认即可。10. 压测过程中的数据分析与调优思路最后聊一聊拿到压测结果后怎么做调优。很多人以为压测完拿到报告就结束了其实真正有价值的工作在于分析和调优的闭环。如果一个接口压测时吞吐量远低于预期或者响应时间在持续升高我的排查顺序通常是第一确认压力是否真的已经打到了目标服务上。通过服务端的监控面板查看请求量和并发连接数如果服务端请求量远低于 JMeter 报告里的吞吐量说明压力还没发送到服务端瓶颈在 JMeter 自身或者网络环境。此时降低线程数、减少监听器、改用分布式压测是常见的调整方向。第二看服务端的资源消耗。CPU 使用率、内存占用、磁盘 IO、网络带宽分别排查一遍。CPU 满了就先看是用户态还是内核态用户态高多半是业务代码问题内核态高可能是上下文切换太频繁或网络栈问题。内存持续增长可能是 GC 配置不合理或者有内存泄漏。磁盘 IO 高通常和日志写入有关检查日志级别和落盘策略。网络带宽打满后就算把线程数翻倍吞吐量也不会再提升反而可能因为超时重试导致错误率升高。第三关注数据库和中间件。数据库的慢查询日志、连接池使用率、锁等待时间都需要重点排查。JMeter 的 JDBC 请求压测就非常适合在这种场景下使用你可以专门对一条慢 SQL 做压力测试观察它在高并发下的响应时间变化从而判断是 SQL 本身需要优化还是数据库连接池配置不足。调优的思路从来不是“调一个参数就能搞定”而是一个不断假设、验证、修改、再验证的过程。JMeter 的价值在于它帮你快速生成压力、精确量化瓶颈它本身并不能帮你修代码、调 SQL、扩容机器但它能让你知道问题出在哪一层这已经解决了性能测试中最难的一半问题。我个人的体会是JMeter 用久了之后你会发现工具本身的技术点一个月就能全部学会剩下大量的时间都在跟“业务场景”和“系统架构”打交道。同一个接口在 Tomcat 单机部署和微服务网关加限流的架构下压测方案和调优点可能完全不一样。所以学 JMeter 不要停留在记步骤、背参数多想想每个配置背后的目的多动手排查几个真实问题功力自然就长上去了。希望这篇万字内容能帮你把 JMeter 的真正用法完整走一遍后续再用它时不用再靠搜索引擎救急。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询