K6压测

Administrator
发布于 2025-12-18 / 4 阅读 / 0 评论 / 1 点赞

K6压测

K6 压测

Grafana k6是一个开源的、开发人员友好的、可扩展的负载测试工具。K6允许您防止性能问题并主动提高可靠性。

JavaScript 编写压测脚本,更贴近开发人员使用,支持多种协议,包括 HTTP、WebSocket、Socket.IO、gRPC 等。

支持实时报告、html报告报表、对接 grafana。

安装 K6

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

image-2.png

对接 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

image-awwy.png

image-1.png

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


评论