LoadRunner中的進程與線程
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的並發性。進程和線程的區別在於:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程. 線程的划分尺度小於進程,使得多線程程序的並發性高。
進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位. 線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源. 一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以並發執行.
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(負載生成器)不需要多啟動一個進程。
Loadrunner 關於進程和線程的設置
虛擬用戶已線程還是進程的方式運行,對被測服務器的壓力是完全不同的,首先我們要知道在loadrunner中有3個地方涉及到虛擬用戶的運行方式,分別是:
1、在Vug->run-time settings->miscellane->multithreading中可以設置虛擬用戶是以線程還是進程的方式運行
2、在controller中設置場景時,是以單場景模式運行還是以場景組方式運行,在這兩種不同的運行方式下,虛擬用戶的運行方式也是不同的
3、在controller中使用IP欺騙時,在專家模式下的tools->options->general->multiple IP address mode中也可以選擇每個IP是以線程還是進程方式運行
下面我們介紹一下這三個設置線程和進程之間的關系:
首先說一下run-time settings中的設置與controller中單場景和場景組的關系:
要記住虛擬用戶是以線程還是進程方式運行是在Vug->run-time settings中設置的;
其次在controller中如果使用單場景運行,那么該場景中無論有多少個腳本、多少個負載生成器,運行這些腳本的虛擬用戶均依照Vug->run-time settings中設置的線程還是進程方式運行;但是如果在controller中如果以場景組方式運行時,每個場景組均會作為一個進程被啟動,而每個組中的用戶又是按照Vug->run-time settings中設置的線程還是進程方式運行。
再說一下在controller中使用IP欺騙時,在專家模式下的tools->options->general->multiple IP address mode中的設置:
如果選擇的是進程方式:
1、如果這個ip是在單場景中,那么有幾個不同的ip的負載生成器就會啟動幾個進程,每個負載生成器的虛擬用戶的運行方式仍然按照Vug->run-time settings中設置的線程還是進程方式運行
2、如果是在場景組中運行,這就要看場景組是如何設置的了,有兩種情況:
a、每個場景組中添加一個虛擬ip,這時運行每個場景組時只啟動一個進程 b、每個場景組中添加多個虛擬ip,這時運行每個場景組時,每個場景組啟動一個進程,每個ip啟動一個進程,每個ip的虛擬用戶的運行方式按照Vug->run-time settings中設置的線程還是進程方式運行
如果在controller中使用IP欺騙時,在專家模式下的tools->options->general->multiple IP address mode中選擇的線程方式: 1、如果這個ip是在單場景中,那么對於不同的ip的負載生成器只會啟動一個進程,每個負載生成器的虛擬用戶的運行方式仍然按照Vug->run-time settings中設置的線程還是進程方式運行2、如果是在場景組中運行,每個場景組啟動一個進程,所有ip已線程的方式在組進程中運行,每個ip的虛擬用戶的運行方式按照Vug->run-time settings中設置的線程還是進程方式運行
LoadRunner中的多進程和多線程
Loadrunner支持多線程環境,使用多線程的方法能使每台負載生成器運行更多的VU,但是只有支持線程安全的協議,才能使用Loadrunner的VU並發方式。
以下協議不能支持線程並發
Sybase-Dblib,Infomix,Tuxedo,and PeopleSoft-Tuxedo
當使用進程並發是,在任務管理器中有mdrv.exe的進程,比如下圖,用10個VU用戶並發,就會在任務管理器中出現10個mmdrv進程
如果以多線程方式並發,只會出現一個mmdrv進程,一個進程可以支持50VU的線程並發。
Loadrunner的參考幫助還說明了,如果采用多線程方式並發,Load Generator將會比多進程支持更多的用戶,具體的一個VU占用內存的取值根據Loadrunner的版本不同而不同。
