压测工具/平台是什么?
压测,即压力测试,作用是对各种服务对象进行压力测试以获得该服务处于或超过预期负载时系统的运行情况,进而判断系统在峰值负载或超出最大负载情况下的处理能力。
压测工具,顾名思义,就是用来进行压力测试的工具,常用的有ab、jmeter、LoadRunner和wrk等等。
而由于在整个压测过程中存在以下问题:
- 时间成本:每次测试都需要重新搭建一套生产环境,成本太高,且几乎每个环节都需要人力支撑
- 数据成本:脚本、测试数据、压测机器、测试报告无法沉淀
- 风险成本:测试用例多,生产压测缺乏平台流程管理,手工执行非常容易出错
- 自动化问题:自动化性能基线无统一平台支撑,测试过程中靠手动监控,覆盖不全且定位问题困难
为了解决以上这些问题、更好地满足自己/用户的压测需求,不少企业在开源压测工具的基础上进行二次开发,将压测流程管控、压测任务管理和自动化性能基线等功能整合在一起,形成一个可以支撑各种个性化压测需求的分布式业务系统,也就是压测平台。
本文主要讲什么?
用户在挑选压测平台时,一般都会关心几个问题,一是压力能不能稳定打上去,达到用户的需求;二是进行压测的成本有多高,例如操作成本、学习成本、资源成本等;有些用户可能还会有对于报告输出的要求。也就是说,对于压测平台,我们最关心两个个问题:
- 该工具/平台是否可以满足自己的测试需求?
- 该工具/平台能否稳定提升压力到指定水平?
- 该工具/平台的压测成本有多高?
工具/平台间的对比
在这里进行对比的平台/工具有阿里云的性能测试平台PTS、华为云的性能测试服务CPTS、睿象云的云压力测试平台CPT这三款云压测平台以及k6、Apache JMeter这两款压测工具。
为什么挑选它们? 因为这三家压测平台都接受个人用户在其平台上进行压测,而像腾讯云的WeTest压测大师、数列科技的ForceCop和压测宝等一些云压测平台则暂时只接受企业用户进行压测,定价与服务也是依据企业用户的自身情况进行定制的,个人无法评测。 而这两款压测工具,一款是更大众的JMeter,另一款是新兴的测试工具k6。
1. 该工具/平台是否可以满足自己的测试需求?
我们来对比各个工具/平台支持的协议有哪些,如下表
压测工具/平台 | 支持的协议 |
---|---|
性能测试平台PTS | HTTP、HTTPS、WebSocket、TCP、UDP、Dubbo、Mqtt |
性能测试服务CPTS | HTTP、HTTPS、TCP、UDP |
云压力测试平台CPT | HTTP、HTTPS、Socket、WebSocket、Mqtt |
JMeter | HTTP、FTP、JDBC、SOAP、LDAP、TCP、JMS、SMTP、POP3、IMAP |
K6 | HTTP 1.1、HTTP 2、WebSockets、gRPC、SOAP、REST |
2. 该工具/平台能否稳定提升压力到指定水平?
对于云压测平台来说,由于本指标中的“稳定”不太好评价,以及这些平台的官方文档一般都有说明自己所能达到的最大并发,于是我去对比了这些平台的价格,也就是说,我们对比的是想要达到某个程度的并发,用户需要花费多少钱?
性能测试平台PTS(阿里云)
套餐详情:
性能测试服务CPTS(华为云)
套餐详情:
云压力测试平台CPT(睿象云)
套餐详情:
通过上面的数据,可以得出下表
单位 | 阿里云PTS | 华为云CPTS | 睿象云CPT |
---|---|---|---|
元/10万VUM/一年 | 3336 | 100 | 3996 |
以此来看,华为云的服务是最经济的选择。
而对于压测工具来说,一般有以下两个指标可以进行对比
- 在运行测试时消耗的资源是多少?
- 在相同配置下,压测工具能支持多少并发?
也就是说,我们需要考虑压测工具产生并发时所需要的资源成本是多高,以及可以产生多少并发。
1. 消耗的资源
JMeter远比k6要更消耗资源,它往往需要多个负载生成器来生成负载,并且它需要更高的内存。在比较中,JMeter占用了760 MB的内存,而k6占用了256 MB的内存。
来源: Rafaela Azevedo
来源: Rafaela Azevedo
k6是用go语言编写的,go语言是一种编译型语言,不像Java那样需要先解释再运行,也就是说go本身就是以性能为目标构建的。
对于压测工具来说,产生并发最简单也最常见的方法是将一个虚拟用户分配给一个内核或者一个线程,这个方案有个缺陷:当虚拟用户正在等待响应或者执行sleep()时,该线程也被阻塞而无法处理其他工作。
在k6中,每个虚拟用户都在goroutine上而不是线程上运行,goroutine被Go Scheduler控制,它通过允许“工作窃取(work stealing)”和线程之间的工作交换,重新利用空闲线程并智能地分配工作,以此来提高总体性能,并显著降低内存利用率。一个运行k6的线程不会超过100 kb,但像JMeter这样的JVM线程默认使用1 MB内存,会给堆带来巨大压力。
——来自Comparing k6 and JMeter for load testing
2. 产生的并发
根据文档来看,JMeter平均可以达到1000左右的并发,如果需要更高的并发则需要设置分布式的JMeter测试;但是如果给k6相同的资源,k6可以产生数以万计的并发。这有几个原因,一是因为k6所占用的内存更低,所以它可以运行更多并发并产生更高的负载,二是k6处理硬件资源的方式与其他负载工具不同,单个k6进程可以有效地利用所有CPU内核;总的来说,k6的单个实例可以产生30000-40000个并发。
3. 该工具/平台的压测成本有多高?
在这里大致把压测成本细分为
①学习成本:指第一次接触该工具/平台到可以熟练使用所需要的时间
- 安装是否简单
- 有无外部依赖
- 社区支持是否丰富
②操作成本:指该工具/平台的操作是否简单,可否通过插件拓展新的功能
- 脚本语言
- 编写脚本是否简单
- 维护是否简单
- 插件支持
功能工具 | PTS(阿里云) | CPTS(华为云) | CPT(睿象云) | JMeter | k6 |
---|---|---|---|---|---|
安装简单 | - | - | - | 否,需要提前安装Java | 是 |
外部依赖 | - | - | - | Java | 无 |
费用 | ☆☆☆☆ | ☆☆ | ☆☆☆☆☆ | 免费 | 免费 |
支持脚本 | jmx、json、yaml | jmx、json | - | jmx | JavaScript |
脚本编写方式 | GUI设置、上传脚本文件 | GUI设置、上传脚本文件 | GUI设置、上传脚本文件 | GUI设置 | 代码编写 |
维护难易 | 易 | 易 | 中 | 难,脚本冗长 | 中,脚本简洁 |
插件支持 | - | - | - | 插件丰富 | 可用插件不多 |
支持分布式测试 | 是 | 是 | 是 | 是 | 否(可通过付费服务支持) |
测试可以监控 | 是 | 是 | 是 | 是,添加监听器 | 否(可通过付费服务支持) |
面向人群 | 对测试人员友好 | 对测试人员友好 | 对测试人员友好 | 对测试人员友好 | 对开发人员友好 |
社区丰富程度 | ☆☆☆ | ☆☆☆ | ☆☆ | ☆☆☆☆☆ | ☆☆☆☆ |
不同工具/平台的优势
不同的工具/平台肯定会有自己的优势以及特点,下面展开阐述一下
- 以价格低到高排序:JMeter & k6、CPTS(华为云)、PTS(阿里云)、CPT(睿象云)
- 以操作简单到复杂排序:PTS(阿里云)& CPTS(华为云)、JMeter、k6、CPT(睿象云)
注:睿象云的操作是最复杂的,虽然有UI界面,但是其设计不太人性化,例如说上传脚本的功能,在用户上传脚本失败后也不提示系统需要什么格式的脚本。而对比之下,其他的工具/平台都是你可以通过自己摸索就能完成基本操作的。
- 以社区丰富程度高到低排序:JMeter、k6、PTS(阿里云)、CPTS(华为云)、CPT(睿象云)
对于压测工具来说:
- JMeter的特点有
- 使用UI界面,对测试人员友好
- 可以执行复杂的压测场景,包括不同的协议
- 可以为每个测试编写完整的场景
- 可以用一种经济有效的方式进行分布式压测
- 可以利用监听器内置预先准备好的报告
- 有一个拥有大量文档的成熟社区
- k6的特点有
- 安装速度极快,不需要其他依赖项
- 可以最大化性能和效率
- 所需要的内存空间少
- 脚本是纯代码,可以减少二义性
- 可以进行版本控制,以便团队可以更容易在脚本上进行协作
对于压测平台来说:
- 阿里云PTS的特点是它的社区文档丰富,但是价格较高
- 华为云CPTS的特点是价格较低,可满足主要压测需求
- 睿象云CPT的特点是它主要提供运维服务,压测服务可与旗下的其他产品(如告警与监控服务)搭配使用,但价格也比较高
参考资料
Load tests: Jmeter vs K6
Comparing k6 and JMeter for load testing