1. 课程导论:k6简介、多阶段压测的价值、SLO门禁概念、课程目标与前置知识

1.1 k6 简介:面向SRE的现代压测工具

k6 是由 Grafana Labs 开源的、以 Go 语言编写核心引擎、JavaScript 编写脚本的下一代负载测试工具。它专为 高并发、低资源消耗、CI/CD 集成 而设计,已成为 SRE 和性能工程团队的标准压测平台。

特性 k6 实现方式 对SRE的价值
脚本语言 JavaScript (ES6+) 学习成本低,易于与Node.js生态集成
执行引擎 Go (单进程高并发) 单机可模拟数万VU,资源占用极低
指标内置 http_req_duration, iterations, vus 等 开箱即用,无需额外采集
CI/CD 集成 CLI + k6 Cloud / 开源输出 原生支持门禁、阈值、自动化
扩展性 xk6 插件系统 + gRPC/WebSocket 覆盖微服务全协议
核心优势: k6 将压测脚本视为代码(Test as Code),与 GitOps 流程天然对齐。你可以在同一个仓库中管理应用代码和压测脚本,通过 PR 触发自动压测。

1.2 多阶段压测场景的价值

真实生产流量从来不是恒定的。传统的“固定并发数压测”只能反映单一负载点下的系统表现,无法暴露 弹性伸缩、缓存预热、连接池耗尽、GC 抖动 等动态问题。多阶段压测通过定义 多个负载阶段,模拟真实流量的变化曲线。

典型多阶段场景:
  • 预热阶段: 低并发持续 30s,让 JIT、缓存、连接池达到稳态。
  • 爬坡阶段: 线性增加并发,观察系统在负载增长时的响应时间变化。
  • 峰值阶段: 维持目标并发(如 1000 VU)持续 2-5 分钟,验证系统在持续高压下的稳定性。
  • 毛刺阶段: 瞬间增加并发(Spike),测试弹性伸缩和限流降级能力。
  • 恢复阶段: 逐步降低并发,观察系统是否正常释放资源、恢复延迟。
多阶段压测负载曲线示意图 时间 (s) 并发数 (VU) 预热 爬坡 峰值 毛刺 恢复 说明 每个阶段可独立 配置 duration 和 target VU

1.3 SLO 门禁概念

SLO(Service Level Objective,服务等级目标) 是 SRE 体系中的核心量化指标。在压测场景中,SLO 门禁意味着:压测结果必须满足预设的 SLO 阈值,否则视为失败,阻断 CI/CD 流水线。

SRE 术语 压测门禁中的含义 k6 实现方式
SLI (指标) 压测采集的原始数据,如 p95 延迟、错误率 内置指标 + 自定义指标
SLO (目标) 门禁阈值,如 p95 < 500ms, 错误率 < 1% options.thresholds 定义
错误预算 允许的失败次数/时间窗口 通过阈值表达式计算
门禁 (Gate) 压测退出码非0 → 流水线阻断 k6 exit code + CI 判断
关键原则: SLO 门禁不是“压测跑完看报告”,而是在压测执行过程中实时判定。k6 的 thresholds 机制在每个指标采样点都会检查,一旦违反立即标记失败,无需等待压测结束。
SLO门禁在CI/CD流水线中的位置 代码提交 构建 部署测试环境 k6 压测 + SLO 门禁 通过 阻断流水线 SLO门禁是部署前的最后一道防线

1.4 课程目标与前置知识

课程目标

  • 掌握 k6 脚本开发: 从基础 HTTP 请求到复杂业务场景的 JavaScript 脚本编写。
  • 设计多阶段压测场景: 使用 options.stages 定义预热、爬坡、峰值、毛刺、恢复等阶段。
  • 配置 SLO 门禁: 通过 thresholds 定义 p95、p99、错误率、吞吐量等指标阈值。
  • 集成 CI/CD 流水线: 在 GitHub Actions、GitLab CI、Jenkins 中嵌入 k6 门禁。
  • 分析压测报告: 解读 k6 内置报告、自定义输出和 Grafana 仪表盘。

前置知识要求

领域 具体要求 说明
JavaScript 基础 变量、函数、箭头函数、Promise、async/await k6 脚本基于 JS,但不需要 DOM/BOM 知识
HTTP 协议 GET/POST/PUT/DELETE、状态码、请求头、Cookie 理解 RESTful API 的基本交互
Linux 基础 命令行操作、环境变量、进程管理 k6 CLI 在 Linux/macOS/Windows WSL 上运行
SRE 基础概念 SLI/SLO/错误预算、监控、告警 本课程会强化这些概念在压测中的应用
CI/CD 基础 了解流水线、构建、部署的基本流程 门禁集成部分需要理解 CI 触发机制
学习建议: 本课程包含大量实战代码和可运行的 k6 脚本。建议你提前安装 k6(brew install k6 或从 官网 下载),并准备一个可压测的测试 API(如 httpbin.org 或本地启动的简单 Web 服务)。