【Jmeter】项目压测流程案例

【Jmeter】项目压测流程

压测目的:找出系统吞吐量、响应时间、瓶颈点、最大并发、崩溃阈值,评估系统能不能扛住线上流量。

【一】压测前准备

【1】环境隔离

✅ 压测环境和线上环境配置尽量一致:CPU、内存、JVM 参数、数据库、中间件配置。

❌ 禁止直接在生产环境压测,会打垮业务。

【2】监控必须全套开启(没有监控的压测等于白跑)

(1)JVM 监控:Prometheus+Grafana / SpringBoot Actuator + Micrometer

指标:CPU 使用率、堆内存、非堆 (元空间)、GC 次数、GC 停顿时间、线程数、活跃线程、阻塞线程

(2)系统监控:服务器 CPU、内存、磁盘 IO、网络带宽、load 平均负载

(3)中间件监控

MySQL:QPS、TPS、慢 SQL、连接数、锁等待、Buffer Pool 命中率

Redis:ops、内存、连接数、网络

连接池:Hikari 活跃连接、等待队列、最大连接数

(4)业务接口指标:QPS (TPS)、平均响应时间 P50/P95/P99、错误率

【3】压测接口准备

(1)选择核心接口:查询接口、提交接口,尽量覆盖真实业务场景;不要只压简单 hello 接口。

(2)接口参数尽量模拟真实入参;有鉴权要带上 token;如果是动态数据源接口,要准备好测试数据源。

(3)关闭无关日志:压测环境把 info→warn,关闭大量 debug 日志,日志会严重影响性能。

(4)JVM 参数调到位,和生产对齐

bash 复制代码
-Xms4g -Xmx4g -XX:+UseG1GC

【4】压测之前确认

数据库数据量尽量贴近线上(千万 / 百万级别,不要空库压测);

预热:刚启动 JVM 有 JIT 编译,压测前先跑几分钟预热,再统计指标,否则结果偏低。

【二】常用压测工具

【1】JMeter(Java,企业最常用)

GUI 只用来编写脚本,压测必须使用命令行非 GUI 模式运行,GUI 本身消耗性能。

bash 复制代码
jmeter -n -t test.jmx -l result.jtl -e -o report

优点:支持 http、jdbc、dubbo,参数化、断言、集合点,生成 HTML 报告。

缺点:压测机本身是 Java 程序,并发太高压测机会先 CPU 打满,大并发需要分布式压测。

【2】k6(Go 写,轻量,现在越来越流行)

脚本 JavaScript,压测机性能很高,单机可以模拟上万并发。

【3】ab(Apache Bench)

简单快速,适合简单接口,不适合复杂业务。

bash 复制代码
ab -n 10000 -c 100 http://127.0.0.1:8080/xxx

注意:压测机与被测服务分开,不要在同一台机器压自己,否则服务器资源被压测工具占用,数据不准。

【三】压测指标

核心四大指标:TPS/QPS、响应时间 RT、错误率、并发数

⚠️不要只看平均响应时间!平均会掩盖慢请求,重点看 P95、P99 分位值。

【1】压测两个关键场景

(1)基准压测:少量并发,看接口正常性能基线。

(2)梯度加压压测:逐步增加并发,观察 QPS 什么时候不再上涨、RT 飙升、错误率上升。

QPS 不再上升的拐点,就是系统最大吞吐量;

一旦错误率 > 0,停止加压,此时已经过载。

【2】压测通过标准(通用业务标准,可按产品需求调整)

(1)在目标业务 QPS 下:

错误率 = 0%

P95 响应时间 ≤500ms,P99 ≤1000ms

应用服务器 CPU ≤75%,无频繁 Full GC

MySQL CPU ≤70%,无大量慢 SQL,数据库连接池不耗尽

(2)稳定性压测(长稳):在目标 QPS 下持续跑 30 分钟~2 小时

内存不能持续上涨,不能内存泄漏;GC 正常;连接数不泄露;

不能出现连接泄漏、线程泄漏、文件句柄耗尽。

很多系统短时压测很好,跑半小时后内存慢慢涨爆,长稳压测就是用来发现泄漏。

扩容预留:压测出系统最大稳定 QPS 后,线上容量规划一般预留 1.5‑2 倍余量,应对流量突增。

【四】SpringBoot 常见压测瓶颈点

(1)数据库瓶颈(最常见)

慢 SQL、缺少索引;MySQL CPU 打满;

Hikari 连接池配置过小,大量请求排队等待数据库连接;

(2)JVM 问题:内存泄漏、频繁 GC、元空间溢出

(3)Tomcat 容器线程数不足:server.tomcat.threads.max默认 200,高并发下线程耗尽

yml 复制代码
server:
  tomcat:
    threads:
      max: 400

(4)同步阻塞代码,锁竞争,大量线程 WAIT/BLOCKED

(5)日志打印过多,磁盘 IO 打满

(6)Redis/Others 中间件响应慢成为下游瓶颈

(7)之前我们写的动态数据源场景:动态加载驱动、连接池创建逻辑,要重点压,看有没有类加载、连接泄漏。

如何定位瓶颈

CPU 高:top → jstack抓线程堆栈,看哪些线程耗 CPU;

内存上涨、GC 频繁:jmap dump 堆快照 MAT 分析;

接口 RT 很高,CPU 不高:多半 IO 瓶颈(数据库、网络);

线程数暴涨:线程池耗尽、数据库连接耗尽。

【五】压测执行步骤流程

(1)梳理业务,确定业务预期 QPS、并发、SLA 响应时间指标;

(2)准备压测环境,部署应用,全套监控;JVM 参数与生产对齐;

(3)编写压测脚本,参数化,预热 JVM;

(4)基准测试,低并发跑一遍,拿到基线;

(5)梯度加压:逐步加大并发,记录每一档 QPS、P95/P99、CPU、错误率,直到出现错误或者 RT 大幅恶化;

(6)稳定性压测:取 80% 最大稳定 QPS,持续长时间运行,观察内存泄漏、资源泄漏;

(7)记录报告:压测环境配置、JVM 参数、并发、QPS、RT (P50/P95/P99)、CPU、GC、数据库指标,系统瓶颈点,优化建议。

(8)优化后重新压测对比。

【六】简单压测报告模板示例

业务接口:动态数据源查询接口

环境配置:4C8G,JVM Xmx4G

目标指标:QPS≥200,P95<500ms,错误率 0

压测结果:

并发 100 线程:QPS=320,P95=380ms,P99=720ms,CPU62%,错误率 0 ✔满足

并发 200 线程:QPS=380,P95=850ms,数据库 CPU 达到 78%,RT 开始上涨,到达瓶颈

长稳 1 小时:内存无持续上涨,无 Full GC。

瓶颈:MySQL 查询,建议增加索引优化 SQL。

相关推荐
是吕先森4 天前
【jmeter】简单应用
jmeter
执笔画流年呀5 天前
【性能测试】Jmeter下载安装、环境配置-小白使用手册
jmeter
颜挺锐6 天前
JMeter TCP 取样器 行尾字节值是 62,是代表的什么意思?
网络协议·tcp/ip·jmeter
Qredsun16 天前
jmeter setUp Thread Group
jmeter
Qredsun16 天前
jmeter全局变量的设置与使用
jmeter
菩提树下的打坐18 天前
性能测试进阶:从 JMeter 基线到 SLO 驱动的压测体系
学习·jmeter
zzz_236820 天前
ShopXO 商城系统测试报告:功能、后台管理、异常状态与 JMeter 性能验证
jmeter