关闭

LR进程线程

31人阅读 评论(0) 收藏 举报
分类:

进程方式和线程方式的优缺点:               

       如果选择按照进程方式运行, 每个用户都将启动一个mmdrv进程,多个mmdrv进程会占用大量内存及其他系统资源,这就限制了可以在任一负载生成器上运行的并发用户数的数量,因为负载机的资源(内存及其他系统资源)是有限的。

       如果选择按照线程方式运行,在默认情况下,controller为每50个用户仅启动一个mmdrv进程,而每个用户都按线程方式来运行,这些线程用户将共享父进程的内存段,这就节省了大量内存空间,从而可以在一个负载生成器上运行更多的用户。(如果选择线程方式来运行用户,每个进程中会多出几个线程,例如是53个,多出来的进程可能是用于维护进程之间的运行的)

      选择线程方式虽然可以减少启动的mmdrv进程数,减少了内存的占用,但是也容易出现一个问题,例如,同一个测试场景,用线程并发就会出现超时失败或报错,而用进程并发就没错。为什么呢?因为线程的资源是从进程资源中分配出来的,因此同一个进程中的多个线程会有共享的内存空间,假设a线程要用资源就必须等待b线程释放,而b线程也在等待其他资源释放才能继续,这样就会出现这个问题。

===============================================================

今天来说说LR里的组和用户的问题。
  前几天看到一个帖子问:一个组里10个用户和10个组每个组一个用户有什么区别?
  我们先看一下LR的官方帮助:
 
Multithreading 
Vusers support multithread environments. The primary advantage of a multithread environment is the ability to run more Vusers per load generator. Only threadsafe protocols should be run as threads. (not applicable to Mercury Business Availability Center) 
Note: The following protocols are not threadsafe: Sybase-Ctlib, Sybase-Dblib, Informix, Tuxedo, and PeopleSoft-Tuxedo. 
o      To enable multithreading, click Run Vuser as a thread. 
o      To disable multithreading and run each Vuser as a separate process, click Run Vuser as a process. 
The Controller and Tuning Console use a driver program (such as mdrv.exe or r3vuser.exe) to run your Vusers. If you run each Vuser as a process, then the same driver program is launched (and loaded) into the memory again and again for every instance of the Vuser. Loading the same driver program into memory uses up large amounts of RAM (random a<a href="http://www.ltesting.net/ceshi/ceshijishu/rjcsgj/rational/%3CSTRONG%3E%3CA%20href=" http:="" www.ltesting.net="" ceshi="" ceshijishu="" rjcsgj="" rational="" clearcase="" "="" target="_blank" style="word-break: break-all; text-decoration: none; color: rgb(31, 58, 135); line-height: normal !important;">clearcase/" target="_blank" >ccess memory) and other system resources. This limits the numbers of Vusers that can be run on any load generator. 
Alternatively, if you run each Vuser as a thread, the Controller or Tuning Console launches only one instance of the driver program (such as mdrv.exe), for every 50 Vusers (by default). This driver process/program launches several Vusers, each Vuser running as a thread. These threaded Vusers share segments of the memory of the parent driver process. This eliminates the need for multiple re-loading of the driver program/process saves much memory space, thereby enabling more Vusers to be run on a single load generator. 
 
 
  从上面的描述可以看到,
  如果是线程安全的协议,在一个组(进程)里并发多个vusers,可以不用开那么进程。这可以减少系统的开销。
  如果不是线程安全的协议,我们需要开多个进程来处理Vusers。这样势必增加系统的开销。
  其实对现在的硬件来说,基本上客户端成为瓶颈的机会不是很大。(除非这公司太穷了)
^_^
 
 
  这里我做了个实验,画了一张表,来形象的说明一下组/vusers/线程/进程的关系。
注:这里,我假定的是10vsuers:

设置vusers按进程还是线程运行
Vusers(个/组)
组(个)
mmdrv.exe中的线程数(个/组)
Mmdrv.exe进程(个)
平均每个进程占的内存(k)
Mmdrv.exe占有内存总数(k)
线程
10
12
7,500
7,500
线程
10
10
5,150
51,500
进程
10
10
4,676
46,760
进程
10
10
5,150
51,500

  我这里脚本都是一样的。 
  大家如果自己做实验,内存可能会不一样。
  在表里,我们可以很清楚的看到,进程多的时候,占用内存肯定是多的。
  如果在同一组里开多个线程,占用内存就少得多。
  我们还要注意一个细节就是在用线程来运行vusers的时候,每个进程中会多出几个线程来。
  这多出来的很个进程在做什么,我没有查它的API,我想可能是维护进程之间的运行。
 
  很显然的,还有个问题,就是哪个压力更大。
  这个问题也有些人在问,我想这个应该是很明显的吧。
  其实对服务器来说,只要是10个用户都在正常工作,而速度不会受到本地硬件的影响。
  对服务器的压力是一样的。
  这么来思考:
  假设来说。
  我们是从客户端来发数据库的,10个用户,如果一秒钟发20个数据包。
  那对服务器来说,收到的数据包都是一样多的。所以压力也会是一样的。


  那会不会存在在同一个进程里开10个线程速度更慢呢。
  这个,我以为不会的。
 
  所以我认为压力是一样的

=================================================================

 loadrunner controller将使用驱动程序mmdrv运行Vuser。用户可以在controller的run-time setting中选择Vuser的运行方式, 是多进程方式or多线程方式。 

  如果选择以线程方式来运行虚拟用户: 

  在场景设置时,“是单行脚本,还是多行脚本”会决定系统启动的进程数的多少: 

  假设并发用户设置为30,如果是单行30个用户,系统只需启动一个进程;   假设并发用户设置为30,如果是多行,30行,每行一个用户,系统就需要启动30个进程; 

  如果选择以进程方式来运行虚拟用户: 

  那么无论脚本在场景组中怎么设置,是单行多用户还是多行少用户方式,系统需要启动的进程数是一定的,就是并发用户的总数;   进程方式和线程方式的优缺点   如果选择按照进程方式运行,每个用户都将启动一个mmdrv进程,多个mmdrv进程会占用大量内存及其他系统资源,这就限制了可以在任一负载生成器上运行的并发用户数的数量,因为负载机的资源(内存及其他系统资源)是有限的。   如果选择按照线程方式运行,在默认情况下,controller为每50个用户仅启动一个mmdrv进程,而每个用户都按线程方式来运行,这些 线程用户将共享父进程的内存段,这就节省了大量内存空间,从而可以在一个负载生成器上运行更多的用户。(如果选择线程方式来运行用户,每个进程中会多出几 个线程,例如是53个,多出来的进程可能是用于维护进程之间的运行的) 

  选择线程方式虽然可以减少启动的mmdrv进程数,减少了内存的占用,但是也容易出现一个问题,例如,同一个测试场景,用线程并发就会出现超时 失败或报错,而用进程并发就没错。为什么呢?因为线程的资源是从进程资源中分配出来的,因此同一个进程中的多个线程会有共享的内存空间,假设a线程要用资 源就必须等待b线程释放,而b线程也在等待其他资源释放才能继续,这样就会出现这个问题。 

  系统需要启动的mmdrv进程数与哪些因素有关: 

  与在controller 的运行时设置中选择的是进程方式or线程方式来运行虚拟用户有关 

  进程方式:无论是单行or多行脚本,需要启动的进程数就是并发用户数;   线程方式:假设是单行脚本,每50个用户才启动一个进程;多行脚本,有几行(每行<50人)就启动几个进程,而不是每个用户启动一个进程。 

  如果选择了线程方式,需启动的进程数,进一步还与脚本是单行还是多行有关 

  单行脚本,多用户,假设少于50,只需启动一个进程,100个用户,只需启动2个进程,依此类推; 

  多行脚本,即使每行一个用户,也需要启动一个进程,多一行就需要多启动一个进程;不是每个用户启动一个进程,有几行(每行<50人)就需要启动几个进程。 

  在启动了IP欺骗功能后,所需启动的进程数,还与选择的是按进程还是按线程来分配IP地址有关 

  按进程分IP:每个ip(负载生成器)就需要多启动一个进程;   按线程分IP:每个ip(负载生成器)不需要多启动一个进程。 







进程和线程的区别是什么?  

进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:  

简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。  

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.   

2、按线程运行VUSER和按进程运行VUSER的区别 

1. 按线程运行VUSER,LR默认情况下,每50个用户开启一个进程

mmdrv.exe;controller场景运行结束,进程mmdrv.exe也会相应结束; 

2. 按进程运行VUSER,系统为每1个用户开启一个进程mmdrv.exe;controller场景运行结束,进程mmdrv.exe也会相应结束; 

3. 在Runtime setting中设置为按线程运行VUSER,设置Controller中的虚拟用户数小于等于50的话,打开windows资源管理器可以看到有一个进 程mmdrv.exe; 设置Controller中的虚拟用户数在51与100之间的话,打开windows资源管理器可以看到有两个进程 mmdrv.exe. 

 

多进程和多线程的区别是: 

Controller将使用驱动程序mdrv运行Vuser.如果按进程方式运行每个Vuser,则对于每个Vuser实例,都将启动一个mdrv进程。多个mdrv进程会占用大量内存及其他系统资源,这就限制了可以在任一负载生成器上运行的Vuser的数量。如果选择按线程方式运行,在默认情况下,Controller为每50个VUser仅启动一个mdrv.exe进程,而每个Vuser都按线程运行,这些线程Vuser将共享父进程的内存段。这就节省了大量内存控件,从而可以在一个负载生成器上运行更多的Vuser. 但是任何选择都是有两面性的。选择线程方式运行Vuser会带来一些安全问题。因为线程的资源是从进程资源中分配出来的,因此同一个进程中的多个线程会有







共享的内存空间,这样可能会引起多个线程的同步问题,调度不好,就会出现问题,比如A线程要用的资源就必须等待B线程释放,而B线程也在等待其他资源释放才能继续。这就会出现这样的问题:同一个测试场景,用线程并发就会超时失败或报错,而用进程并发就没错。一个组里10个用户和1个组每个组一个用户有什么区别? 

如果是线程安全的协议,在一个组里并发多个Vuser,可以不用开那么多进程。这可以减少系统的开销。 

如果不是线程安全的协议,我们需要开多个进程来处理Vuser。这样势必增加系统的开销。(对现在的硬件来说,基本上客户端成为瓶颈的机会不是很大。除非公司太穷)

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32次
    • 积分:2
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档
    阅读排行
    评论排行