在 Linux 下使用 JMeter 进行压力测试
一 环境准备与安装
- 安装 JDK 8(JMeter 5.x 建议使用 Java 8 或 Java 11),并配置环境变量:
- 编辑 /etc/profile,加入:
- export JAVA_HOME=/usr/local/jdk1.8.0_221
- export PATH=$JAVA_HOME/bin:$PATH
- 执行 source /etc/profile 使配置生效,验证:java -version
- 下载并解压 Apache JMeter(二进制包 .tgz),配置环境变量:
- 编辑 /etc/profile,加入:
- export JMETER_HOME=/usr/local/apache-jmeter-5.4.1
- export PATH=$JMETER_HOME/bin:$PATH
- 验证:jmeter -v
- 建议赋予 JMeter 脚本执行权限:chmod -R +x $JMETER_HOME/bin
- 说明:JMeter 为 Java 应用,无需额外安装,解压即用。
二 快速执行压测
- 在 Windows GUI 中设计好测试计划(Thread Group、HTTP Request、CSV Data Set Config、Listener 等),保存为 .jmx,上传至 Linux 压测机。
- 非 GUI 执行并生成报告(推荐):
- jmeter -n -t your_plan.jmx -l result.jtl -e -o report
- 参数说明:
- -n:非 GUI 模式
- -t:指定 .jmx 脚本
- -l:输出 JTL 结果文件
- -e -o:测试结束后生成 HTML 报告 到指定目录(目录必须为空)
- 仅保存结果,不生成报告:
- jmeter -n -t your_plan.jmx -l result.jtl
- 离线生成报告(已有 JTL 时):
- jmeter -g result.jtl -o report
- 后台运行与日志:
- nohup jmeter -n -t your_plan.jmx -l result.jtl -e -o report > jmeter.log 2>&1 &
- 常用文件传输与归档:
- 上传/下载:rz / sz
- 打包报告:tar czf report.tar.gz report。
三 分布式压测
- 架构:一台 Controller(主控机,持有脚本),多台 Agent(负载机,发起请求)。
- 步骤:
- 在所有机器部署相同版本的 JMeter;各 Agent 启动 jmeter-server:
- nohup $JMETER_HOME/bin/jmeter-server -Djava.rmi.server.hostname=<AGENT_IP> &
- 在 Controller 的 jmeter.properties 中配置 remote_hosts:
- remote_hosts=10.26.30.13:1099,10.26.30.16:1099
- 在 Controller 执行(指定远程负载机):
- jmeter -n -t your_plan.jmx -l result.jtl -R 10.26.30.13:1099,10.26.30.16:1099
- 或使用已配置的 remote_hosts:jmeter -n -t your_plan.jmx -l result.jtl -r
- 停止:在 Controller 执行 $JMETER_HOME/bin/shutdown.sh
- 注意:
- 脚本与 CSV 参数文件在各 Agent 上路径需一致(建议使用绝对路径)。
- 分布式压测时,整体 TPS 为各 Agent 之和,平均响应时间通常接近各机平均值(视场景而定)。
四 结果分析与关键指标
- HTML 报告 Dashboard 关注:
- APDEX(0~1,越接近 1 体验越好)
- Requests Summary(OK/KO 通过率与失败率)
- Statistics(合并的聚合与分布数据)
- Errors(按错误类型聚合)
- Charts / Over Time / Throughput / Response Times(响应时间、吞吐、每秒事务、延迟等趋势与分布)
- 聚合报告关键列:
- Label、Samples、Average、Median、90%/95%/99% Line、Min、Max、Error %、Throughput、Received/Sent KB/sec
- 命令行实时日志采样间隔(jmeter.properties):
- summariser.interval=10(每 10s 打印一次汇总)
五 常见问题与排查
- 报错:Could not find the TestPlan class
- 原因:仅保存了测试计划的部分节点,未包含根节点 TestPlan。
- 解决:在 GUI 中选择“保存测试计划”或选中测试计划节点后保存,确保保存的是完整测试计划。
- 报错:CannotResolveClassException(如 kg.apc.jmeter.threads.SteppingThreadGroup)
- 原因:脚本使用了 JMeter 插件类(如 Stepping Thread Group),但压测机未安装对应插件。
- 解决:在压测机安装相同插件(或将线程组改为内置的 Thread Group)。
- 压力机瓶颈判断与调优:
- 观察压力机 CPU > 80% 时应考虑增加压力机或降低并发。
- 调整 JMeter JVM 堆内存(bin/jmeter 或 jmeter 脚本中的 HEAP):
- 例如:-Xms1g -Xmx1g(根据机器内存合理设置,避免频繁 GC)。