性能测试之并发模型对比(JMeter,Locust和Gatling篇)

起因

最近不少公众号和在线课程都在讨论性能测试和性能工程,但是鲜有涉及开源性能测试工具的比较与选择。几年前我就写过一篇介绍Gatling的文章《一代服务器性能测试工具Gatling》,里面简单的比较了JMeter和Gatling自身性能和开发形式。现在最为常用的三款开源免费性能测试工具/框架就是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使用了三种典型的并发模型,从而决定了其不同的基础特性。而充分了解这些特性,可以更好地帮助我们选择适合自己项目的性能测试工具,从而避免一些后期的一些问题。如果不想选择已有的这些开源测试工具,想自己重新开发,选择并发模型也是非常重要的一步。 虽然很多性能测试初级者,也许并不关心性能测试工具的并发模型,但是随着深入学习和实践之后,会遇到各种不同的需求或者问题。为了实现这些需求和解决这些问题,就需要深入了解性能测试工具的各种特点,这其中就包括并发模型。 其次,当前大量的服务器软件也是使用的和性能测试工具相同的并发模型,所以学习并了解这些并发模型,可以让你进一步了解被测系统的性能模型,从而更好地设计性能测试方案和模型。所以对于高级的性能测试工程师或者性能工程师,并发模型都是一门必不可少的课程。