Grafana K6 现代负载测试入门
Grafana K6 是一款代码优先的开源负载测试工具,用 JavaScript 编写测试脚本。本文讲解 K6 的安装、脚本结构、负载曲线配置、用户旅程建模与结果分析方法。
本文依据官方文档整理,未执行运行验证或性能基准。代码片段展示局部用法,业务函数、数据和环境需按项目补齐;版本与配置以所引文档为准。
直接回答:Grafana K6 是一款面向开发者与测试工程师的开源负载测试工具,最大的特点是用 JavaScript 编写测试脚本(代码优先),可以轻松模拟成百上千虚拟用户对系统施压,并输出丰富的性能指标。 它 2021 年被 Grafana Labs 收购后,与 Grafana 生态的可视化能力深度整合。
为什么是 K6
传统负载测试工具要么靠 GUI 点点点(脚本难维护、难进版本库),要么配置冗长。K6 把测试脚本当普通代码对待:可以进 Git、可以 code review、可以在 CI 里跑,这对工程团队来说是根本性的体验差异。
安装
# macOS
brew install k6
# Docker
docker run --rm -i grafana/k6 run - < script.js
第一个脚本
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
vus: 20, // 20 个虚拟用户
duration: '30s', // 持续 30 秒
thresholds: {
http_req_failed: ['rate<0.01'],
http_req_duration: ['p(95)<500'],
checks: ['rate>0.99'],
},
};
export default function () {
const res = http.get('https://api.example.com/users');
check(res, {
'状态码是 200': (r) => r.status === 200,
'响应小于 500ms': (r) => r.timings.duration < 500,
});
sleep(1);
}
check 只记录成功率,单独失败不会使进程以失败码退出;CI 门禁需设置 thresholds。这里的数值仅演示语法,不是通用SLO。仅压测自己拥有或获授权的隔离环境,先以少量用户验证并设资源/费用/错误率中止阈值。订单用例必须走测试订单和支付沙箱。
负载曲线:不只是"固定并发"
K6 的 stages 可以刻画真实的压力变化:
export const options = {
stages: [
{ duration: '2m', target: 100 }, // 2 分钟内爬到 100 并发
{ duration: '5m', target: 100 }, // 保持 5 分钟
{ duration: '2m', target: 0 }, // 2 分钟内降到 0
],
};
由此可组合出阶梯压测、尖峰测试(spike)、浸泡测试(soak)等常见模式。
建模真实用户旅程
把脚本写成"用户行为流"而不是孤立请求,结果才有业务意义:
export default function () {
// 登录
let res = http.post('https://api.example.com/login', { user: 'demo', pass: 'demo' });
const token = res.json('token');
const headers = { headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' } };
// 浏览商品 → 下单
http.get('https://api.example.com/products', headers);
http.post('https://api.example.com/orders', JSON.stringify({ sku: 'A1', qty: 1 }), headers);
sleep(2);
}
结果怎么看
K6 默认输出一组核心指标:
| 指标 | 含义 |
|---|---|
http_req_duration |
响应时间分布(关注 p90/p95,而不是平均值) |
http_req_failed |
失败请求比例 |
vus / iterations |
实际并发与迭代次数 |
checks |
自定义断言通过率 |
按对应输出插件配置结果后端,例如 Prometheus remote write;Grafana 是可视化入口,并非任意 --out 都能直接写入的时序存储。
记录每轮压测的起止时间、目标版本与测试标识,将延迟上升区间与应用日志、资源水位对齐。需要进一步拆分服务端耗时时,可为受测应用埋点并按 OpenTelemetry 接入观测云,检查同一窗口的下游 Span;这与 k6 结果输出是两条独立的数据路径。
常见问题(FAQ)
Q:K6 和 JMeter、Locust 怎么选?
A:可按脚本语言、协议支持与团队经验比较:k6 使用其自己的 JS/TS 运行环境,并不等同 Node.js;Locust 使用 Python;JMeter 可用非 GUI 模式执行负载。性能须按同一场景评估。
Q:K6 脚本里的 sleep 是必须的吗?
A:取决于负载模型。模拟用户会话时使用思考时间;arrival-rate executor 已控制迭代到达率,通常不在迭代末额外 sleep。VU 数不等于固定 RPS,施压机也可能成为瓶颈。
Q:压测环境怎么选?
A:尽量用与生产同构的预发环境;直接压生产需严格评估风险,并做好限流兜底与随时中止预案。
官方参考
资料核对日期:2026-09-29。