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 在每个阶段的作用:

容量压测与边界测试流程(k6 角色映射) 阶段 1:容量摸底 k6 stages 递增负载 阶段 2:水位口径定义 k6 thresholds + check() 阶段 3:边界测试 自定义检查点 + 阈值触发 输出:容量报告 + 边界条件 反馈:调整水位口径 说明: 1. 容量摸底阶段:k6 通过 stages 逐步加压,找到系统性能拐点。 2. 水位口径定义阶段:基于摸底数据,设定 p95 延迟、错误率、CPU 等阈值。 3. 边界测试阶段:在阈值附近反复试探,验证熔断、降级、扩缩容等行为。 4. 反馈闭环:根据边界测试结果,反向优化水位口径,形成持续改进。

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 环境中运行示例脚本,并尝试修改阈值或检查点逻辑,观察输出变化。只有亲手“压”过,才能真正理解水位口径的含义。