ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

JMeter 5.6.2性能测试环境搭建:Java配置到首个压测脚本

JMeter 5.6.2性能测试环境搭建:Java配置到首个压测脚本 1. 为什么性能测试要从JMeter 5.6.2这套组合开始做后端或者测试的同学迟早会遇到一个问题接口功能跑通了但上线之后抗不扛得住并发数据库连接池够不够一个接口在100个线程同时打的时候响应时间会涨到什么程度我也是一路从功能测试被逼到性能测试的最早用的是那种笨办法——写个循环多线程shell脚本去压结果压出来的数据自己都不敢信因为脚本本身的瓶颈比被测服务还明显。后来老老实实回到JMeter一用就是好几年5.6.2这个版本是我目前主力推荐给新人的。先说清楚这套组合是什么。JMeter是Apache基金会下的开源压测工具纯Java写的所以它跑起来的第一个前提就是机器上得有一套能用的Java运行环境。JMeter 5.6.2对Java的要求是Java 8及以上但实践经验告诉我直接上Java 11或者Java 17的LTS版本会更稳尤其是你要压的接口里有HTTPS、有较大的响应报文时新版本JDK在TLS和GC上的表现会明显好一些。这套组合能做的事很明确模拟多用户并发请求、观察吞吐量和响应时间、找系统的性能拐点、做接口回归和稳定性验证。适合谁来学后端开发想做自测的、测试工程师转性能方向的、运维要做容量评估的甚至是学生做毕业设计需要跑压测数据的都能用得上。很多人卡在第一步——环境。Java装了一大堆版本环境变量改来改去JMeter解压了双击却没反应或者闪一下就退了。这些问题本质上都不难难的是没人把为什么这么配讲清楚。这篇就按照我自己装机器、带新人、排故障的顺序把Java环境配置、JMeter 5.6.2下载安装、启动调优到跑通第一个压测脚本完整的走一遍。你看完照着做基本能一次过。2. Java环境配置整个安装链路的第一块基石2.1 JDK和JRE到底该装哪个这里有个新手最容易迷糊的地方。JRE是Java运行环境只负责跑Java程序JDK是Java开发工具包里面包含了JRE还带编译器、调试工具等。JMeter本身是拿来运行的理论上装JRE也能跑。但实际操作里我强烈建议直接装JDK原因有两个第一JDK里带了很多诊断工具比如jps、jstack、jvisualvm压测过程中想知道JMeter自己是不是GC卡住了靠这些工具最直接第二很多公司机器上还会同时跑Maven、Gradle或者其他Java工具JDK装一次全都覆盖了省得来回来去折腾。所以结论很简单——装JDK别图省事只装JRE。版本选择上我一般这么分如果你所在团队用的中间件版本偏老比如还在跑一些老框架那Java 8足够稳如果是新项目Spring Boot 3.x那条线直接上Java 17中间过渡的选Java 11。JMeter 5.6.2本身对这几个版本都兼容我个人日常用的是Java 17LTS跑大并发时JVM表现比较省心。2.2 下载JDK与安装目录的选择下载渠道我只推荐一个地方AdoptiumEclipse Temurin或者Oracle官方的JDK下载页。第三方那些打包站尽量别碰遇到过被塞了奇怪东西的安装包。下载的时候注意选对系统和架构——Windows选x64的msi或者zipmacOS现在分Intel的x64和Apple Silicon的aarch64选错了装上去跑不了。安装目录这件事我踩过一次很蠢的坑当时图省事把JDK装在了C:\Program Files\Java\...下面路径里带空格。结果有些脚本传参的时候没加引号直接解析出错查了半天才发现是目录空格的问题。后来我统一把JDK放在一个纯英文、不带空格的路径下比如C:\devtools\jdk-17或者/opt/java/jdk17。这个习惯强烈建议你养成能省掉后面一堆莫名其妙的报错。另外提一句Windows下如果同时装了多个JDK别用安装程序默认那种往系统目录塞的方式容易互相覆盖。用zip包解压到独立目录环境变量手动指过去想切换版本只要改一个JAVA_HOME就行。2.3 配置JAVA_HOME与Path环境变量这是整套配置里最需要耐心的部分我用Windows为例讲清楚每一步在干什么。第一步新建JAVA_HOME。右键此电脑属性高级系统设置环境变量。在系统变量里点新建变量名写JAVA_HOME变量值写你JDK的根目录比如C:\devtools\jdk-17。注意这里要写到JDK的根不要写到bin。为什么要有JAVA_HOME因为大量工具包括JMeter的启动脚本都是靠它来找Java的。你去看JMeter的jmeter.bat里面就有判断JAVA_HOME的逻辑它优先用JAVA_HOME指向的那个Java而不是随便一个在Path里的Java。所以这一步没配好后面JMeter极可能启动不了或者用到错误的Java版本。第二步编辑Path。在系统变量里找到Path编辑新增一条%JAVA_HOME%\bin。这样你才能在命令行里直接用java、javac这些命令。如果以前装过Java注意把旧的Java相关Path条目删掉或者挪到后面不然可能出现命令走的是新版本、但JAVA_HOME指向旧版本的错乱。第三步可选但推荐加一个CLASSPATH。现代JDK其实不配也行但有些老脚本依赖它。如果你确实要配值写.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar前面那个点表示当前目录别漏了。2.4 macOS与Linux下的配置差异macOS现在如果你用Homebrew装Java会简单很多brew install --cask temurin之类的命令就搞定了。但Homebrew装的Java路径比较绕在/Library/Java/JavaVirtualMachines/下面找到对应的版本目录那个Contents/Home才是真正的JAVA_HOME。配置写到~/.zshrc新版macOS默认shell是zsh了里export JAVA_HOME$(/usr/libexec/java_home -v 17) export PATH$JAVA_HOME/bin:$PATH用/usr/libexec/java_home的好处是它能自动帮你找到指定版本的Java切换版本只要改数字非常省心。Linux上我一般这么处理编辑/etc/profile或者用户目录下的.bashrcexport JAVA_HOME/opt/java/jdk17 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar改完之后一定要执行source /etc/profile让它生效别新开一个终端发现没变就以为配错了——很可能只是没重新加载。2.5 怎么确认Java环境真的配好了很多人配完就急着装JMeter其实这一步该先验证。开一个新的命令行窗口一定要新开环境变量在旧窗口不生效依次敲java -version javac -version echo %JAVA_HOME%前两条能正常打印版本号说明Path对了第三条打印出你的JDK目录说明JAVA_HOME对了。Linux和macOS下把第三条换成echo $JAVA_HOME。三条都正常Java这块就算过关了。这里有个细节java -version和javac -version打印的版本要一致如果不一致说明你机器上有多个Java命令走了一个、JAVA_HOME指向另一个后面JMeter很可能出问题趁现在先理清楚。3. JMeter 5.6.2下载与安装实操3.1 从官网拿安装包并校验JMeter的官方下载地址在Apache官网的JMeter项目页找不到就直接搜Apache JMeter download。进去之后有Binaries和Source两块我们下载Binaries里的zip包比如apache-jmeter-5.6.2.zip。别下Source那个那是源码还得自己编译没必要。下载的时候有一点要提醒官网旁边同时提供.tgz和.zipWindows用zipLinux和macOS两个都行习惯用哪个用哪个。下载完成后建议对一下校验值官网提供了sha512虽然麻烦但压测这种要长期跑的工具安装包完整性值得花一分钟确认。校验命令# Linux/macOS shasum -a 512 apache-jmeter-5.6.2.zip # Windows PowerShell Get-FileHash .\apache-jmeter-5.6.2.zip -Algorithm SHA512算出来的值和官网对得上就可以放心用。3.2 解压位置与目录结构解读解压位置同样遵循前面的原则——纯英文、无空格、路径别太深。比如C:\devtools\apache-jmeter-5.6.2或者/opt/apache-jmeter-5.6.2。别放桌面也别放中文目录比如下载文件夹里JMeter在写日志、找插件时可能会因为路径编码出问题。解压完打开目录我带你认识几个关键文件夹理解了这些后面排错会快很多目录作用什么时候会用到bin可执行文件和配置启动JMeter、调JVM参数、找jmeter.propertieslib核心依赖jar装插件、加第三方库时往这里放lib/ext扩展和插件装插件管理器、自定义元件extras辅助工具生成报告、做CI集成的脚本docs文档查元件用法日常打交道最多的是bin和lib这两个。bin里面的jmeter.batWindows和jmeter.shLinux/macOS就是启动脚本jmeter.properties是主配置文件后面改语言、改内存都在这。3.3 启动JMeter的两种方式第一种图形界面方式适合写脚本和调试。Windows下直接双击bin\jmeter.bat。但双击有个常见现象——跳出一个黑窗口然后一闪就没了。这种情况基本是Java环境的问题可能是JAVA_HOME没配、版本太低、或者指向了一个坏的Java。别急着重装先按2.5节的方法验证Java多半能定位到。第二种命令行方式适合真正压测和跑在服务器上。图形界面本身就耗资源用它压测会严重影响结果所以正式压测一定要用命令行# Linux/macOS ./jmeter.sh -n -t test.jmx -l result.jtl -e -o report# Windows jmeter.bat -n -t test.jmx -l result.jtl -e -o report这里的参数含义-n是非GUI模式-t指测试计划文件-l是结果日志-e -o是跑完自动生成HTML报告到指定目录。记住一条硬规矩压测只用命令行GUI只用来写脚本。我自己实测过同一个脚本GUI模式跑出来的吞吐量能比命令行低30%以上因为GUI要实时渲染图表抢了大量资源。3.4 中文界面与常用配置调整JMeter默认英文界面想换成中文有两种做法。临时的菜单栏Options-Choose Language-Chinese (Simplified)。永久的编辑bin/jmeter.properties找到language这一行改成languagezh_CN保存重启就一直是中文了。不过说实话我建议新手界面用中文没问题但看日志、看官方文档时记得对照英文术语因为社区里大部分人交流还是用英文元件名中文界面下对应的英文名最好心里有数。除了语言jmeter.properties里有几个配置我每次装完必改。第一是日志级别默认有时候太啰嗦可以把log_level.jmeter调到INFO或WARN第二是结果保存格式默认jtl是csv压测中如果启用了保存响应数据文件会巨大注意jmeter.save.saveservice.response_data这个开关别乱开第三是界面字体大小高分屏下JMeter界面字特别小可以在jmeter.properties里加jmeter.hidpi.modetrue来改善。4. 环境联调与第一个性能测试脚本4.1 从零搭一个HTTP测试计划环境装好了得跑个东西验证一下整条链路通不通。打开JMeter界面右键左侧的测试计划添加线程用户 - 线程组。线程组是压测的核心它定义了要模拟多少用户、怎么发起。然后在测试计划上再添加配置元件 - HTTP请求默认值把被测服务的协议、域名、端口填进去这样后面每个请求就不用重复填了。接着在线程组下添加取样器 - HTTP请求路径填你要压的接口方法选GET或POST。最后也是最容易漏的一步添加监听器 - 查看结果树或者聚合报告不然你压完什么都看不到。一个最简单的结构就是测试计划线程组HTTP请求默认值HTTP请求查看结果树 / 聚合报告写好之后点工具栏那个绿色三角运行去查看结果树里看请求返回没有、状态码是多少。第一次跑别设太多线程1个线程1次循环就行目的只是验证环境。这一步全绿了说明Java、JMeter、被测服务三方都通了。4.2 线程组参数到底该怎么算线程组里那几个数字看着简单实际最容易配错。三个核心参数线程数线程数并发用户数、Ramp-Up时间多少秒内把这些线程全部启动、循环次数。举个具体例子帮你理解。线程数设100Ramp-Up设10循环设1意思是10秒内逐步启动100个线程然后每个线程发一次请求就结束。这里的逐步启动很关键——如果Ramp-Up设成0或者1100个线程几乎同时冲出去那是瞬时冲击容易把服务直接打挂设成10秒就是每秒大概上10个用户更接近真实的用户增长曲线。然后是最容易搞混的一个点线程数不等于并发数。真正的并发数取决于你的接口响应时间。如果接口平均响应500毫秒100个线程在持续施压的情况下实际同时在处理的请求大概是100乘以响应时间/请求间隔。想精确控制QPS得结合响应时间反推或者用恒定吞吐量定时器来控制。这块我一开始也懵多压几次、对着聚合报告里的吞吐量指标看慢慢就有感觉了。另外提醒一句JMeter的线程本质是Java线程一台普通机器跑几百个线程还行上千个线程就开始吃力了因为JMeter自己也消耗CPU和内存。真要压几千上万的并发正规做法是用分布式压测一台控制机带上多台执行机一起打而不是硬堆单机线程数。4.3 聚合报告里的指标怎么看跑完压测聚合报告里会出来一堆指标我挑最常看的几个讲清楚。Samples是发出的总请求数Average是平均响应时间Median是中位数比平均值更抗极端值干扰90% Line表示90%的请求响应时间都在这个值以内这个指标比平均值实用得多因为平均值会被少数极快或极慢的请求带偏Throughput是吞吐量一般看每秒处理多少请求Error是错误率。看报告的时候别只盯平均值。我见过平均响应50毫秒、看起来很漂亮但90%线突然飙到800毫秒的情况说明有一小部分请求体验极差这种问题上线后就是用户投诉的源头。所以我判断一次压测是否合格主要看三个错误率是否接近0、90%线是否在可接受范围内、吞吐量是否稳定波动大说明系统有瓶颈在抖动。5. 常见问题与排查技巧实录5.1 启动报错与Java路径定位JMeter启动相关的问题九成都在Java上。我把常见的几种整理成表方便你对照排查现象大概率原因解决方向双击bat黑窗一闪而退JAVA_HOME没配或指向错误检查JAVA_HOME用echo验证提示找不到java命令Path里没有Java bin补上%JAVA_HOME%\bin启动报Unsupported class versionJDK版本太低换Java 8以上推荐11/17界面卡死或启动极慢内存不足或JDK与JMeter不匹配调JVM参数换LTS版本提示端口被占用上次进程没退干净结束残留进程或改端口排查这类问题时我有个习惯——不用双击直接开命令行进到bin目录手动执行jmeter.bat这样错误信息会完整打印在窗口里比一闪而退好定位太多。这一步看着笨但真的能省掉大量瞎猜的时间。5.2 内存溢出与大并发下的JVM调优默认情况下JMeter分配的堆内存不大一旦线程数上去或者响应体很大很容易OutOfMemoryError。解决方法在bin/jmeter.batLinux是jmeter脚本里找JVM参数调整堆大小比如set HEAP-Xms2g -Xmx2g -XX:MaxMetaspaceSize256m-Xms是初始堆-Xmx是最大堆两者设成一样可以避免运行中反复扩容带来的抖动。2G是个常见的起步值压大并发可以往上加但要留够系统本身的内存别把机器压爆。调完重启JMeter在界面的选项里能看到当前堆使用情况。这里有个血泪教训一开始我贪心把堆设成8G结果压测时GC停顿特别明显吞吐量反而下降。后来才明白堆不是越大越好回收压力也随之增大合适的做法是配合G1或者ZGC先把GC日志打开观察再决定堆大小。压测工具本身的性能是会直接影响压测结果的这点必须心里有数。5.3 中文乱码、HTTPS与结果文件问题中文乱码是高频问题。如果请求体里有中文JMeter默认编码可能导致乱码解决办法一般是在HTTP请求里指定Content encoding为UTF-8或者调整jmeter.properties里的sampleresult.default.encodingUTF-8。响应里的中文乱码检查被测服务返回头里的编码声明是否正确。压HTTPS接口时如果遇到证书校验失败可以添加HTTP请求默认值里的SSL配置或者用JMeter提供的证书管理相关元件。生产环境压测一定要注意别真的把线上数据打乱压测流量要能识别并在服务端做隔离这是原则问题。结果文件方面.jtl默认是CSV格式压测过程中如果开了保存响应数据文件会几百兆甚至几个G直接拖慢压测。我的习惯是压测期间只存必要字段需要详细数据时再针对性开启。生成HTML报告时如果目标目录非空JMeter会报错拒绝写入记得每次生成报告到一个全新空目录。6. 几个装完就想告诉你的实操心得环境这套东西装一次记不住装三次才形成肌肉记忆。我把这些年反复验证过的几个习惯分享出来。第一个习惯别把环境配置当一次性任务。JMeter和Java都会升级机器也会换我习惯在团队里维护一份环境配置说明文档把JDK路径、JAVA_HOME值、JMeter目录都记下来换机器时照着抄比重新摸索快得多。这不是形式主义是真能救急。第二个习惯测试计划文件.jmx用文本编辑器也能看。它其实就是XML有时候界面里元件出问题打不开或者想批量改参数直接编辑.jmx比在界面里点来点去快。我带队的时候很多简单接口的脚本是先写个模板再用文本替换生成一批效率提升很明显。第三个习惯压测前先空跑。正式施压前用1个线程跑通全流程确认参数、鉴权、数据依赖都没问题再逐步加线程。直接上大并发一旦脚本本身有问题压出来的数据全是废的还白白浪费一轮时间。最后一点别迷信工具报出来的数字。JMeter自己的资源消耗、网络带宽、被测服务和压测机是不是在同一台机器上都会影响结果。我现在做压测控制机、执行机、被测服务尽量分开跑之前先看一遍机器负载确保瓶颈出在被测服务上、而不是压测链路自己身上。工具是帮你找答案的别让工具本身变成答案的一部分。
返回列表