k6容量压测P95阈值校准与性能基线 - 第2节

2.1 k6 简介:面向开发者的现代压测引擎

k6 是由 Grafana 实验室开源的、以开发者体验为核心设计理念的负载测试工具。与传统的 GUI 驱动工具不同,k6 使用 JavaScript ES6 编写测试脚本,天然适配 CI/CD 流水线,并原生支持 HTTP/1.1、HTTP/2、WebSocket 和 gRPC 协议。其核心引擎基于 Go 语言开发,具备单机高并发能力,资源占用远低于同等负载下的 Java 系工具。

核心设计哲学:脚本即代码(Script as Code)、测试即资产(Test as Asset)、结果即指标(Result as Metric)。

2.1.1 关键特性一览

特性 说明 对压测水位校准的价值
JavaScript 脚本 使用 ES6 语法,支持模块化、异步、自定义函数 可灵活编写 P95 阈值断言逻辑
内置指标系统 自动采集 http_req_duration、http_req_failed、vus 等 直接输出 P95 分位值,无需二次计算
阈值引擎 支持在脚本中声明式定义通过/失败条件 原生支持 P95 < 200ms 等校准规则
CI/CD 集成 命令行运行,返回非零退出码 可嵌入 Jenkins/GitLab CI 实现自动化校准
云/本地双模式 支持本地运行与 Grafana Cloud k6 分布式执行 本地调试阈值,云端放大压测水位

2.2 安装方式:Windows / macOS / Linux

k6 提供多种安装途径,推荐使用包管理器或直接下载二进制文件,无需依赖 Java 或 Python 运行时。

2.2.1 Windows 安装

# 方式一:使用 winget(Windows 10 1709+)
winget install k6

# 方式二:使用 Chocolatey
choco install k6

# 方式三:直接下载 exe(推荐离线环境)
# 访问 https://k6.io/docs/getting-started/installation/ 下载 k6.exe
# 将 k6.exe 放入 PATH 目录,如 C:\Windows\System32\

2.2.2 macOS 安装

# 方式一:Homebrew(推荐)
brew install k6

# 方式二:直接下载二进制
curl -LO https://github.com/grafana/k6/releases/latest/download/k6-latest-macos-amd64.zip
unzip k6-latest-macos-amd64.zip
sudo mv k6 /usr/local/bin/

2.2.3 Linux 安装

# Debian/Ubuntu
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6

# CentOS/RHEL/Fedora
sudo dnf install https://dl.k6.io/rpm/repo.rpm
sudo dnf install k6

# 通用二进制安装
curl -LO https://github.com/grafana/k6/releases/latest/download/k6-latest-linux-amd64.tar.gz
tar -xzf k6-latest-linux-amd64.tar.gz
sudo mv k6 /usr/local/bin/
验证安装:在终端执行 k6 version,若输出类似 k6 v0.54.0 (go1.23.0, linux/amd64) 则安装成功。

2.3 k6 vs JMeter vs Locust:工具选型对比

在压测水位校准场景中,工具的选择直接影响阈值校准的效率和精度。下表从压测水位校准的视角进行对比:

对比维度 k6 JMeter Locust
脚本语言 JavaScript ES6 XML(GUI 配置)/ Groovy Python
P95 原生支持 内置趋势指标,自动输出 P95 需添加聚合监听器或后端分析 需自定义钩子计算分位数
阈值断言 声明式 thresholds,原生支持 需 BeanShell/JSR223 脚本 需自定义事件回调
CI/CD 友好度 命令行原生,退出码清晰 需 CLI 模式,退出码配置复杂 命令行支持,但依赖 Python 环境
资源占用(1000 VU) ~200 MB 内存 ~1.5 GB 内存 ~500 MB 内存
分布式执行 原生 k6 cloud / operator 需配置 Master-Slave 需 Master-Worker 模式
协议扩展 HTTP/WebSocket/gRPC 内置,扩展需 xk6 插件丰富,支持 JDBC/JMS/FTP HTTP 为主,扩展需 Python 库
选型建议:如果团队以 P95 阈值校准 为核心目标,且追求 CI/CD 集成效率,k6 是最优选择。JMeter 适合已有大量 JMX 脚本的遗留系统,Locust 适合 Python 技术栈且需要自定义协议的场景。
k6 vs JMeter vs Locust 架构对比 k6 Go 引擎 + JS 运行时 内置 P95/P99 指标 声明式阈值断言 CI/CD 原生退出码 ~200MB / 1000VU JMeter Java 虚拟机 + XML 需聚合监听器算 P95 BeanShell 脚本断言 CLI 模式退出码复杂 ~1.5GB / 1000VU Locust Python 事件循环 需自定义分位数计算 事件回调断言 依赖 Python 环境 ~500MB / 1000VU

2.4 第一个 k6 脚本:Hello P95 阈值校准

下面编写一个完整的 k6 脚本,包含 HTTP 请求、P95 阈值断言和自定义指标输出。这是后续所有水位校准实验的基础模板。

2.4.1 脚本结构解析

import http from 'k6/http';
import { check, sleep } from 'k6';
import { Rate, Trend } from 'k6/metrics';

// 1. 自定义指标:P95 趋势
const myP95Trend = new Trend('my_p95_duration');

// 2. 自定义指标:错误率
const errorRate = new Rate('my_error_rate');

// 3. 测试配置:VU、时长、阈值
export const options = {
  vus: 10,               // 虚拟用户数
  duration: '30s',       // 压测时长
  thresholds: {
    http_req_duration: ['p(95) < 200'],   // P95 阈值:小于 200ms
    my_p95_duration: ['p(95) < 250'],     // 自定义趋势阈值
    my_error_rate: ['rate < 0.05'],       // 错误率低于 5%
  },
};

// 4. 默认执行函数
export default function () {
  // 发送 GET 请求
  const res = http.get('https://test-api.example.com/api/health');

  // 记录自定义趋势值
  myP95Trend.add(res.timings.duration);

  // 记录错误率
  errorRate.add(res.status !== 200);

  // 断言检查
  check(res, {
    'status is 200': (r) => r.status === 200,
    'response time < 500ms': (r) => r.timings.duration < 500,
  });

  // 思考时间
  sleep(1);
}

2.4.2 运行与结果解读

# 运行脚本
k6 run first-threshold-test.js

# 输出关键片段(示例)
# ✓ http_req_duration.........: avg=145ms  p(95)=198ms
# ✓ my_p95_duration...........: avg=148ms  p(95)=202ms
# ✓ my_error_rate.............: 0.00%   ✓ 0   ✗ 0
# 
# ✓ status is 200................: 100.00% ✓ 300 ✗ 0
# ✓ response time < 500ms.......: 100.00% ✓ 300 ✗ 0
阈值校准要点:当 p(95) < 200 阈值未达标时(如实际 P95=210ms),k6 会以非零退出码退出,CI 流水线可据此判断“水位超标”。后续章节将深入讲解如何根据业务容忍度动态调整这个阈值。
第一个 k6 脚本执行流程 1. 加载 options 配置 2. 初始化 10 个 VU 3. 循环执行 default() 4. 阈值评估 & 退出码 关键指标 • http_req_duration • my_p95_duration • my_error_rate

2.5 本章小结

  • k6 定位:面向 CI/CD 的现代压测工具,原生支持 P95 阈值断言,是水位校准的最佳载体。
  • 安装验证:Windows/macOS/Linux 均支持包管理器或二进制安装,k6 version 确认成功。
  • 工具对比:k6 在 P95 原生支持、资源占用、CI 集成方面显著优于 JMeter 和 Locust。
  • 第一个脚本:包含 options 配置、自定义指标、阈值断言、check 检查,是后续水位校准实验的起点。