2. k6 安装与基础使用

本章将带你完成 k6 的安装、编写第一个压测脚本,并学会运行与查看结果。k6 支持 Windows、macOS 和 Linux 三大平台,安装方式灵活,推荐使用包管理器或官方安装脚本。

2.1 安装 k6

k6 是一个基于 Go 语言开发的单二进制文件工具,安装过程简洁。以下为各平台的推荐安装方式:

平台 安装方式 命令 / 步骤
Windows Chocolatey / 官方 MSI choco install k6 或下载 .msi 安装包
macOS Homebrew brew install k6
Linux (Debian/Ubuntu) APT 仓库 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
Linux (通用) 官方安装脚本 curl -s https://dl.k6.io/install.sh | sudo bash
Docker 容器运行 docker pull grafana/k6
验证安装: 在终端执行 k6 version,若输出类似 k6 v0.54.0 (go1.23.0, linux/amd64) 的信息,则安装成功。

2.2 第一个压测脚本

k6 使用 JavaScript(ES6+)编写测试脚本,核心是定义 虚拟用户(VU) 的行为。以下是一个最简脚本,用于对示例 API 发起 GET 请求:

// first-test.js
import http from 'k6/http';
import { sleep } from 'k6';

export default function () {
  // 发送 HTTP GET 请求
  let res = http.get('https://test.k6.io');

  // 检查响应状态码是否为 200
  check(res, {
    'status is 200': (r) => r.status === 200,
  });

  // 模拟用户思考时间(1~3 秒随机)
  sleep(Math.random() * 2 + 1);
}

脚本结构说明:

  • import:引入 k6 内置模块,如 http、check、sleep。
  • export default function:每个 VU 循环执行的入口函数。
  • check():断言函数,用于验证响应是否符合预期。
  • sleep():模拟用户等待时间,使压测更接近真实场景。
关键概念: k6 脚本中的 __VU 和 __ITER 是内置变量,分别代表当前虚拟用户编号和迭代次数,可在脚本中直接使用。

2.3 运行与查看结果

运行脚本使用 k6 run 命令,并通过参数控制并发与时长。以下为常用运行方式:

# 默认运行(1 个 VU,1 次迭代)
k6 run first-test.js

# 指定 10 个 VU,持续 30 秒
k6 run --vus 10 --duration 30s first-test.js

# 分阶段递增并发
k6 run --stage 5s:20,10s:50,20s:30 first-test.js

运行结束后,终端会输出详细报告,包含以下核心指标:

指标 含义 示例值
http_req_duration 请求总耗时(中位数、p95、p99) avg=120ms, p95=250ms
http_req_failed 请求失败率 0.00%
vus 当前活跃虚拟用户数 10
iterations 总迭代次数 1500
data_received 接收数据量 12 MB
注意: 压测目标请使用自己控制的测试环境,避免对公共 API 造成压力。示例中的 test.k6.io 是 k6 官方提供的演示站点,仅用于学习。

2.4 k6 压测执行流程

下图展示了从脚本编写到结果输出的完整执行链路:

k6 压测执行流程 JS 脚本解析 VU 初始化 调度器 执行循环 指标收集 报告输出 说明:调度器根据 --vus 和 --duration 参数控制 VU 的启动与停止,每个 VU 独立执行 default 函数。 指标收集器在每次迭代结束后汇总数据,最终生成终端报告或输出到 JSON/CSV。

2.5 常用运行参数

k6 提供了丰富的 CLI 参数,用于控制压测行为。以下为高频使用参数:

参数 简写 说明 示例
--vus -u 并发虚拟用户数 --vus 20
--duration -d 压测持续时间 --duration 60s
--iterations -i 总迭代次数(与 duration 互斥) --iterations 1000
--stage — 分阶段压力模式 --stage 10s:20,30s:50
--out -o 输出结果到文件或服务 --out json=result.json
--http-debug — 打印 HTTP 请求/响应详情 --http-debug
进阶提示: 使用 --out influxdb=http://localhost:8086/k6 可将实时指标写入 InfluxDB,配合 Grafana 构建可视化监控面板。

2.6 结果解读与常见问题

终端报告中的 http_req_duration 是衡量系统性能的核心指标。重点关注 p95 和 p99 分位值,它们反映了绝大多数用户的体验。若 p95 超过 500ms,通常需要优化目标服务或调整压测策略。

常见问题排查:

  • 请求失败率高:检查目标服务是否过载、网络是否通畅、脚本中 URL 是否正确。
  • VU 数未达到预期:确认系统资源(CPU/内存/文件描述符)是否充足,k6 本身对资源消耗较低。
  • 脚本语法错误:使用 k6 run --verbose 查看详细错误堆栈。
最佳实践: 每次压测前先以少量 VU(如 5 个)运行 10 秒,验证脚本逻辑和指标输出正常,再逐步增加并发。