2023年11月23日
比较k6和JMeter的负载测试
什么是JMeter?
JMeter是Apache 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
特征 | JMETER | K6 |
---|---|---|
基于 | Java | Go |
脚本语言 | 非常有限: 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 automation | 否 | xk6-browser |
外部依赖项 | Java | 无 |
资源利用率 | 差劲; 一个负载生成器可以模拟数千个虚拟用户 | 非常好 ; 一个负载生成器可以模拟成千上万的虚拟用户 |
内存管理 | 必须设置JVM堆内存 | 本机使用负载生成器内存 |
线程模型 | 1个线程1个虚拟用户:性能较慢,资源成本较高 | 一个Goroutine1个虚拟用户:性能较快,资源成本更低 |
易于编写脚本 | 基于图形用户界面,带代码块 | 基于代码,VS Code插件 |
测试级阈值 | 不支持,仅个人请求 | 支持 |
脚本格式 | XML | javascript |
易于协作 | 难以同时工作,易于测试员使用,需要GUI应用程序进行编辑 | 易于开发者使用,易于版本; Javascript格式促进协作 |
维护 | 详细的脚本,XML格式难以阅读 | 更简洁的脚本; JavaScript易于阅读 |
社区 | 自1998年以来,许多第三方教程,广泛的文档,没有中央社区 | 自2017年以来,广泛的文档,更少的第三方教程,有官方社区 |
插件支持 | 需要许多功能的插件,有很多可用的插件 | 本机支持大多数功能,可提供插件支持,并且稀疏性 |
本机分布式负载生成 | 是 | 否(仅限高级会员) |
预先生成的报告 | 默认和自定义HTML报告,通过监听器记录 | 没有内置的预生成报告,通过第三方仪表板与分析工具集成 |
网站 | jmeter.apache.org | k6.io |
源代码 | JMeter | k6 |