1. 课程导论:容量压测与水位口径边界测试的定义、k6在其中的角色、课程目标与学习路径
1.1 容量压测的核心定义
容量压测(Capacity Testing)是在预定的生产或准生产环境下,通过逐步增加并发用户数或请求吞吐量,找出系统在可接受响应时间与无错误率前提下的最大处理能力。它回答一个关键问题:“系统到底能扛多少流量而不崩溃?”
| 维度 | 说明 | 典型指标 |
|---|---|---|
| 并发用户数 | 同时保持活跃会话的虚拟用户数量 | VUs(Virtual Users) |
| 吞吐量 | 单位时间内完成的业务请求数 | RPS(Requests Per Second) |
| 响应时间 | 从发出请求到收到完整响应的时间 | p95 / p99 延迟 |
| 错误率 | 失败请求占总请求的比例 | < 1% 通常为可接受 |
关键认知:容量压测不是“压到挂为止”,而是找到性能拐点——在系统资源耗尽前,性能指标开始急剧恶化的那个临界值。
1.2 水位口径与边界测试
水位口径指压测过程中对系统资源使用率(CPU、内存、网络带宽、连接池等)的阈值定义。不同团队对“安全水位”的理解不同,常见口径包括:
- 保守口径:CPU ≤ 60%,内存 ≤ 70%,响应时间 p99 ≤ 500ms。
- 激进口径:CPU ≤ 85%,内存 ≤ 85%,响应时间 p99 ≤ 1000ms。
- 弹性口径:允许短时突刺,但持续超过阈值超过 30 秒则触发告警。
边界测试则是在水位口径基础上,验证系统在刚好达到阈值和略微超过阈值时的行为:是否触发熔断、是否降级、是否自动扩缩容。边界测试是容量压测的“最后一公里”,也是最容易遗漏的环节。
实践建议:在制定水位口径时,务必与 SRE 团队对齐“告警阈值”和“熔断阈值”,避免压测通过但线上告警不断。
1.3 k6 在容量压测中的角色
k6 是一款开源、可编程、高性能的负载测试工具,使用 JavaScript 编写测试脚本,天然适合集成到 CI/CD 流水线。在容量压测与边界测试场景中,k6 承担以下核心角色:
- 负载生成器:通过
options中的stages或scenarios精确控制并发用户数、持续时间、递增模式。 - 自定义检查点引擎:使用
check()函数对每个请求的响应状态、响应时间、返回数据做断言,实现“水位口径”的实时验证。 - 指标收集器:内置
http_req_duration、http_req_failed、vus等指标,支持自定义Trend、Counter、Gauge。 - 边界触发控制器:结合
thresholds配置,在压测过程中动态判断是否达到边界条件,并输出通过/失败结果。
// k6 自定义检查点示例:水位口径验证
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 100 }, // 逐步增加到 100 并发
{ duration: '5m', target: 100 }, // 保持 100 并发
{ duration: '1m', target: 0 }, // 逐步减少
],
thresholds: {
http_req_duration: ['p(95)<500'], // 水位口径:p95 响应时间 < 500ms
http_req_failed: ['rate<0.01'], // 水位口径:错误率 < 1%
},
};
export default function () {
const res = http.get('https://test-api.example.com/health');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 300ms': (r) => r.timings.duration < 300,
});
sleep(1);
}
常见误区:仅依赖 k6 内置阈值做水位判断,忽略了自定义检查点对业务逻辑的验证。例如:接口返回 200 但 body 中 errorCode 不为 0,此时应视为失败。
1.4 容量压测与边界测试的关系
下图展示了从“容量摸底”到“边界验证”的完整流程,以及 k6 在每个阶段的作用:
1.5 课程目标与学习路径
本课程旨在帮助学员掌握使用 k6 进行自定义检查点验证,从而精准判断容量压测中的水位口径与边界条件。完成本课程后,你将能够:
- 独立设计基于 k6 的容量压测方案,包含 stages、thresholds、scenarios。
- 编写自定义 check() 函数,验证业务层面的水位口径(如响应体中的 errorCode、数据完整性)。
- 实现边界测试脚本,在阈值附近自动触发断言并输出通过/失败结果。
- 将压测结果集成到 CI/CD 流水线,实现容量回归的自动化门禁。
| 模块 | 核心内容 | 实践产出 |
|---|---|---|
| 第 1-5 章 | k6 基础与脚本结构、options 配置、check() 与 thresholds 入门 | 第一个自定义检查点脚本 |
| 第 6-12 章 | 水位口径设计、边界条件建模、场景编排(ramping-arrival-rate / per-vu-iterations) | 容量压测完整方案 |
| 第 13-20 章 | 自定义指标(Trend/Counter/Gauge)、阈值表达式、断言失败处理 | 边界测试自动化脚本 |
| 第 21-25 章 | CI/CD 集成(GitHub Actions / Jenkins)、报告生成、结果分析 | 流水线门禁配置 |
| 第 26-30 章 | 实战案例:电商秒杀、API 网关、微服务链路压测 | 完整项目交付 |
学习建议:每章结束后,务必在本地 k6 环境中运行示例脚本,并尝试修改阈值或检查点逻辑,观察输出变化。只有亲手“压”过,才能真正理解水位口径的含义。