性能与负载
JMeter、k6、Gatling。
35 分钟
性能与负载
性能测试 验证系统在预期负载下是否满足响应时间、吞吐量与资源占用目标;负载测试 逐步加压找拐点,压力测试 超过容量观察降级与恢复。对照 /roadmaps/qa「Performance Testing」节点,本课介绍 JMeter、k6 与 Gatling。
学习目标
- 区分性能、负载、压力、 soak 测试的目标
- 定义 SLA 指标:P95 延迟、RPS、错误率
- 用 k6 或 JMeter 对 REST API 编写简单负载脚本
- 将性能测试与 Spring Boot 监控、CI 衔接
核心概念
测试类型
| 类型 | 目的 | 时长 |
|---|---|---|
| 基准 | 单用户基线响应 | 短 |
| 负载 | 预期并发下是否达标 | 中 |
| 压力 | 找到崩溃点 | 中 |
| soak | 长时间泄漏、连接池耗尽 | 长 |
关键指标
- 响应时间:P50 / P95 / P99(平均数易误导)
- 吞吐量:RPS(每秒请求数)
- 错误率:5xx、超时占比
- 资源:CPU、内存、DB 连接、GC
k6 示例
import http from "k6/http";
import { check, sleep } from "k6";
export const options = {
vus: 20,
duration: "30s",
thresholds: { http_req_duration: ["p(95)<500"] },
};
export default function () {
const res = http.get("http://localhost:8080/tracks/git-essentials");
check(res, { "status 200": (r) => r.status === 200 });
sleep(1);
}
Gatling(Scala DSL)适合 JVM 团队;JMeter GUI 上手快,CLI 可进 CI。
分析流程
- 定 SLA(如 P95 < 300ms @ 100 RPS)
- 隔离环境(勿打生产)
- 加压 → 看 APM / 日志 / DB 慢查询
- 瓶颈定位:N+1 查询、缺索引、线程池过小
与 testing-essentials/Spring 对照
| 性能测试 | 开发侧测试 |
|---|---|
| k6 打 HTTP | MockMvc 不测并发(test-mockmvc) |
| 全链路压测 | test-integration 验证 DB 正确性 |
| Actuator / metrics | Spring Boot 监控端点、sb-test 旁路 |
功能测试 绿 不等于性能 达标;发布前对 tracks 列表、搜索等热点 API 做负载抽检。CI 通常 (耗资源),放 staging nightly。