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 C5AD17C747E3415A3642D57D77C6C491D6AC1D69echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.listsudo 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 压测执行流程
下图展示了从脚本编写到结果输出的完整执行链路:
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 秒,验证脚本逻辑和指标输出正常,再逐步增加并发。