k6 工具的简介

k6 是用 Go 语言编写的一款高性能的开源的负载测试工具。

具有下面几个特点:

  • K6 嵌入了 JavaScript 运行时,可以使用 JavaScript ES2015/ES6 来编写脚本
  • 强大的 CLI 工具
  • 使用 Checks 和 Thresholds 可以更加轻松的做面向目标的自动化的负载测试

k6 用户通常是开发人员、QA 工程师、SDET 和 SRE,一般使用 k6 来测试 API、微服务和网站的性能和可靠性。

K6 相对于 JMeter 的优势

  • 因为 K6 是 Go 编写的,相对于 JAVA 编写的 JMeter 有性能上的差距,K6 可以只用较少的资源就能达到指定数量的负载。
  • 支持阈值。
  • Javascript 的脚本可以更好的促进协作和版本管理。
  • 资源利用率远远强于 JMeter。
  • 丰富的可视化方案。
  • K6 vs JMeter 详细报告
图片名称

安装

k6 有适用于 Linux、Mac 和 Windows 的软件包,或者可以使用 Docker 容器或独立的二进制文件

Linux

Debian/Ubuntu

sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6

Fedora/CentOS

sudo yum install https://dl.k6.io/rpm/repo.rpm
sudo yum install k6

MacOS

brew install k6

Windows

下载最新的官方安装程序

https://dl.k6.io/msi/k6-latest-amd64.msi

Docker

docker pull grafana/k6

二进制文件

使用 k6 二进制文件,根据不同平台进行下载

https://github.com/grafana/k6/releases

运行 k6 测试

运行一个简单的本地脚本:

将以下内容保存到 test.js

import http from 'k6/http';
import { sleep } from 'k6';

export default function () {
  http.get('https://test.k6.io');
  sleep(1);
}

然后使用以下命令运行 k6

k6 run test.js

增加虚拟的用户,现在运行一个具有 10 个虚拟用户和持续时间 30s 的负载测试

k6 run --vus 10 --duration 30s test.js

也可以将上面的参数写到代码里面,这样运行时就可以不用带参数,直接使用 k6 run test.js

import http from 'k6/http';
import { sleep } from 'k6';

export let options = {
  vus: 10, 
  duration: '30s', 
};

export default function () {
  http.get('https://test.k6.io');
  sleep(1);
}

在测试期间增加/减少 VU 的数量,可以使用 options.stages 配置

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 20 },
    { duration: '1m30s', target: 10 },
    { duration: '20s', target: 0 },
  ],
};

export default function () {
  const res = http.get('https://httpbin.test.k6.io/');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1);
}

更多用法请看文档 https://k6.io/docs/using-k6/scenarios/


执行模式

k6 支持三种执行模式来运行 k6 测试:本地、分布式和云。

1. 本地:测试执行完全发生在单个机器、容器或 CI 服务器上

k6 run script.js

2. 分布式:测试执行发布在 k8s 集群中

kubectl apply -f /path/k6-resource.yaml

3. Cloud:测试执行发生在 k6 Cloud 上

k6 cloud script.js

一个 k6 测试的生命周期


输出结果

1. 默认将结果打印到标准输出

k6 结果 - 控制台/标准输出

测试结束摘要显示结果指标的汇总统计值,包括:

  • 中位数和平均值
  • 最小值和最大值
  • p90、p95 和 p99 值

可以通过参数 summary-trend-stats 配置显示指定的统计值

k6 run --summary-trend-stats="avg,min,max" test.js

2. 也可以将测试结果输出到 JSON 或 CSV 文件,甚至传输到外部服务

k6 run test.js --out csv=test.csv --out json=test.json --out influxdb=http://localhost:8086/k6

下面列举了所有输出方式

常见指标说明

指标类型

指标类型描述
Counter计数器,对值进行累加
Gauge最小值、最大值和最后一个值
Rate百分比
Trend最小值、最大值、平均值和百分位数的统计数据指标

如下图右边的这些指标值代表的含义为

avg平均值
min最小值
med中间值
max最大值
p(90)例如 p(90) < 400,百分之 90 的请求在 400ms 内
p(95)例如 p(95) < 400,百分之 95 的请求在 400ms 内

默认的内置指标

名称类型描述
vueGauge当前活动的虚拟用户数
vue_maxGauge虚拟用户的最大数量
iterationsCounter脚本中的函数被执行的次数
data_receivedCounter接收到的数据量大小
data_sentCounter发送的数据量大小
iteration_durationTrend完成默认/主函数的一次完整迭代所花费的时间
checksRatechecks 项的成功率

HTTP 特有的指标

名称类型描述
http_reqsCounter总请求数量
http_req_blockedTrend在发起请求之前被阻塞的时间
http_req_connectingTrend建立到远程主机的TCP连接所花费的时间
http_req_tls_handshakingTrend与远程主机握手建立TLS会话所花费的时间
http_req_sendingTrend将数据发送到远程主机所花费的时间
http_req_waitingTrend等待远程主机响应所花费的时间
http_req_receivingTrend从远程主机接收响应数据所花费的时间
http_req_durationTrend请求的总时间。
它等于 http_req_sending
+ http_req_waiting
+ http_req_receiving
即远程服务器处理请求和响应花了多长时间,
而没有初始DNS查找/连接时间
http_req_failedRate失败请求率

相关命令

k6 run exam.js      执行js文件的测试
k6 pause     暂停测试执行,暂停所有VU
k6 resume     取消暂停k6,导致所有活动的VU恢复执行
k6 scale     更改活动VU的数量(或允许的最大VU数量)
k6 stats     报告当前已收集的统计信息
k6 status     报告测试的一般状态

相关名词

vus           当前并发数
vus_max         虚拟用户的最大数量
rps           每秒并发数
duration         持续运行时间
checks        断言成功率
data_sent        发送的数据量
data_received     接收到的数据量
iterations         测试中的vu执行js脚本(default函数)的总次数
iteration_duration      完成默认/主函数的完整迭代所花费的时间
dropped_iterations    由于缺少vu(对于达到率执行程序)或缺少时间(由于基于迭代的执行程序中maxDuration过期)而无法启动的迭代次数

测试种类

(smoke test) 冒烟测试, 验证系统的最小负载,而不会出现任何问题
(load tet)负载测试, 主要根据并发用户以及每秒请求评估系统性能
  (stress test,spike test) 压力测试&&峰值测试,评估系统极限以及极端条件下的稳定性
  (soak test)浸泡测试,系统长时间稳定性测试

  1. 冒烟测试是常规负载测试,配置为最小负载。每次编写新脚本或修改现有脚本时,您都希望运行冒烟测试作为完整性检查。
  2. 负载测试主要关注在并发用户数或每秒请求数方面评估系统的当前性能。用于确定系统在正常和峰值条件下的行为。
  3. 负载测试主要与评估系统的性能而言,压力测试的目的是在重负载下,以评估该系统的可用性和稳定性。
  4. 尖峰测试是一种压力测试,它会立即以极端的负载激增淹没系统。尖峰测试是压力测试的一种变体,但它不会逐渐增加负载。相反,它会在很短的时间内达到极端负载。
  5. 浸泡测试揭示了由于系统长时间处于压力下而导致的性能和可靠性问题。而负载测试主要与性能评估而言,和 压力测试涉及在极端条件下系统稳定,浸泡测试在一段较长的时间涉及可靠性。

参考资料:

https://k6.io/docs/