
简介这是一份Apache JMeter 2.11版本的zip压缩包适合性能测试工程师、后端开发与运维人员用来搭建轻量级负载测试环境评估Web应用在高并发下的响应时间与稳定性。JMeter本身完全开源、跨平台支持HTTP、FTP、SMTP、JDBC等多种协议可通过GUI或命令行运行也支持多机分布式施压在2.11版本中已具备较为成熟稳定的测试能力。压缩包整体约30.49MB内部目录主要包括bin启动与配置文件、lib依赖库、docs参考文档、extras附加组件、licenses许可说明、src源码以及test测试用例既可直接解压使用也便于开发者研究内部实现或进行二次扩展。目前已有152人学习下载适合需要了解早期JMeter目录结构、复制典型测试计划思路或离线搭建压测工具的读者。1. 为什么还要用 jmeter-2.11.zip老版本压测工具在轻量场景下的现实意义手头要临时压一个老项目的登录接口公司机器只装了 JDK 8折腾新版 JMeter 4/5 反而被各种依赖和证书问题卡住。jmeter-2.11.zip 就是为这种场景准备的它是个免安装的绿色压缩包解压就能用内存占用小核心功能齐全拿来做接口测试、小并发压测和性能验证完全够。新版能做的事它大部分能做只是界面和报告没有新版本漂亮。这篇文章按从零安装、脚本搭建、命令行压测、常见翻车现场、自己分析结果这个顺序来写适合刚入门的测试和开发也适合需要在老环境里快速落地一套压测工具的人。2. 安装与启动JDK 版本匹配是关键zip 包怎么落到本地2.1 先确认 JDK 版本2.11 只吃 JDK 7/8别拿新版硬怼JMeter 2.11 是一个 Java 应用它的默认运行级别是 Java 7 和 Java 8。启动脚本会在 JAVA_HOME 下找 java 可执行文件如果系统里装的是 JDK 11 或更高版本启动时就会报出 Unsupported major.minor version 52.0 这样的 class 版本错误原因不是 JMeter 坏了而是编译版本和运行版本不匹配。所以第一步不是解压而是先确认机器里的 Java 环境。java -version echo $JAVA_HOME如果 java -version 显示的是 1.8.0_xxx说明没问题如果显示 11.0.x 或 17.0.x就要准备一个 JDK 8。常见做法是下载 JDK 8 的安装包安装后手动设置 JAVA_HOME 指向 JDK 8 的目录。Windows 环境变量界面里设置JAVA_HOMEC:\Program Files\Java\jdk1.8.0_202 PATH%JAVA_HOME%\bin;%PATH%设置完成后重新打开终端再执行 java -version 确认。这里有一个容易踩的细节如果原本 PATH 里已经有多个 JDK即使你改了 JAVA_HOME终端可能仍在使用靠前的旧路径。所以查看 which java 或 where java 的输出确认实际可执行文件的位置。JMeter 2.11 的 bin 目录下 jmeter.bat 会优先读 JAVA_HOME其次是 PATH所以改完要彻底关掉旧终端再开新的。提示如果同一台机器上有多个 JDK不要动系统全局 PATH建议单独写一个 JMeter 启动脚本在脚本里临时 export JAVA_HOME。2.2 解压与目录结构bin、lib、extras 里有什么拿到 jmeter-2.11.zip 后我习惯先看目录结构再决定放哪。这个包解压后是一个几十 MB 的目录里面最核心的三个子目录是 bin、lib 和 extras。bin 是启动入口lib 是所有依赖库extras 里是一些辅助模板和示例脚本。bin 下面有 jmeter.batWindows 启动脚本、jmeter.shLinux/macOS 启动脚本还有 jmeter 本身的可执行脚本和一些工具脚本。lib 里存放的是 JMeter 运行所需的 jar 包如果你要驱动数据库需要额外把 MySQL 或 PostgreSQL 的 jar 包也丢进这个目录这个会在第 5 章讲。目录作用需要关注的文件bin启动脚本与命令行入口jmeter.bat / jmeter.shlib核心依赖库数据库驱动、扩展插件extras辅助模板与远程脚本remote.bsh 等解压路径有一个长期被忽略的坑不要放在带空格的路径里比如 Program Files 和中文目录。JMeter 2.11 的脚本没有对路径做转义处理路径空格可能导致找不到文件。常见做法是放在一个纯英文、无空格的路径下比如 C:\tools\jmeter-2.11 或 /opt/jmeter-2.11。我通常还会把 bin 目录加到 PATH 里这样后面命令行压测时不需要每次写完整路径。2.3 首次启动jmeter.bat 和 jmeter.sh 的参数不要乱加Windows 上双击 jmeter.bat 即可启动 GUILinux 上先给脚本加执行权限再运行cd /opt/jmeter-2.11/bin chmod x jmeter.sh ./jmeter.sh启动成功后会看到一个 Swing 风格的图形界面左侧是测试计划树右侧是组件编辑区。在 2.11 里GUI 模式主要用于编辑脚本和调试单个请求不建议拿它跑正式压测。启动脚本支持几个有用的参数最常用的是 -n 表示 non-GUI 模式-t 指定测试脚本-l 指定结果文件-h 帮助-v 打印版本。第一次使用可以在终端跑一下 ./jmeter.sh -v确认版本输出是 2.11避免后续脚本加载错误。参数作用示例-n非 GUI 模式运行./jmeter.sh -n-t指定测试计划-t login.jmx-l指定结果文件-l result.jtl-v打印 JMeter 版本./jmeter.sh -v-J设置 JMeter 属性-Jthreads50这里有一个很多人翻车的地方在 GUI 模式下点击“启动”后界面会卡住鼠标一直在转但那不一定是 JMeter 卡死。如果线程组里配置了较大的线程数GUI 模式启动时要把所有线程都加载起来图形控件重绘会拖慢整个响应。所以调试时用小的线程数比如 1正式压测切到命令行。2.4 验证安装跑一个最小的 HTTP 请求启动 GUI 后右键“测试计划”添加“线程组”在线程组里添加“HTTP 请求”配置里填一个可用的地址。为了验证 JMeter 本身的工作流程我一般先访问 http://example.com/ 或内网一个简单接口不用 HTTPS避免证书干扰。然后右键线程组添加“察看结果树”监听器点击绿色播放按钮运行观察响应数据。这里可以把测试计划保存下来后端其实是一个 XML 文件。JMeter 2.11 的 jmx 文件是 XML 结构核心节点是 TestPlan、ThreadGroup、HTTPSamplerProxy 和 ResultCollector。看一个最小示例?xml version1.0 encodingUTF-8? jmeterTestPlan version1.2 properties5.0 jmeter2.11 hashTree TestPlan guiclassTestPlanGui testname验证计划 enabledtrue /TestPlan hashTree ThreadGroup guiclassThreadGroupGui testname线程组 enabledtrue stringProp nameThreadGroup.num_threads1/stringProp stringProp nameThreadGroup.ramp_time1/stringProp stringProp nameThreadGroup.loop_count1/stringProp /ThreadGroup hashTree HTTPSamplerProxy guiclassHttpTestSampleGui testnameHTTP请求 enabledtrue stringProp nameHTTPSampler.domainexample.com/stringProp stringProp nameHTTPSampler.path//stringProp stringProp nameHTTPSampler.methodGET/stringProp /HTTPSamplerProxy hashTree ResultCollector guiclassViewResultsFullVisualizer testname察看结果树 enabledtrue/ /hashTree /hashTree /hashTree /hashTree /jmeterTestPlan这段 XML 对应 GUI 里的一个测试计划属性说明ThreadGroup.num_threads 是线程数ramp_time 是启动线程所用秒数loop_count 是每个线程的循环次数HTTPSampler.domain 是域名path 是路径method 是 GET。对新手来说不需要手写这个文件GUI 保存自然会生成。但我建议至少知道 num_threads 和 ramp_time 存在因为后面命令行压测时你会反复调这两个值。如果能成功跑出结果树里的绿色响应说明 jmeter-2.11.zip 的解压目录、JDK 环境和启动脚本都没有问题下一步就可以开始写这次压测真正要用的脚本了。3. 用 GUI 搭一个真实接口测试线程组、采样器和监听器的三角关系3.1 线程组参数线程数、Ramp-Up、循环次数到底怎么配线程组是被测请求的“用户工厂”。一个线程代表一个虚拟用户线程数就是最大并发数Ramp-Up 时间控制从 0 到最大并发需要多长时间循环次数控制每个线程执行多少轮。三者共同决定最终请求量。很多人在做接口测试时把线程数直接当成 QPS这是不对的。QPS 是请求完成率等于总请求数除以总时间。所以配置不当可能出现线程数很高但实际 QPS 上不去的情况。我一般这样配先确认接口的预期峰值并发线程数设为它的 110%Ramp-Up 设为 5 到 10 秒循环次数选中“永远”再用“调度器配置”里的持续时间控制压测时长。2.11 的线程组里在“Scheduler Configuration”勾选“Specify Thread lifetime”并填持续时间就能让压力按时间推进而不是依赖循环次数。固定线程数加固定循环次数没法精确控制压力时长尤其是有慢请求的场景。下面是一个线程组常用的配置参考参数含义常用建议线程数最大并发用户数按预期并发 110% 设置Ramp-Up 周期达到最大并发的时间5-10 秒别设 0循环次数每个线程执行次数调试用 1压测用永远持续时间压测运行时长正式压测建议 3-5 分钟Ramp-Up 设成 0 时JMeter 会在启动瞬间创建所有线程。很多新手以为这样能快速得到高并发但实际上线程同时起步会让负载机和被测应用都出现尖峰结果反而不代表真实情况。一般建议 ramp-up 时间至少覆盖线程数除以 5 的秒数让压力缓慢爬升。3.2 HTTP 采样器请求头、超时和参数面板在线程组下添加 HTTP 请求后右侧需要填域名、端口、路径、请求方法和内容编码。如果是 POST 接口切换到“Parameters”或“Body Data”选项卡。这里推荐在“HTTP Header Manager”里显式设置 Content-Type特别是 POST JSON 接口否则服务端可能返回 415 或解析不出来。Content-Type: application/json Accept: application/json在 JMeter 里接口测试的最小配置是方法、路径、请求头、超时。超时非常容易漏填因为 JMeter 默认没有统一的超时时间。如果被测接口突然变慢线程会一直等待结果文件里出现大量长时间停滞的样本。在“HTTP 请求”的高级选项卡里把“连接超时”和“响应超时”都填成 3000-5000 毫秒。如果是压测建议设置 1000-3000 毫秒超过这个时间就认为失败不然积压线程会把资源耗光。3.3 监听器的角色查看结果树用来调试聚合报告用来估算吞吐第一次跑脚本时一个监听器是必要的察看结果树。它能直接展示每个请求的请求体、响应体、状态码和耗时。等到调通接口后结果树就可以删掉或禁用因为它会把每个响应都存到内存里压测时会产生极大的内存开销。2.11 里有一个“聚合报告”能直接显示平均响应时间、中间值、90% 响应时间、吞吐量等指标但它仍然是 GUI 监听器跑非 GUI 模式时不会自动输出这些指标你需要用命令行结果文件再做聚合这个在第 4 章会讲。一个小技巧在结果树里看到 200 不一定代表业务成功。很多接口会在响应体里返回 code 字段比如 code0 才代表成功。这时可以加一个“响应断言”匹配返回的 JSON 片段断言失败的请求会在结果树里以红色显示。这也是后面判断压测失败率的关键。断言本身不增加多少开销但别把响应体完整的 JSON 都放进去只匹配关键字段比如success:true。3.4 保存 jmx中文路径、空格路径和版本兼容脚本调通后保存为 test.jmx。JMeter 的 jmx 文件本质上是一个 XML 文件保存时默认带测试计划名字。这里有三个经验第一测试计划名称和文件路径不要用中文因为 JMeter 2.11 解析中文路径在部分 Linux 环境下会出问题第二脚本里如果有引用的外部 CSV 文件保存 jmx 时它写的是相对路径所以最好把 jmx 和数据文件放在同一目录第三jmx 文件要用标准文本编辑器打开过一遍确认没有因为界面操作产生的重复节点。如果之后你要在命令行跑保存路径直接决定你执行命令的长度。我会统一把脚本放在 jmeter-2.11/bin 下一个 testplan 子目录里避免路径过长。最终命令结构固定为./jmeter.sh -n -t /opt/jmeter-2.11/bin/testplan/login.jmx -l /opt/jmeter-2.11/bin/testplan/result.jtl解释一下-n 是非 GUI 模式-t 指定脚本-l 指定结果文件路径。如果路径里有空格整个路径要加引号所以干脆不要有空格。这段时间里jmx 文件本身也要进版本管理方便你回滚参数改动。每次调整并发配置时先用 git diff 看一下改动避免误改到监听器配置。4. 命令行压测从“能跑”到“有结果”non-GUI 模式的参数拆解4.1 为什么压测必须用 -nGUI 会吃掉你的负载机资源很多人第一次跑压测都习惯在 GUI 里点绿色按钮然后发现吞吐量不高并发一上来 GUI 就卡死。原因很简单GUI 模式不仅要管理所有线程还要把每个样本画到结果树和图表里这些事非常耗 CPU 和内存。JMeter 压测的最佳实践是在命令行使用 non-GUI 模式让 JMeter 只做采集不做展示负载机才能把资源留给压力本身。执行命令cd /opt/jmeter-2.11/bin ./jmeter.sh -n -t testplan/login.jmx -l testplan/result.jtl参数含义-n 表示 non-GUI 模式-t 后跟脚本文件-l 后跟结果文件。结果文件是 jtl 格式本质上是 CSV可以用文本编辑器打开。运行过程中屏幕会滚动显示进度结束后在终端末尾可以看到 Generate Summary Results里面有样本数、平均值、吞吐量。如果你要找 TP90这个 summary 不提供需要自己处理结果文件这个是最后一章的内容。还有一点-l 指定的结果文件如果已经存在JMeter 会提示已有文件不会覆盖。你换一个新文件名或者先删掉旧文件。所以我在压测前会做一遍目录检查确认结果文件不存在避免跑到一半才发现写不进去白白浪费了一次压测。4.2 脚本参数化用 JMeter 属性把一个脚本跑出多组压力压测时经常要改变线程数和循环次数但不想每次打开 GUI 改脚本。常见做法是用 JMeter 内置属性函数 ${__P(threads,10)}把线程数、循环次数、持续时间变成外部可传入的变量。修改脚本里的线程组配置将 num_threads 改为stringProp nameThreadGroup.num_threads${__P(threads,10)}/stringProp stringProp nameThreadGroup.ramp_time${__P(ramp,5)}/stringProp stringProp nameThreadGroup.loop_count${__P(loops,100)}/stringProp命令行传入./jmeter.sh -n -t testplan/login.jmx -l testplan/result.jtl -Jthreads50 -Jramp10 -Jloops200-J 参数会在启动时设置 JMeter 属性脚本里的 ${__P(threads,10)} 优先读取外部参数如果没传就使用默认值 10。这样同一份 jmx 可以跑 10 并发、50 并发、200 并发不用分别建三份脚本。在做这种参数化时我要提醒你注意数字后面的默认值如果脚本里写的是 ${__P(threads,)}默认值没有JMeter 会把它当成字符串线程数读取失败。所以默认值一定要写。另外如果你的脚本里有 CSV 数据文件路径也要用同样的属性函数处理并且命令行用 -Jcsvfile/path/to/data.csv 指定。路径中如果含空格在命令里要加引号。4.3 动态调整 QPSBeanShell 和 BshClient 的组合用法很多业务场景不是恒定压力而是期望压测过程中修改吞吐量。在 2.11 里没有像新版本那种随时可调的图形界面但可以通过 BeanShell Server 实现。原理是在 jmeter.properties 中开启 BeanShell 服务然后在脚本中用一个 BeanShell 定时器每间隔一段时间读取属性 qps 的值计算等待时间运行中通过 BshClient 或 telnet 连接服务端口修改 qps 属性JMeter 脚本会在下一个循环读取到新值从而动态改变压力。先确认 jmeter.properties 中这几行没有注释beanshell.server.port9000 beanshell.server.file../extras/remote.bsh然后在测试计划中添加一个“BeanShell Timer”脚本如下// 读取外部属性 qps默认 20 int qps Integer.parseInt(props.getProperty(qps, 20)); // 计算每次吞吐间隔单位毫秒 long interval (long)(1000.0 / qps); // 设置当前采样器的延迟 vars.put(interval, String.valueOf(interval)); return interval;运行中要调整 QPS 时用客户端连接 BeanShell 端口telnet localhost 9000 props.put(qps,50);或者使用 JMeter 自带 BshClient类名可能因包版本变化所以更保险的方式是 telnet 或 nc 发送命令。这里要说明BeanShell Timer 返回的是等待毫秒数每个线程在执行下一次请求前都会等这个时间。它控制的是单个线程的间隔多个线程叠加后总体吞吐并不严格等于设置的 QPS但足以做动态调整实验。如果要精确控制整体 QPSJMeter 的 Constant Throughput Timer 更合适但它也是近似值。对于严格的常量压测建议用持续时间和线程数组合把 QPS 调整当作辅助手段。4.4 报告生成2.11 没有 HTML Dashboard结果文件怎么转成报告如果你搜“jmeter 5.6.3 生成测试报告”新版确实提供了 -e -o 参数生成漂亮的 HTML 报告。但 jmeter-2.11.zip 太老没有这个能力这也是老版本最明显的短板。如果一定需要 HTML 报告有两条路一是把 jtl 转成 CSV 后用 Python 脚本生成图表二是升级到新版 JMeter但那就不是这个包了。在 2.11 里我建议先保留原始 jtl 文件它是压测的第一手数据。命令行跑完后可以用 GUI 里的“聚合报告”加载 jtl 快速看统计但 GUI 加载大文件会非常慢。更完整的统计需要自己处理 JTL。最后一章我会写一个实际可用的 Python 脚本算平均、TP90、TP99。如果你只想快速看一眼也可以在 GUI 中新建一个“聚合报告”点击“浏览”选择刚刚生成的 result.jtl它会加载整个文件并显示统计表但这只适合文件不大的情况生产上建议用脚本处理。5. 避坑指南jmeter-2.11.zip 最常踩的六个翻车现场5.1 启动报错 Unsupported major.minor version 52.0Java 版本太新现象双击 jmeter.bat 或执行 ./jmeter.sh 后终端弹出这个 errorJMeter 窗口没出来。 原因JMeter 2.11 用 JDK 7/8 编译当前默认 Java 版本太高class 文件版本不兼容。 解决安装 JDK 8设置 JAVA_HOME 指向它并确认 which java 出来的路径是 JDK 8。如果机器上必须保留新 JDK不要改全局 PATH而是单独写一个启动脚本export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH cd /opt/jmeter-2.11/bin ./jmeter.sh注意这样只在当前终端窗口生效不影响系统其他应用。如果脚本还是报错要检查 jmeter.sh 里的 JVM 参数是不是硬编码了高版本路径。5.2 HTTPS 录制和访问失败先处理证书再做脚本现象录制 HTTPS 脚本时JMeter 代理能代理到请求但响应报握手失败或者是访问 HTTPS 接口时出现 ssl_error_no_certificate。 原因HTTPS 要校验证书JMeter 有自己的 CA 证书浏览器需要信任这个 CA否则代理拦截时无法建立 TLS。如果用 Java 客户端还会遇到根证书缺失。 解决在 JMeter 的 bin 目录下找 ApacheJMeterTemporaryRootCA.crt 证书安装到浏览器的信任列表。在 mac/Windows 上选择安装到“受信任的根证书颁发机构”安装完重启浏览器再录制脚本。另外HTTP 请求里可以设置“Use HTTP Client”为 Java但在老版本里 Java 客户端对 HTTPS 支持不够好遇到握手问题还是优先检查证书。5.3 线程数设很高但吞吐没涨Ramp-Up 和并发误区现象线程组里写了 500 个线程结果吞吐量只有几十甚至比 100 线程还低。 原因一是线程一下子全部起来系统开销高二是请求之间有思考时间或等待时间三是大部分线程在等待超时真正在传输的很少。 解决把 Ramp-Up 从 0 改为 20-30 秒同时把超时时间调短观察聚合报告里的 Active Threads。如果实际并发达不到线程数先检查脚本里是否有 Constant Throughput Timer 或人为 sleep它们会限制吞吐。在 JMeter 2.11 中可以通过结果树里的线程名称观察活跃线程数但更可靠的是看后端服务器的连接数。记住一点线程数只是你发出的请求数量上限真正压到服务端的才是有效并发。5.4 动态验证码正则提取和后置处理器怎么配合现象登录接口有验证码脚本每次执行都返回验证码错误压测无法继续。 原因验证码本身是动态返回的或者由前端生成你需要把它从上一个接口的响应中提取出来并写入后续请求。 解决先看验证码接口的响应格式如果是 JSON添加“正则表达式提取器”提取 data.captchaId再在线程组里加一个 BeanShell 后置处理器把验证码变量拼进登录请求参数。示例// 从响应中提取 code这里是一个示意 String captcha vars.get(captchaId); vars.put(loginCaptcha, captcha);然后在登录 HTTP 请求的参数值中使用 ${loginCaptcha}。注意验证码有有效期如果压测持续时间太长需要每次循环都重新获取并把验证码接口放到登录接口前一个采样器。这个方法不万能但能解决大多数动态 token/验证码场景。5.5 中文乱码请求和响应两边都要指定编码现象压测脚本里 POST 参数是中文服务端收到乱码响应返回的中文也乱码。 原因JMeter 默认按 ISO-8859-1 解码响应或没有在 HTTP 请求中指定 content encoding。 解决在 HTTP 请求的“Content encoding”填 utf-8并在 HTTP Header Manager 里加 Content-Type 的 charset。响应乱码可以在“察看结果树”里看到乱码但真正压测时建议在监听器里通过修改 bin/jmeter.properties 设置 sampleresult.default.encodingUTF-8。这行配置只影响结果文件的读取不影响请求发送。修改后必须重启 JMeter 才生效。如果还是乱码检查服务端返回头里是不是写了其它字符集以服务端为准。5.6 JDBC 压测连不上数据库驱动包放错位置现象添加 JDBC Connection Configuration 后跑测试提示 No suitable driver found。 原因数据库驱动 jar 没有放到 JMeter 的 lib 目录或驱动类名和 URL 不匹配。 解决把 mysql-connector-java-5.x.jar 放到 jmeter-2.11/lib 目录重启 JMeter。JDBC URL 写法要匹配版本例如 jdbc:mysql://localhost:3306/testdb?useUnicodetruecharacterEncodingutf-8。在“JDBC Connection Configuration”里填写 Driver class 为 com.mysql.jdbc.Driver。如果是 PostgreSQL 则放 postgresql jar驱动类名是 org.postgresql.Driver。这一步没做对数据库接口测试根本跑不起来。还有一个细节老版本驱动不要用 com.mysql.cj.jdbc.Driver它只匹配新版 MySQL Connector/J 8.x。6. 验证与进阶用 JTL 文件自己算 TP90不依赖新版本报告当命令行压测结束后你会得到一个 result.jtl。它的每一行是一条请求记录字段包括时间戳、响应时间、标签、状态码等。首先打开看一个结构head -20 result.jtl你会看到 CSV 格式通常第一行是字段名timeStamp,elapsed,label,success,...。其中 elapsed 字段就是单个请求的响应时间毫秒。我们要计算 TP90/TP99也就是把响应时间排序后取第 90/99 百分位的值。下面这个 Python 脚本可以直接用import csv import sys def main(path): times [] with open(path, newline, encodingutf-8, errorsignore) as f: reader csv.DictReader(f) for row in reader: if row.get(label, ).startswith(HTTP): try: times.append(float(row[elapsed])) except ValueError: pass times.sort() total len(times) if total 0: print(no samples) return tp90 times[int(total * 0.9)] tp99 times[int(total * 0.99)] avg sum(times) / total print(ftotal{total}) print(favg{avg:.2f} ms) print(ftp90{tp90:.2f} ms) print(ftp99{tp99:.2f} ms) if __name__ __main__: main(sys.argv[1])运行方式python3 parse_jtl.py result.jtl这个脚本除了算百分位还可以加一个统计失败率的逻辑检查 row[success] 字段等于 false 的数量除以总数就是失败率。压测报告的核心其实就是这几个值平均响应时间、TP90、TP99、失败率。新版本 HTML 报告无非是把这些值画成图自己会用 Python 处理 JTL 后你再也不依赖新版的报告功能。再往前一步你可以在命令行压测时通过 -Jthreads、-Jduration 等参数快速跑多组压力然后写一个简单的 Shell 循环调用同一个 jmx收集多份 jtl最后汇总成一张趋势表。我常用的做法是for t in 10 50 100 200; do ./jmeter.sh -n -t testplan/login.jmx -l testplan/result_$t.jtl -Jthreads$t python3 parse_jtl.py testplan/result_$t.jtl summary.txt done这样一次能看出口服从 10 到 200 的变化比只跑一次更有说服力。从那以后我每次做压测都强制先跑一个基线脚本再跑调优后的脚本把两份 JTL 都用同一套脚本处理对比 TP90 的变化。压测工具会升级但这份从 JTL 到百分位数的处理习惯不会过时。希望帮到你。本文还有配套的精品资源点击获取