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),测试弹性伸缩和限流降级能力。
- 恢复阶段: 逐步降低并发,观察系统是否正常释放资源、恢复延迟。
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 机制在每个指标采样点都会检查,一旦违反立即标记失败,无需等待压测结束。
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 服务)。