2025-06-15
工具运维
0

目录

JMeter核心概念速览
测试计划(Test Plan)
线程组(Thread Group)
采样器(Sampler)
监听器(Listener)
实战:压测Spring Boot API
执行步骤
关键配置
分布式压测(提升并发能力)
执行原理
配置
控制机(master)配置
执行机(slave)配置
执行测试
结果分析技巧
核心指标解读
典型性能瓶颈定位
分析技巧指南
总结

作为Java开发者,我们常关注代码逻辑和功能实现,但高并发下的性能瓶颈才是线上系统的“隐形杀手”。JMeter作为Apache开源压测工具,能模拟海量用户请求,帮助我们发现:

  • 接口响应时间延迟

  • 数据库连接池耗尽

  • 线程阻塞、内存泄漏

  • 微服务链路雪崩效应

JMeter核心概念速览

测试计划(Test Plan)

压测的顶层容器,可添加线程组、监听器等组件。

线程组(Thread Group)

模拟并发用户的核心单元,关键参数:

  • 线程数(模拟用户数)
  • Ramp-Up时间(用户启动间隔,秒)
  • 循环次数(每个用户执行次数)

image.png

采样器(Sampler)

支持HTTP、JDBC、JMS、Java请求等协议,Java开发者常用:

  • HTTP Request:测试RESTful API

  • JDBC Request:压测数据库性能

  • Java Request:直接调用Java方法(需集成JMeter插件)

image.png

image.png

监听器(Listener)

收集结果的组件,推荐:

  • 聚合报告(Aggregate Report):TPS、响应时间统计

  • 响应时间图(Response Time Graph):可视化波动

  • 后端监听器(Backend Listener):实时输出结果到InfluxDB+Grafana

image.png

image.png

实战:压测Spring Boot API

场景:测试 /api/users 接口的QPS(每秒查询率)

执行步骤

deepseek_mermaid_20250615_3e69d5.png

关键配置

image.png

HTTP请求路径:http://localhost:8080/api/users

请求头:Content-Type: application/json

请求体(JSON):

json
{ "page": 1, "size": 10 }

image.png

断言:响应状态码200,响应时间<500ms

image.png

分布式压测(提升并发能力)

在使用Jmeter进行性能测试时,如果并发数比较大(比如项目需要支持1000并发),单台主机的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能。

执行原理

image.png

Jmeter分布式测试时,本地jmeter作为控制机(master),其它机器做为执行机(slave)。执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行。执行完成后,slave会把结果回传给master,master会收集所有slave的信息并汇总。

配置

控制机(master)配置

修改apache-jmeter-5.1.1\bin目录里的jmeter.properties文件,在260行新增remote_hosts配置,配置里配置的是两台slave主机的ip和slave主机里安装的jmeter的端口号。

image.png

执行机(slave)配置

解压jdk和jmeter后,配置环境变量

image.png

image.png

bash
#java环境变量export JAVA_HOME=/software/jdk1.8.0_131/export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar #jmeter环境变量expor JMETER_HOME=/software/apache-jmeter-5.1.1export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATHexport PATH=$JMETER_HOME/bin/:$PATH

修改jmeter部分配置,打开/ apache-jmeter-5.1.1/bin目录

(1)修改jmeter.properties文件

image.png

sh
#ip是这台slave主机的ip remote_hosts=192.168.0.132 #端口号是jmeter自定义的端口号,默认是1099 server_port=1098

注意

该remote_hosts和server_port配置需要和本地master的jmeter.properties文件里新增的260行配置一致。

image.png

sh
server.rmi.localport=1098

image.png

sh
# ssl 设置为 true,否则远程执行,会报一个ssl错误 server.rmi.ssl.disable = true

image.png

sh
#防止响应回来的数据有中文乱码 jmeter.save.saveservice.response_data=true jmeter.save.saveservice.samplerData=true

(2)修改jmeter-server文件

image.png

sh
# 配置这台slave主机的ip RMI_HOST_DEF=-Djava.rmi.server.hostname=192.168.0.132

配置完成以后, 启动各个slave上的jmeter

bash
# 控制机执行(分发任务) jmeter -n -t test.jmx -R 192.168.1.101,192.168.1.102 # 压力机启动Agent jmeter-server -Djava.rmi.server.hostname=192.168.1.101

执行测试

本地远程连接slave主机上的jmeter,并执行脚本(有两种启动方式)

image.png

例如:本地jmeter脚本是往数据库里添加随机数据,循环20次。

image.png

结果分析技巧

核心指标解读

指标健康值说明
TPS>100 (根据业务调整)每秒处理请求数
Avg Response Time<300ms平均响应时间
Error %0%请求失败率
90th Percentile<800ms90%请求的响应时间上限

典型性能瓶颈定位

  • TPS低 + CPU占用高 → Java代码效率问题(如算法优化)

  • TPS低 + DB CPU高 → SQL慢查询(需EXPLAIN分析)

  • 错误率突增 → 线程池满/连接超时(调整资源池配置)

分析技巧指南

除了关注平均响应时间 → 还应监控90/95百分位数

将压测环境配置与生产一致 → 确保JVM参数、DB配置同步

关注垃圾回收日志 → 添加JVM参数:-XX:+PrintGCDetails -Xloggc:gc.log

总结

JMeter是Java开发者性 能优化的“显微镜”。通过科学压测+结果分析,我们不仅能预防系统崩溃,更能精准定位代码层缺陷。

记住:没有压测的性能优化,如同盲人摸象!

本文作者:柳始恭

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!