作为Java开发者,我们常关注代码逻辑和功能实现,但高并发下的性能瓶颈才是线上系统的“隐形杀手”。JMeter作为Apache开源压测工具,能模拟海量用户请求,帮助我们发现:
接口响应时间延迟
数据库连接池耗尽
线程阻塞、内存泄漏
微服务链路雪崩效应
压测的顶层容器,可添加线程组、监听器等组件。
模拟并发用户的核心单元,关键参数:
支持HTTP、JDBC、JMS、Java请求等协议,Java开发者常用:
HTTP Request:测试RESTful API
JDBC Request:压测数据库性能
Java Request:直接调用Java方法(需集成JMeter插件)
收集结果的组件,推荐:
聚合报告(Aggregate Report):TPS、响应时间统计
响应时间图(Response Time Graph):可视化波动
后端监听器(Backend Listener):实时输出结果到InfluxDB+Grafana
场景:测试 /api/users 接口的QPS(每秒查询率)
HTTP请求路径:http://localhost:8080/api/users
请求头:Content-Type: application/json
请求体(JSON):
json{ "page": 1, "size": 10 }
断言:响应状态码200,响应时间<500ms
在使用Jmeter进行性能测试时,如果并发数比较大(比如项目需要支持1000并发),单台主机的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能。
Jmeter分布式测试时,本地jmeter作为控制机(master),其它机器做为执行机(slave)。执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行。执行完成后,slave会把结果回传给master,master会收集所有slave的信息并汇总。
修改apache-jmeter-5.1.1\bin目录里的jmeter.properties文件,在260行新增remote_hosts配置,配置里配置的是两台slave主机的ip和slave主机里安装的jmeter的端口号。
解压jdk和jmeter后,配置环境变量
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文件
sh#ip是这台slave主机的ip
remote_hosts=192.168.0.132
#端口号是jmeter自定义的端口号,默认是1099
server_port=1098
注意
该remote_hosts和server_port配置需要和本地master的jmeter.properties文件里新增的260行配置一致。
shserver.rmi.localport=1098
sh# ssl 设置为 true,否则远程执行,会报一个ssl错误
server.rmi.ssl.disable = true
sh#防止响应回来的数据有中文乱码
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true
(2)修改jmeter-server文件
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,并执行脚本(有两种启动方式)
例如:本地jmeter脚本是往数据库里添加随机数据,循环20次。
指标 | 健康值 | 说明 |
---|---|---|
TPS | >100 (根据业务调整) | 每秒处理请求数 |
Avg Response Time | <300ms | 平均响应时间 |
Error % | 0% | 请求失败率 |
90th Percentile | <800ms | 90%请求的响应时间上限 |
TPS低 + CPU占用高 → Java代码效率问题(如算法优化)
TPS低 + DB CPU高 → SQL慢查询(需EXPLAIN分析)
错误率突增 → 线程池满/连接超时(调整资源池配置)
除了关注平均响应时间 → 还应监控90/95百分位数
将压测环境配置与生产一致 → 确保JVM参数、DB配置同步
关注垃圾回收日志 → 添加JVM参数:-XX:+PrintGCDetails -Xloggc:gc.log
JMeter是Java开发者性 能优化的“显微镜”。通过科学压测+结果分析,我们不仅能预防系统崩溃,更能精准定位代码层缺陷。
记住:没有压测的性能优化,如同盲人摸象!
本文作者:柳始恭
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!