2023年11月23日

比较k6和JMeter的负载测试

作者 admin

什么是JMeter?

JMeterApache Foundation完全用Java构建的开源负载测试工具,它于1998年首次发布,慢慢开始流行起来,并与其他更有名但专有的负载测试工具竞争,相对于其他公司的高额收费,JMeter将其开源到网上供大家使用,而且是免费的。此外,JMeter支持通过用户界面(UI)和代码来创建自定义脚本,在撰写本文时,JMeter的最新版本是5.4。

JMeter支持许多协议和功能

这个是JMeter所支持的协议的官方列表

  • 网络 – HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)
  • SOAP / REST 网络服务
  • FTP
  • JDBC数据库
  • LDAP
  • JMS面向消息的中间件(Message-oriented middleware),也称为MOM
  • Mail – SMTP(S), POP3(S) and IMAP(S)
  • 本地命令或Shell脚本
  • TCP
  • Java对象

什么是k6?

k6是LoadImpact在2017年发布的开源负载测试工具,LoadImpact专门提供软件即服务(SaaS)平台(现在称为Grafana Cloud k6)和专业服务,k6是用Go编写的,而脚本是用JavaScript编写的。与JMeter相比,k6的主要卖点是基于代码的脚本,以及重视开发者体验,k6的最新版本是0.30。

k6支持以下协议:

  • 网络 – HTTP/1.1, HTTP/2 (Java, NodeJS, PHP, ASP.NET, …)
  • WebSockets
  • gRPC
  • SOAP / REST 网络服务

k6建立在Go出色的性能上

k6是用Go编写的,而Go是为提高性能而构建的。“Go是一种编译型语言,与Java或Python不同,它不属于解释型语言,并没有任何多余的复杂性”,好处在于它没有外部依赖项,复杂度越低,性能测试工具的瓶颈来源越少。

能够利用Go的性能优化,也就意味着内存利用率大大降低,k6中的一个线程不会超过100kb,而JMeter使用的JVM线程则需要默认1MB,是k6的十倍。当然,Java允许用户调整应用程序的内存使用率,所以两者之间的差异并不会那么大,但是能看得出Go的起点要低得多。

比较表:JMeter与K6

特征JMETERK6
基于JavaGo
脚本语言非常有限: Java (Groovy, Beanshell, etc)Javascript
协议通过插件支持大多数协议(本地支持HTTP/1.1、SOAP、FTP、JDBC、LDAP、MOM与JMS、SMTP、POP3、IMAP、外壳脚本、TCP、Java对象)支持较少的现代协议(HTTP/1.1, HTTP/2, WebSockets, gRPC)
Browser automationxk6-browser
外部依赖项Java
资源利用率差劲; 一个负载生成器可以模拟数千个虚拟用户非常好 ; 一个负载生成器可以模拟成千上万的虚拟用户
内存管理必须设置JVM堆内存本机使用负载生成器内存
线程模型1个线程1个虚拟用户:性能较慢,资源成本较高一个Goroutine1个虚拟用户:性能较快,资源成本更低
易于编写脚本基于图形用户界面,带代码块基于代码,VS Code插件
测试级阈值不支持,仅个人请求支持
脚本格式XMLjavascript
易于协作难以同时工作,易于测试员使用,需要GUI应用程序进行编辑易于开发者使用,易于版本; Javascript格式促进协作
维护详细的脚本,XML格式难以阅读更简洁的脚本; JavaScript易于阅读
社区自1998年以来,许多第三方教程,广泛的文档,没有中央社区自2017年以来,广泛的文档,更少的第三方教程,有官方社区
插件支持需要许多功能的插件,有很多可用的插件本机支持大多数功能,可提供插件支持,并且稀疏性
本机分布式负载生成否(仅限高级会员)
预先生成的报告默认和自定义HTML报告,通过监听器记录没有内置的预生成报告,通过第三方仪表板与分析工具集成
网站jmeter.apache.orgk6.io
源代码JMeterk6