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。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台