k6 背后的故事 2016 年 8 月,k6 在 GitHub 上发布了第一个版本,至此,一个出色的开源负载压测工具进入了人们的视野。 2021 年的 6 月,对于 Grafana 和 k6 来讲是个大日子,Grafana Labs 收购了 k6 。 而事实上, Grafana 与 k6 的缘分还要追溯到更早的 2 年前。 就使用门槛来讲,JS 要比 Scala 要低很多; k6 - k6 最初是由 SaaS 服务 Load Impact 的几名员工开发维护。 图 3 ,3 种热门工具比一比 执行效果 或者这样: 安装 k6 k6 是用 Go 语言开发的,要安装 k6 步骤很简单,只要直接在其 GitHub 的 Release 页面下载二进制文件即可。 /k6-v0.35.0-linux-amd64/k6 ~/bin/k6 (MoeLove) ➜ k6 version k6 v0.35.0 (2021-11-17T09:53:18+0000/1c44b2d
为什么选择k6 在得知需要做性能测试后,我们就开始针对性能测试做了一番调研,在阅读了一些性能测试工具对比的文章后,最终挑选了k6,locust和Gatling做了进一步对比,下面是对比的结果。 对我们来说,k6的优势在于: k6支持TypeScript,由于项目上已经有TypeScript使用经验,因此该工具学习成本相对更少 k6本身支持metrics的输出,可以满足大部分metrics的需求 ,有需要还可以进行自定义 k6官方支持与多种CI工具,数据可视化系统的集成,开箱即用 Gatling支持Scala/Java/Kotlin,项目上没有使用相关的技术栈,需要和客户申请,成本高于k6 动手写第一个 的executor选择 k6提供了多个executor,不同的executor会以不同的方式去执行测试。 让性能测试在CI上跑起来-集成TeamCity k6官方提供了目前主流CI工具的How to文档,非常容易上手。
关于 k6 k6 是用 Go 语言开发,使用 JavaScript 作为驱动脚本来进行负载测试的工具。其作为后起之秀,拥有灵活性高、并发能力强等特点。 呆猫 安装 k6 Windows windows 中 winget 是系统自带,但是速度堪忧;所以 windows 我建议使用 choco 安装 k6,但是 choco 是需要我们手动安装的。 choco install k6 # 或者 winget install k6 MacOS brew install k6 Linux # apt系 sudo apt-key adv --keyserver https://dl.k6.io/rpm/repo.rpm sudo yum install k6 查看 k6 安装结果 k6 测试脚本 安装好了 k6,我们就可以开始开发测试脚本了。 这个例子我们计划对 k6 官方测试接口进行负载测试。
前言 前面我已经出了一篇 K6负载测试工具初探的文章,今天我们继续来深入了解 K6 的高级用法。 import http from 'k6/http'; // k6配置 export const options = { // 忽略https证书 insecureSkipTLSVerify 自定义失败信息: import http from 'k6/http'; import { check, fail } from 'k6'; export default function () { 示例代码: import http from 'k6/http'; import { check } from 'k6'; // k6配置 export const options = { / 但是我没找到 K6 如何定义接口权重。
脚本准备 K6 脚本内容如旧文:性能框架哪家强—JMeter、K6、locust、FunTester横向对比。 脚本内容如旧文:性能框架哪家强—JMeter、K6、locust、FunTester横向对比。 这里K6测试的QPS偏低,有点小意外。「FunTester」这里消耗内存比较多,还能接受。 这里「K6」测试框架测出来的QPS大概是其他两个框架的一半。 104375 1 测试完成,这轮测试「K6」表现有点逊色,应该CPU已经瓶颈了,导致测试QPS相比偏低。
安装完成后在命令窗口输入:K6,检测是否安装成功。出现如下图就是成功了: ? 执行脚本的只需要在输入:k6 run +脚本名。如下图: ? 执行完成后会在界面给出测试结果: ? 断言设置 K6的断言个人认为是比较简洁的,导入check()后即可,而且一个check()可以添加多个断言。 ? 设置并发 k6中有两种设置并发、运行时间的方法。 第一种是在命令行内: ? K6还有支持更多的条件设置,请阅读官网文档。 cookie设置 k6有多种的cookie的写法,如图是能够快速入手的写法: ? 测试结果 ? k6 pause -暂停测试执行,暂停所有VU k6 resume -取消暂停k6,导致所有活动的VU恢复执行 k6 scale -更改活动VU的数量(或允许的最大VU数量) k6 stats -报告当前已收集的统计信息 k6 status -报告测试的一般状态
k6介绍 k6是一款使用go语言编写的开源测试工具,支持用户编写测试脚本,解决了JMeter不易代码化的缺点。 新建一个放置k6的文件夹 配置并安装k6 输入vim k6-deployment.yaml 在里面详细写出对k6的配置 apiVersion: apps/v1 kind: Deployment metadata : name: k6-deployment labels: app: k6 spec: replicas: 1 selector: matchLabels: app: k6 template: metadata: labels: app: k6 spec: containers: - name: k6 image 接着在k8s上部署k6,namespace的名字自己定义,kubectl apply -f k6-deployment.yaml -n k6 此时它会显示 deployment.apps
:https://github.com/grafana/k6 K6 介绍 K6 是一个基于 Go 语言实现的一个负载测试工具,其官网描述为: The best developer experience ,需要提前注册 K6 账号并登录 k6 login [flags] k6 cloud [flags] # 检查脚本 k6 inspect [file] [flags] # 执行 load test( 本地) k6 run [flags] # 暂停测试 k6 pause [flags] # 恢复测试 k6 resume [flags] # 扩展测试 k6 scale [flags] # 显示测试状态 k6 stats [flags] # 显示版本 k6 version [flags] # 模拟10个虚拟用户(VU),连续压测30秒: k6 run --vus 10 --duration 30s 集成 K6 Cloud 此外,我们也可以将脚本上传至云端来进行测试,如下所示: k6 login cloud -t <your token> k6 cloud sample-test.js 类似的结果如下图所示
经过了之前的铺垫:性能测试框架对比初探,目前留下来的几个测试框架就是「JMeter」、「K6」、「locust」和「FunTester」。 虽然「k6」是用golang写的,但是测试脚本语言是JavaScript,内容如下: import http from 'k6/http'; import { sleep } from 'k6'; FunTester用了两倍多一点,k6一直比较稳定的低,一直在50以内。这一点我以后得研究研究继续优化。 ,K6消耗的CPU也逐渐降下来了,与「FunTester」很接近了,说明此时差不多应该是到了性能拐点附近。 200线程 测试结果: 框架 CPU 内存 QPS RT K6 239.97 240.4 15354 12.94 FunTester 431.52 427.9 14940 13 这里可以看出K6的优势还是非常明显的
[K6 在 Nebula Graph 上的压测实践] 背景 对于数据库来说,性能测试是一个非常频繁的事情。优化查询引擎的规则,调整存储引擎的参数等,都需要通过性能测试,查看系统在不同场景下的影响。 工具 nebula-ansible 用于部署 nebula 服务 nebula-importer 用于导入数据到 nebula 集群中 k6-plugin k6 压测工具,里面使用 go 客户端向 nebula # 编译 nebula-importer 和 k6 . [图片] [图片] 执行压测 python3 run.py stress run 会根据 scenarios 里的代码,自动渲染出 js 文件,然后使用 k6 压测所有场景。 使用 k6 作为压测负载工具,二进制相比 Jmeter 更方便,而且因为 k6 底层使用 Golang 的 goroutine,相比 Jmeter 使用更少的资源。
下面我们讲另外一个新式的压力测试工具k6。 什么是k6 K6是一款现代负载测试工具,建立在我们在负载和性能测试行业多年的经验基础上。 K6 相对于 JMeter 的优势 因为 K6是Go编写的,相对于JAVA 编写的 JMeter 有性能上的差距,K6 可以只用较少的资源就能达到指定数量的负载。 内置的HAR转换器:将浏览器会话记录为.har文件,并直接转换为k6脚本 灵活的指标存储和可视化:fluxdb (+Grafana), JSON或k6云 云执行和分布式测试(目前只在k6云管理的基础设施上进行 ,计划在不久的将来在k6上进行本地分布式执行!) k6 Windows choco install k6 winget install k6 Docker docker pull grafana/k6 举个例子 新建一个 test.js 文件 Get
消耗的资源 JMeter远比k6要更消耗资源,它往往需要多个负载生成器来生成负载,并且它需要更高的内存。在比较中,JMeter占用了760 MB的内存,而k6占用了256 MB的内存。 ——来自Comparing k6 and JMeter for load testing 2. 产生的并发 根据文档来看,JMeter平均可以达到1000左右的并发,如果需要更高的并发则需要设置分布式的JMeter测试;但是如果给k6相同的资源,k6可以产生数以万计的并发。 这有几个原因,一是因为k6所占用的内存更低,所以它可以运行更多并发并产生更高的负载,二是k6处理硬件资源的方式与其他负载工具不同,单个k6进程可以有效地利用所有CPU内核;总的来说,k6的单个实例可以产生 Comparing k6 and JMeter for load testing
api,向api-server发起http请求,查找指定pod的信息返回 部署情况说明 今天的压测所涉及的服务和应用,它们的部署情况如下图所示,共两台Ubuntu电脑,电脑1用于执行压测,上面部署了k6 压测第二个接口(远程访问api-server的方式) 这里用到k6作为压测工具,您也可以选择自己熟悉的工具来用,选择k6是因为足够简单省事儿,如果您已经装好了docker,执行压测只要一行命令就行了 首先编写第二个接口的压测脚本 ,也就是压测client-go远程访问api-server查询对象的性能,新建文件remote.js,内容如下,可见非常简单,就是发请求检查返回码和返回body import http from 'k6 \ // 镜像名 run \ // 容器中执行的命令,即启动k6的命令 --duration 60s \ // k6的参数:压测时长60秒 --vus 10 \ // k6的参数:并发数为 脚本,名为indexer.js import http from 'k6/http'; import { check } from 'k6'; export default function () {
":"idd:ast:alldata","data":[{"k0":"2018-05-19","k1":201970,"k2":21732,"k3":9.29,"k4":7320,"k5":244,"k6 194650,"k8":21488,"k9":9.06},{"k0":"2018-05-18","k1":191160,"k2":20286,"k3":9.42,"k4":7240,"k5":231,"k6 183920,"k8":20055,"k9":9.17},{"k0":"2018-05-17","k1":192805,"k2":20452,"k3":9.43,"k4":6375,"k5":268,"k6 186430,"k8":20184,"k9":9.24},{"k0":"2018-05-16","k1":191955,"k2":20131,"k3":9.54,"k4":4765,"k5":198,"k6 187190,"k8":19933,"k9":9.39},{"k0":"2018-05-15","k1":186710,"k2":19245,"k3":9.7,"k4":3065,"k5":188,"k6
一、前言 开发接口以后,对性能有要求的 接口,需要做 性能压力测试 常见免费的如:经典的 ab,性能不太好的 jmeter、siege(有时候都怀疑程序性能不行了),另介绍 hey、k6、vegeta、 并发数、z 测试时长 hey -c 50 -z 5s http://www.a.com/aundefined图片 3. jmeter Java语言开发,适用于 多 平台 优劣:性能较差,跨平台 4. k6 :load testing tool, using Go and JS GO语言开发,适用于 Linux、Mac、Windows 平台import http from "k6/http"; import { check, sleep } from "k6"; // Test configuration export const options = { }; export default function 性能较高,跨平台,支持 请求、统计结果 校验,非常适合开发人员(复制略作调整即可)做接口自动化测试 参数:u 并发数、d 测试时长 需用 JavaScript 脚本 定义测试内容(如保存为 k6.js),k6
五大主流服务器性能测试工具功能详解当前主流的服务器性能测试工具可分为**负载生成、压力测试、全链路分析**三类,其核心功能与技术特点对比如下表所示:|对比维度|优测|JMeter|LoadRunner|Gatling|k6 **结论:工具选型需匹配业务场景——高并发选优测/LoadRunner,灵活开发选JMeter/Gatling,云原生优先考虑k6。 LoadRunner,其毫秒级延迟监控与故障注入功能可验证系统极限承载能力;2.接口与微服务测试:JMeter和Gatling更合适,支持多协议(如gRPC/MQTT)和异步脚本编写;3.DevOps持续集成:k6 决策建议:中小团队可从JMeter或k6入手,中大型企业建议试用优测或LoadRunner验证复杂场景。**结论:没有“万能工具”,只有“最适配方案”——先定义需求,再对比功能与成本。 A:优先选择k6或Gatling——k6基于JavaScript且无依赖部署,适合容器化环境;Gatling的Scala脚本执行效率高(单节点可模拟万级并发),两者均与Kubernetes等云原生技术深度集成
// string(3) "kkk" // [2]=> // string(3) "666" // [3]=> // string(2) "k6 // string(3) "666" // ["password"]=> // string(3) "666" // [3]=> // string(2) "k6 " // ["salt"]=> // string(2) "k6" // } var_dump($result->fetch_array(MYSQLI_ASSOC)); // array string(3) "kkk" // ["password"]=> // string(3) "666" // ["salt"]=> // string(2) "k6 [1]=> // string(3) "kkk" // [2]=> // string(3) "666" // [3]=> // string(2) "k6
'k5') >>> test {'k2': 'v2', 'k4': 'v4', 'k3': 'v3', 'k5': None, 'k1': 'v1'} >>> test.setdefault('k6 ',['k6']) ['k6'] >>> test {'k2': 'v2', 'k4': 'v4', 'k5': None, 'k1': 'v1', 'k6': ['k6'], 'k3': 'v3
作者:HelloGitHub-小鱼干 当你看到实用为本周的关键词时,就应该知道本周的 GitHub 热点霸榜的基本为高星老项目,例如:知名的性能测试工具 k6,让你能在预生产环境和 QA 环境中以高负载运行测试 GitHub 地址→https://github.com/GoogleLLP/SuperMarket 2.5 性能测试工具:k6 本周 star 增长数:1850+ k6 是高性能的负载测试工具,可在预生产和 内置 har 转换器:记录浏览器会话为 .har 文件,并直接将它们转换为 k6 脚本 灵活的度量存储和可视化:InfluxDB (+Grafana), JSON 或 k6 云 GitHub 地址→https ://github.com/loadimpact/k6 2.6 小型深度学习框架:tinygrad 本周 star 增长数:1250+ tinygrad 是美国知名黑客 George Hotz 开源的小型深度学习框架
性能对比 压测工具:k6 服务器 CPU 型号:Intel(R) Xeon(R) Platinum 8369B CPU @ 2.90GHz 压测方式:Higress 启动 2 个 worker 线程, 压测期间固定 k6 的压力,跑满两个线程 选取了部分 Higress 插件进行性能测试,情况如下: 注:表格中的数据为单请求平均附加延时 整体来看,Wasm 指令越复杂的插件,WAMR 的提升越明显。 append_aot_to_wasm.py --aot plugin.aot --wasm plugin.wasm -o plugin.aot.wasm以提升最大的 oauth 插件为例,可以使用下述配置进行复现: k6 压测命令:k6 run --vus 300 . /script.js --duration 60s k6 压测脚本: import http from 'k6/http'; import { check } from 'k6'; export default