51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4241|回复: 0
打印 上一主题 下一主题

[转贴] 不同性能测试工具的并发模式(一)

[复制链接]
  • TA的每日心情
    无聊
    3 天前
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-6-24 10:04:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    大家所熟悉的性能测试工具有Loadrunner、JMeter,以及其他小众一些的工具,如Locust、Ngrinder、Gatling等等,那么你们知道这些工具有什么不同吗?为什么有的工具能模拟数千上几万的并发,有的工具单机只能模拟一两千的并发,这其中的原因是什么呢?那么这节课我就来告诉大家,你所不了解性能测试工具的一面:并发模式。
      一、多进程 / 多线程并发模式
      多进程:同时执行多个程序。如,运行微信,QQ,以及各种浏览器(进程列表里能看到多个程序在运行)。
      多线程:同一时刻执行多个线程。如,用浏览器一边看新闻,一边听歌,一边下载(只启一个浏览器进程,运行多线程任务)。

      1、进程和线程切换模式
      支持进程和线程双模式的代表工具是Loadrunner
      对于Loadrunner按线程运行VUSER和按进程运行VUSER的区别:
      (1)按线程运行VUSER,LR默认情况下,每50个用户开启一个进程mmdrv.exe;controller场景运行结束,进程mmdrv.exe也会相应结束;

      在Runtime setting中设置为按线程运行VUSER,设置Controller中的虚拟用户数小于等于50的话,打开windows资源管理器可以看到有一个进程mmdrv.exe;设置Controller中的虚拟用户数在51与100之间的话,打开windows资源管理器可以看到有两个进程mmdrv.exe.
      (2)按进程运行VUSER,系统为每1个用户开启一个进程mmdrv.exe;controller场景运行结束,进程mmdrv.exe也会相应结束;

      进程的方式由于要起大量的mmdrv.exe,就要耗费大量的资源(进程属于独占资源,不像线程是共享内存空间),同等资源下无法支持更多并发,但换来的是进程的稳定性和安全性(进程独占资源,不会像线程那样发生内存共享争用情况,所以报错率极低),压测过程中不容易出现异常。在LR中这些协议不支持多线程并发:Sybase-Dblib、Infomix、Tuxedo、and PeopleSoft-Tuxedo,原因是这些协议本身不支持线程安全(会发生共享争用)。
      2、多线程并发模式
      支持多线程并发模式的代表工具是JMeter

      (1)重度依赖于开发语言和操作系统对多线程的支持
      (2)多线程切换的时候资源消耗比较多,在同等资源的情况下,产生的有效并发数量小;
      (3)多线程也相对容易产生错误,比如死锁,共享数据错乱;
      (4)可以通过丰富的界面来减少二次开发导致上面的一些错误;
      (5)通过扩展开发和插件实现分布式来满足并发量的不足;
      (6)多线程的应用技术比较成熟,未来相当长时间,还会继续应用于很多性能测试工具。
      Jmeter作为多线程并发的代表工具,肯定比多进程工具要轻量化,但是有效并发还是不足,这就需要用到分布式代理,但是一个分布式代理只能启一个进程(slave),一个进程只能运行一个作业任务(进程独占一个通信端口,进程内通过多线程实现并发),所以Jmeter并不支持分布式的多任务并发,但由于Jmeter的master(主节点)支持多进程(启多个jmeter),所以有些压测平台,比如MeterSphere就利用了这一点,通过控制多个Jmeter进行多任务的并发(多进程并行任务 + 多线程并发测试),而不是靠分布式代理这种单进程多线程的方式:

      3、多进程和多线程并用模式
      充分利用进程和线程并发模式的代表工具是Ngrinder
      虚拟用户的换算关系:
      进程数:每个server起多少进程去跑
      线程数:每个进程新建的线程数量
      并发量 = 代理数 x 进程数 x 线程数

      nGrinder支持多重测试和动态代理分配,因此只有在执行真正的测试时,才会动态地将代理分配给测试。这使得nGrinder成为所有竞争者中唯一的解决方案。由于代理的数量相对较少,多个用户可以同时运行多个测试。可能并发测试的数量取决于自由代理的数量。
      总结:多线程和多进程比起来,显然要轻量的多,并且能充分的利用多核心CPU的并发处理能力,效率要高的得多,但是和进程一样,一个线程也需要从头到尾的处理请求的发送、等待和接收的过程,这个过程只要没有结束,线程资源就始终得不到释放,所以多线程需要通过上下文切换来合理的争用CPU资源,而多线程上下文切换就会严重影响多线程的执行速度,所以单台机器的有效线程并发不足,追求更高的并发,只能通过增加代理机。
      二、消息循环(EventLoop)并发模式
      代表工具Locust,基于协程(微线程,相当于函数,更轻量级)而不是回调方式,只能单核CPU运行,可以通过分布式来实现多核运行。

      1. EventLoop模型最大的优势是在一个线程里完成大量的并发,从而避免了多线程带来的各种问题。我们可以看到,发送消息和接收消息被独立化了,不需要由一个线程负责到底,这就避免了多线程的上下文切换问题。
      2. 缺点是无法同时使用多核心处理器的多个核,从而无法充分利用硬件资源,因为一个线程就实现了多并发, 使用单核CPU就够了,这样就造成了其他CPU的闲置(另一种浪费行为),这就需要通过用分布式来启动多线程 ,通过多实例运行来弥补这个问题。
      3. 这种并发模型里面的并发用户数只能配置固定值,在压测的过程中无法改变;这个特性与 JMeter 和 Gatling 都不一样,因为 JMeter 和 Gatling 都是可以运行的过程中改变并发用户数量的。


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-24 03:14 , Processed in 0.066051 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表