性能测试并发对比(JMeter,Locust和Gatling篇)
并发
说到并发,我们首先想到的就是服务端系统的并发模型,现在常见的并发模型有多线程模型,事件循环模型,Actor 模型和 CSP 模型等不同的模型。为了能测试到这样的服务器系统的并发能力,性能测试工具也需要支持与之相应的并发包能力。而充分了解性能测试工具的并发模型,可以更好地帮助你选择适合自己的性能测试工具。其中 JMeter,Locust 和 Gatling 就选择了三种不同的并发模型,这个应该是和开发者当时的技术背景,业务需求,资源情况等密切相关的。所以没有必要去探究当时作者为什么要选择这个模型,但是可以尝试去理解这些不同模型的特点,从而选择到适合自己的模型。其中 JMeter 使用的是多线程模型,Locust 使用的是事件循环模型,而 Gatling 使用的是 Actor 模型,最近又有一个后起之秀 K6,它则使用的是 CSP 模型。其次并行和并发是完全不同的两个概念,简单说并行是操作系统和 CPU 的一种能力,而并发是应用程序的一种能力。如果性能测试工具支持多线程或者多进程,并且运行的操作系统支持并行以及 CPU 是多核的情况下,其发包能力能大大增强。但是这样的条件比较苛刻,所以这里就不做深入探讨。
JMeter
JMeter 是三个工具中最早发布的性能测试工具,并且由于早期性能测试的需求并不十分复杂,并且对于并发性能的要求也不是很高,所以 JMeter 使用了当时最为成熟的并发模型-多线程模型(Threads)和 Java 语言来开发。这种模型的特点就是重度依赖于开发语言和操作系统对于多线程的支持,如果语言和操作系统层面对于多线程的支持不好,就会导致这种并发模型出现问题。其次多线程切换的时候资源消耗比较多,所以和另外两个轻量级的并发模型相比,在同等资源的情况下,产生的有效并发数量会小很多。最后多线程也相对容易产生错误,比如死锁,共享数据错乱等,所以 JMeter 使用界面的方式也是尽可能地减少了由于二次开发导致的这类错误。其优势就是可以在操作系统支持的情况下可以使用到多核处理器的多个核。但是随着性能测试需求的增多,JMeter 为了能满足更多的需求,也在不停地更新其功能和增加其插件,比如支持分布式来解决性能不足的问题,支持更多的扩展脚本来满足自定义需求等等。但是其基础并发模型一直沿用多线程模型,导致其并发性能没有办法进一步提升,估计在未来可以预见的很长一段时间之内是不会改变的。
Locust
Locust 为了避免多线程存在的各种问题,它选择了消息循环模型(EventLoop)和 Python 语言来开发。EventLoop 模型最大的优势就是在一个线程里面可以完成大量的并发,从而避免了多线程带来的各种问题。与此同时它带来的问题就是无法同时使用多核处理器的多个核,从而无法充分使用硬件资源。不过可以通过 Locust 提供了分布式的方法来使用多核。其次 Locust 的并发模型里面并发用户的数据只能配置一个固定值,并且在 Locust 运行的过程中是不能改变的。这个特性与 JMeter 和 Gatling 都不一样,因为 JMeter 和 Gatling 都是可以运行的过程中改变并发用户数量的。
Gatling
Gatling 是三个工具中发布最晚的一款,所以它选择 Akka(Actor)模型和 Scala 语言来开发。由于 Actor 模型的轻量和高并发性,再加上 Scala 语言基于 JVM,所以 Gatling 的并发模型结合了 JMeter 和 Locust 的优势,其尽可能地避免了多线程存在的一些问题,并可以充分使用硬件资源:多核。其次 Actor 模型核心是基于消息传递的,并且使用每个虚拟用户基于一个 Actor 就可以做到相对独立,并通过消息传递进行通信。所以它具有和消息循环模型同样在单线程里面进行高并发的能力。并且它还可以在运行时轻松地动态增加和减少并发虚拟用户数(Actor)。虽然其并发模型十分优秀,但是需要使用 Scala 语言来进行开发,使得很多测试人员望而却步,导致 Gatling 的使用量并不是很广泛。
Actor 并发模型图
JMeter,Locust 和 Gatling 使用了三种典型的并发模型,从而决定了其不同的基础特性。而充分了解这些特性,可以更好地帮助我们选择适合自己项目的性能测试工具,从而避免一些后期的一些问题。如果不想选择已有的这些开源测试工具,想自己重新开发,选择并发模型更是非常重要的一步。虽然很多性能测试初级者,也许并不关心性能测试工具的并发模型,但是随着深入学习和实践之后,会遇到各种不同的需求或者问题。为了实现这些需求和解决这些问题,就需要深入了解性能测试工具的各种特点,这其中就包括并发模型。其次,当前大量的服务器软件也是使用的和性能测试工具相同的并发模型,所以学习并了解这些并发模型,可以让你进一步了解被测系统的性能模型,从而更好地设计性能测试方案和模型。所以对于高级的性能测试工程师或者性能工程师,并发模型都是一门必不可少的课程。