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
输出结果
1. 默认将结果打印到标准输出
测试结束摘要显示结果指标的汇总统计值,包括:
- 中位数和平均值
- 最小值和最大值
- 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
下面列举了所有输出方式
- Amazon CloudWatch
- Cloud
- CSV
- Datadog
- Grafana Cloud / Prometheus
- InfluxDB
- JSON
- Netdata
- New Relic
- Prometheus
- TimescaleDB
- StatsD
常见指标说明
指标类型
指标类型 | 描述 |
Counter | 计数器,对值进行累加 |
Gauge | 最小值、最大值和最后一个值 |
Rate | 百分比 |
Trend | 最小值、最大值、平均值和百分位数的统计数据指标 |
如下图右边的这些指标值代表的含义为
avg | 平均值 |
min | 最小值 |
med | 中间值 |
max | 最大值 |
p(90) | 例如 p(90) < 400,百分之 90 的请求在 400ms 内 |
p(95) | 例如 p(95) < 400,百分之 95 的请求在 400ms 内 |
默认的内置指标
名称 | 类型 | 描述 |
vue | Gauge | 当前活动的虚拟用户数 |
vue_max | Gauge | 虚拟用户的最大数量 |
iterations | Counter | 脚本中的函数被执行的次数 |
data_received | Counter | 接收到的数据量大小 |
data_sent | Counter | 发送的数据量大小 |
iteration_duration | Trend | 完成默认/主函数的一次完整迭代所花费的时间 |
checks | Rate | checks 项的成功率 |
HTTP 特有的指标
名称 | 类型 | 描述 |
http_reqs | Counter | 总请求数量 |
http_req_blocked | Trend | 在发起请求之前被阻塞的时间 |
http_req_connecting | Trend | 建立到远程主机的TCP连接所花费的时间 |
http_req_tls_handshaking | Trend | 与远程主机握手建立TLS会话所花费的时间 |
http_req_sending | Trend | 将数据发送到远程主机所花费的时间 |
http_req_waiting | Trend | 等待远程主机响应所花费的时间 |
http_req_receiving | Trend | 从远程主机接收响应数据所花费的时间 |
http_req_duration | Trend | 请求的总时间。 它等于 http_req_sending + http_req_waiting + http_req_receiving 即远程服务器处理请求和响应花了多长时间, 而没有初始DNS查找/连接时间 |
http_req_failed | Rate | 失败请求率 |
相关命令
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)浸泡测试,系统长时间稳定性测试
- 冒烟测试是常规负载测试,配置为最小负载。每次编写新脚本或修改现有脚本时,您都希望运行冒烟测试作为完整性检查。
- 负载测试主要关注在并发用户数或每秒请求数方面评估系统的当前性能。用于确定系统在正常和峰值条件下的行为。
- 负载测试主要与评估系统的性能而言,压力测试的目的是在重负载下,以评估该系统的可用性和稳定性。
- 尖峰测试是一种压力测试,它会立即以极端的负载激增淹没系统。尖峰测试是压力测试的一种变体,但它不会逐渐增加负载。相反,它会在很短的时间内达到极端负载。
- 浸泡测试揭示了由于系统长时间处于压力下而导致的性能和可靠性问题。而负载测试主要与性能评估而言,和 压力测试涉及在极端条件下系统稳定,浸泡测试在一段较长的时间涉及可靠性。
参考资料: