前言
在往期文章《软件性能测试方案-性能测试准备》介绍了前期性能测试准备的要点,本文主要介绍性能测试工具的选型。
想象下,如果不使用工具进行性能测试会怎么样?我们可以从性能测试的定义的角度来分析,性能测试是指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。如果不使用工具,仅靠人工进行性能测试会存在以下的弊端:
为了模拟多种负载、并发的场景需要多人协同工作,通常测试没有很多的资源,而且就算有资源人工的效果也会大打折扣,甚至于某些场景仅凭人工是无法完成的。
性能测试经常需要反复调优和测试执行,如果没有工具的帮助,全靠人工实在不敢想象。
由于需要模拟多种负载和并发场景,如果由人工来操作,难免会存在误差,而且相对工具或程序来说这种误差会更大,对测试结果影响也非常大。
如果没有工具,全凭人工采集数据相对工具来说也会存在较大的误差。
性能测试工具选型参考
1.成本:
2.调度能力:
因为性能测试不可能由一台压力机完成或者说大部分情况下,我们不能不可能由一台压力机来完成,凡是对压力真正有所要求的场景,往往是多台压力机共同施加压力完成性能测试;因此,性能测试工具必须有很好的调度能力,能够由一个主控机同时管理多台代理机完成性能测试任务,而不是由人去一台一台的代理机上操作来完成这个任务。
3.线性扩展能力:
调度能力有好有坏,有些性能测试工具调度能力特别强,具备很好的线性扩展能力,当压力不够的时候能够通过增加压力机数量的方式来线性的增加吞吐量、并发量,从而实现目标。
4.稳定的并发能力
我们在实际性能测试当中往往不是按照传统流程进行的,实际测试中往往需要做对比测试。比如,不同的系统版本,不同的系统,或者数据库参数的调节、超时时间调整等。实际测试中,我们的策略是对比吞吐量相同的情况下CPU利用率的差异,因为吞吐量我们是可以控制的,而CPU我们是不能控制的。使用工具发出来100QPS就是100QPS,200QPS就是200QPS。而CPU是操作系统和CPU共同控制的,它不在我们的控制能力范围。所以,工具的稳定性(“稳定”控制吞吐量)显得尤为重要。
5.单机高吞吐能力
相同资源的服务器如果能发更多的业务压力,就能节省不少的环境资源,并且,压力机数量的减少,直接影响是维护这些工具的工作量减少了,整体测试效率提高了。
6.二次开发的能力
工具支持二次开发,能够更好地契合测试需求,更方面地统计结果数据,并能很好地与公司现有系统做集成。
常用的性能测试工具
下面是对Jmeter、locust、wrk、Loadrunner、vegeta不同维度的对比以及简单介绍
LR | Jmeter | locust | vegeta | wrk | |
---|---|---|---|---|---|
短时间内大并发 | 支持 | 支持 | 支持 | 支持 | 支持 |
UI界面 | 有 | 有 | 有 | 无 | 无 |
资源监控 | 支持 | 支持 | 无 | 无 | 不支持 |
学习成本 | 高 | 高 | 高 | 低 | 高 |
是否开源 | 否 | 是 | 是 | 是 | 是 |
多协议支持 | 是 | 是 | 是 | 否 | 否 |
图形化展示报告 | 是 | 是 | 是 | 是 | 无 |
是否支持场景录制 | 是 | 是 | 否 | 否 | 否 |
wrk是轻量化的http性能测试工具,采用线程+网络异步IO模型,网络异步IO可以使得系统使用很少的线程模拟大量的网络连接以增大并发量、提高压力。
优点
./wrk -c 1000 -t 8 -d 10s http://www.baidu.com
主要包括以下参数:
-t(--thread) 需要模拟的线程数; -c(connection) 需要模拟的连接数; --timeout 超时的时间;-d(--duration) 测试的持续时间
Vegeta 是一个用 Go 语言编写的多功能的 HTTP 负载测试工具,它提供了命令行工具和一个开发库。与上述wrk相比,vegeta本身具有以下优点和缺点:
1.安装、操作简单,易于使用; 2.单机支持能力强; 3.支持分布式压力测试; 4.可以用于测试固定吞吐量下的系统性能。
同wrk一样,vegeta的测试结果输出较为简单,不支持图形化结果展示(如果你是iTerm用户另当别论)。
jmeter同样采用线程并发机制,但其主要依靠增加线程数提高并发量,当单机模拟数以千计的并发用户时,对于CPU和内存的消耗比较大。与上述wrk、vegeta相比,jmeter本身具有以下优点和缺点:
1.界面可视化操作; 2.表格、图形、结果树等多类可视化数据分析和报告输出; 3.支持http、ftp、tcp等多种协议类型测试; 4.支持分布式压力测试; 5.可以用于测试固定吞吐量下的系统性能。
jmeter的GUI模式消耗资源较大,非GUI模式下需要将原始结果数据导入GUI才能查看结果。
locust是一个的简单易用的分布式负载测试工具。locust使用python语言开发,测试资源消耗远远小于java语言开发的jmeter。与jmeter、wrk、vegeta相比,locust具有以下优缺点:
1.不同于wrk和jmeter使用线程数提高并发量,locust借助于协程实现对用户的模拟,相同物理资源(机器cpu、内存等)配置下locust能支持的并发用户数相比jmeter可以提升一个数量级; 2.locust的界面干净整洁,可以实时显示测试的相关细节。
同wrk、vegeta一样,locust测试结果输出不如jmeter的测试结果展示类型多。
总结
本文主要介绍了主流的服务端性能测试工具,希望大家能够根据不同的测试需求和自己对工具的理解,选取适合自己的测试工具。