不同性能测试工具的并发模式(一)
大家所熟悉的性能测试工具有Loadrunner、JMeter,以及其他小众一些的工具,如Locust、Ngrinder、Gatling等等,那么你们知道这些工具有什么不同吗?为什么有的工具能模拟数千上几万的并发,有的工具单机只能模拟一两千的并发,这其中的原因是什么呢?那么这节课我就来告诉大家,你所不了解性能测试工具的一面:并发模式。一、多进程 / 多线程并发模式
多进程:同时执行多个程序。如,运行微信,QQ,以及各种浏览器(进程列表里能看到多个程序在运行)。
多线程:同一时刻执行多个线程。如,用浏览器一边看新闻,一边听歌,一边下载(只启一个浏览器进程,运行多线程任务)。
http://www.51testing.com/attachments/2021/06/15326880_202106171719461Moym.png
1、进程和线程切换模式
支持进程和线程双模式的代表工具是Loadrunner
对于Loadrunner按线程运行VUSER和按进程运行VUSER的区别:
(1)按线程运行VUSER,LR默认情况下,每50个用户开启一个进程mmdrv.exe;controller场景运行结束,进程mmdrv.exe也会相应结束;
http://www.51testing.com/attachments/2021/06/15326880_20210617172044166JC.png
在Runtime setting中设置为按线程运行VUSER,设置Controller中的虚拟用户数小于等于50的话,打开windows资源管理器可以看到有一个进程mmdrv.exe;设置Controller中的虚拟用户数在51与100之间的话,打开windows资源管理器可以看到有两个进程mmdrv.exe.
(2)按进程运行VUSER,系统为每1个用户开启一个进程mmdrv.exe;controller场景运行结束,进程mmdrv.exe也会相应结束;
http://www.51testing.com/attachments/2021/06/15326880_202106171721131wvdS.png
进程的方式由于要起大量的mmdrv.exe,就要耗费大量的资源(进程属于独占资源,不像线程是共享内存空间),同等资源下无法支持更多并发,但换来的是进程的稳定性和安全性(进程独占资源,不会像线程那样发生内存共享争用情况,所以报错率极低),压测过程中不容易出现异常。在LR中这些协议不支持多线程并发:Sybase-Dblib、Infomix、Tuxedo、and PeopleSoft-Tuxedo,原因是这些协议本身不支持线程安全(会发生共享争用)。
2、多线程并发模式
支持多线程并发模式的代表工具是JMeter
http://www.51testing.com/attachments/2021/06/15326880_2021061717214113AQ2.png
(1)重度依赖于开发语言和操作系统对多线程的支持
(2)多线程切换的时候资源消耗比较多,在同等资源的情况下,产生的有效并发数量小;
(3)多线程也相对容易产生错误,比如死锁,共享数据错乱;
(4)可以通过丰富的界面来减少二次开发导致上面的一些错误;
(5)通过扩展开发和插件实现分布式来满足并发量的不足;
(6)多线程的应用技术比较成熟,未来相当长时间,还会继续应用于很多性能测试工具。
Jmeter作为多线程并发的代表工具,肯定比多进程工具要轻量化,但是有效并发还是不足,这就需要用到分布式代理,但是一个分布式代理只能启一个进程(slave),一个进程只能运行一个作业任务(进程独占一个通信端口,进程内通过多线程实现并发),所以Jmeter并不支持分布式的多任务并发,但由于Jmeter的master(主节点)支持多进程(启多个jmeter),所以有些压测平台,比如MeterSphere就利用了这一点,通过控制多个Jmeter进行多任务的并发(多进程并行任务 + 多线程并发测试),而不是靠分布式代理这种单进程多线程的方式:
http://www.51testing.com/attachments/2021/06/15326880_202106171722071FDpn.png
3、多进程和多线程并用模式
充分利用进程和线程并发模式的代表工具是Ngrinder
虚拟用户的换算关系:
进程数:每个server起多少进程去跑
线程数:每个进程新建的线程数量
并发量 = 代理数 x 进程数 x 线程数
http://www.51testing.com/attachments/2021/06/15326880_202106171722361dyq7.png
nGrinder支持多重测试和动态代理分配,因此只有在执行真正的测试时,才会动态地将代理分配给测试。这使得nGrinder成为所有竞争者中唯一的解决方案。由于代理的数量相对较少,多个用户可以同时运行多个测试。可能并发测试的数量取决于自由代理的数量。
总结:多线程和多进程比起来,显然要轻量的多,并且能充分的利用多核心CPU的并发处理能力,效率要高的得多,但是和进程一样,一个线程也需要从头到尾的处理请求的发送、等待和接收的过程,这个过程只要没有结束,线程资源就始终得不到释放,所以多线程需要通过上下文切换来合理的争用CPU资源,而多线程上下文切换就会严重影响多线程的执行速度,所以单台机器的有效线程并发不足,追求更高的并发,只能通过增加代理机。
二、消息循环(EventLoop)并发模式
代表工具Locust,基于协程(微线程,相当于函数,更轻量级)而不是回调方式,只能单核CPU运行,可以通过分布式来实现多核运行。
http://www.51testing.com/attachments/2021/06/15326880_202106171723031ZJ7X.png
1. EventLoop模型最大的优势是在一个线程里完成大量的并发,从而避免了多线程带来的各种问题。我们可以看到,发送消息和接收消息被独立化了,不需要由一个线程负责到底,这就避免了多线程的上下文切换问题。
2. 缺点是无法同时使用多核心处理器的多个核,从而无法充分利用硬件资源,因为一个线程就实现了多并发, 使用单核CPU就够了,这样就造成了其他CPU的闲置(另一种浪费行为),这就需要通过用分布式来启动多线程 ,通过多实例运行来弥补这个问题。
3. 这种并发模型里面的并发用户数只能配置固定值,在压测的过程中无法改变;这个特性与 JMeter 和 Gatling 都不一样,因为 JMeter 和 Gatling 都是可以运行的过程中改变并发用户数量的。
页:
[1]