K6 压测
Grafana k6是一个开源的、开发人员友好的、可扩展的负载测试工具。K6允许您防止性能问题并主动提高可靠性。
JavaScript 编写压测脚本,更贴近开发人员使用,支持多种协议,包括 HTTP、WebSocket、Socket.IO、gRPC 等。
支持实时报告、html报告报表、对接 grafana。
安装 K6
# 解压 k6 到 /usr/local 目录下
tar -xf k6-v1.4.2-linux-amd64.tar.gz -C /usr/local/
# 配置环境变量
vi /etc/profile
export PATH=$PATH:/usr/local/k6-v1.4.2-linux-amd64
#
source /etc/profile
编写第一个脚本
使用 k6 包,创建一个简单的压测脚本
import http from 'k6/http';
export default function () {
http.get('https://test.k6.io');
}
运行 k6 压测
k6 run demo.js
测试结果输出如下:
root@PC-MP2R2CJW:~/k6# k6 run demo.js
/\ Grafana /‾‾/
/\ / \ |\ __ / /
/ \/ \ | |/ / / ‾‾\
/ \ | ( | (‾) |
/ __________ \ |_|\_\ \_____/
execution: local
script: demo.js
output: -
scenarios: (100.00%) 1 scenario, 1 max VUs, 10m30s max duration (incl. graceful stop):
* default: 1 iterations for each of 1 VUs (maxDuration: 10m0s, gracefulStop: 30s)
█ TOTAL RESULTS
HTTP
http_req_duration..............: avg=710.59ms min=486.71ms med=710.59ms max=934.47ms p(90)=889.69ms p(95)=912.08ms
{ expected_response:true }...: avg=710.59ms min=486.71ms med=710.59ms max=934.47ms p(90)=889.69ms p(95)=912.08ms
http_req_failed................: 0.00% 0 out of 2
http_reqs......................: 2 0.420954/s
EXECUTION
iteration_duration.............: avg=4.75s min=4.75s med=4.75s max=4.75s p(90)=4.75s p(95)=4.75s
iterations.....................: 1 0.210477/s
vus............................: 1 min=1 max=1
vus_max........................: 1 min=1 max=1
NETWORK
data_received..................: 13 kB 2.8 kB/s
data_sent......................: 3.6 kB 750 B/s
running (00m04.8s), 0/1 VUs, 1 complete and 0 interrupted iterations
default ✓ [======================================] 1 VUs 00m04.8s/10m0s 1/1 iters, 1 per VU
包含以下信息:
execution: 执行信息,包括开始时间、结束时间、持续时间、VU 数量、迭代次数等。
scenarios: 场景信息,包括场景名称、VU 数量、迭代次数、持续时间、平均响应时间、吞吐量等。
http_reqs: HTTP 请求信息,包括请求名称、请求数量、失败数量、平均响应时间、吞吐量等。
Options 常用选项
vus:同时运行的虚拟用户数量,需要和 duration 搭配使用
export const options = {
vus: 10,
duration: '10s'
}
duration:指定测试运行的总持续时间,与 vus 选项一起使用
export const options = {
vus: 10,
duration: '10s'
}
batch:同时调用的最大连接总数,k6支持同时压多个 api,bacth 为同时压的 api 数量
export const options = {
batch: 15
}
测试用例
模块解释:
- http:k6 的 HTTP 模块,用来发请求
- check:验证响应是否符合预期,比如状态码、返回值等
Options解释:
- executor: 'ramping-arrival-rate'
- 按 QPS(每秒请求数) 来控制压力,而不是固定 VU
- 适合测试系统吞吐能力和极限
- startRate: 100
- 起始 QPS = 100
- 脚本开始时,每秒发 100 个请求
- timeUnit: '1s'
- QPS 的单位是 1 秒
- 意味着 startRate / target 都是“每秒多少请求”
- preAllocatedVUs: 200
- 提前分配 200 个虚拟用户
- 避免 ramp 过程中动态创建 VU 抖动
- maxVUs: 20000
- 允许 k6 动态创建 VU 最多 2 万个
- 防止本机资源耗尽
- stages: [{ duration: '1m', target: 700 }]
- 线性 ramp
- 1 分钟内,把 QPS 从 100 平滑增加到 700
- 每秒大约增加 10 QPS
这个脚本是在做“1 分钟内 QPS 从 100 → 700 的线性增长压力测试”,每个请求都会检查返回码是否 200,VU 会根据需要动态分配,最多不超过 2 万个。
import http from 'k6/http';
import { check } from 'k6';
export const options = {
scenarios: {
ramp_qps: {
executor: 'ramping-arrival-rate',
startRate: 100, // 起始 100 QPS
timeUnit: '1s',
preAllocatedVUs: 200,
maxVUs: 20000,
stages: [
{ duration: '1m', target: 700 }, // 1 分钟涨到 700 QPS
],
},
},
};
export default function () {
const res = http.get('https://test.k6.io');
check(res, {
'status is 200': (r) => r.status === 200,
});
}
运行方式
# K6_WEB_DASHBOARD 开启压测是前端分析图
# K6_WEB_DASHBOARD_EXPORT 压测完成后生成报告
# --out influxdb=http://172.29.243.48:8086/admin 开启标准输出到 influxdb
K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=html-report.html k6 run demo.js --out influxdb=http://172.29.243.48:8086/admin

对接 grafana
k6 对接 grafana,需要把数据吐到 influxdb,grafana 对接 influxdb 展示
influxdb 现在有 1.0、2.0、3.0 版本,2.0 需要 token认证,并且 k6 要使用 xk6 版本,所以要选择 influxdb 1.0
部署 influxdb、grafana
docker pull influxdb:1.12.2
docker run -dit -p 8086:8086 --name influxdb influxdb:1.12.2
docker pull grafana/grafana
docker run -d -p 3000:3000 grafana/grafana
grafana 选择对接 influxdb


之后可以选择导入 k6 官方的大屏模板 2587