林克強,趙秀娟
(1.中國電子科技集團公司第五十四研究所,河北石家莊050081;2.石藥集團河北中誠醫(yī)藥有限公司,河北石家莊050081)
系統(tǒng)的性能是一個很大的概念,覆蓋面非常廣泛,對一個軟件系統(tǒng)而言,包括執(zhí)行效率、資源占用、穩(wěn)定性、安全性、兼容性、可擴展性以及可靠性等。負載壓力是系統(tǒng)性能的一個重要方面,是指在一定約束條件下測試系統(tǒng)所能承受的并發(fā)用戶量、運行時間、數(shù)據(jù)量,以確定系統(tǒng)所能承受的最大負載壓力[3]。在一個大型應(yīng)用系統(tǒng)里,某些業(yè)務(wù)操作對特定角色用戶來講存在很大的同時操作的可能性??蛻舳舜罅康牟l(fā)操作提高了網(wǎng)絡(luò)的吞吐量,加劇了服務(wù)器資源互斥訪問沖突,加大了數(shù)據(jù)庫死鎖的可能。這樣的負載壓力輕則會導致系統(tǒng)性能低下,重則會對系統(tǒng)造成破壞,給用戶帶來經(jīng)濟損失。因此負載壓力測試對于保證系統(tǒng)的性能是非常關(guān)鍵的。基于Loadrunner的并發(fā)性能測試需要確定并發(fā)用戶數(shù)和設(shè)置集合點,以達到在服務(wù)器上創(chuàng)建密集的用戶負載。
關(guān)于并發(fā)用戶和集合點的定義如下:
并發(fā)用戶:通過模擬用戶的并發(fā)訪問,測試多用戶同時訪問同一個應(yīng)用、同一個模塊或者數(shù)據(jù)記錄時是否存在死鎖或者其他性能問題[2]。當然這個“同時”可以理解為同一時間段,還可以理解為同一時間點,當然如果說并發(fā)就是同一時間點上同時操作的用戶,這樣理解沒有錯誤,但對于實際情況來講,是沒有嚴格意義上的并發(fā)執(zhí)行的,就如同進程和線程關(guān)系一樣,在某一個點嚴格上講就只有一個人得到執(zhí)行的權(quán)利。
集合點:用以同步虛擬用戶以便恰好在同一時刻執(zhí)行任務(wù)??梢栽诜?wù)器上創(chuàng)建密集的用戶負載[1]。對于Loadrunner來說,集合點只是一種策略,而這個策略也會有很多規(guī)則,因為實際情況中并非所有用戶都會同時到達集合點,因為從客戶端發(fā)出到網(wǎng)絡(luò)、中間件、應(yīng)用層再到數(shù)據(jù)庫,這其中的每一個環(huán)節(jié)都有延時,也就是說不可能所有的用戶都能到達所謂的集合點才開始同時執(zhí)行操作。
從上面2個概念的理解來講,有人就會思考,并發(fā)用戶和集合點到底有沒有關(guān)系,這才是關(guān)鍵。當然這個就要看需求是什么了,所以在很多時候誤用集合點和并發(fā)用戶,其實根本原因在于對需求的理解。
從概念上認為要得到并發(fā)用戶就必須設(shè)置集合點,認為在執(zhí)行一個壓力測試腳本時,設(shè)置了集合點才算是有效的并發(fā)用戶,沒有設(shè)置集合點,就認為可能這個就不能準確地代表并發(fā)用戶數(shù)。
先來看一個應(yīng)用系統(tǒng)的結(jié)構(gòu)圖,如圖1所示。
圖1 應(yīng)用系統(tǒng)結(jié)構(gòu)圖
圖1比較直觀、簡潔地反映了一個應(yīng)用系統(tǒng)的運行過程,其中包括客戶端、網(wǎng)絡(luò)、應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器,其中每一個環(huán)節(jié)都是在執(zhí)行性能測試分析中必不可少的元素,結(jié)構(gòu)圖中也合理地分析出了響應(yīng)時間的處理過程,當請求從客戶端發(fā)出之后到最后返回客戶端,這個過程中每一個環(huán)節(jié)的處理都有可能最后成為系統(tǒng)運行中的性能瓶頸,所以可見對系統(tǒng)整體結(jié)構(gòu)的理解是何等重要。
假設(shè)有一個OA系統(tǒng),該系統(tǒng)有2 000個使用用戶——這就是說,可能使用該OA系統(tǒng)的用戶總數(shù)是2 000名,這個概念就是“系統(tǒng)用戶數(shù)”,該系統(tǒng)有一個“在線統(tǒng)計”功能(系統(tǒng)用一個全局變量計數(shù)所有已登錄的用戶),從在線統(tǒng)計功能中可以得到,最高峰時有500人在線(這個500就是一般所說的“同時在線人數(shù)”),那么,系統(tǒng)的并發(fā)用戶數(shù)是多少呢?
根據(jù)對并發(fā)用戶數(shù)的定義,這500就是整個系統(tǒng)使用時最大的業(yè)務(wù)并發(fā)用戶數(shù)。當然,500這個數(shù)值只是表明在最高峰時刻有500個用戶登錄了系統(tǒng),并不表示實際服務(wù)器承受的壓力。因為服務(wù)器承受的壓力還與具體的用戶訪問模式相關(guān)。例如,在這500個“同時使用系統(tǒng)”的用戶中,考察某一個時間點,在這個時間上,假設(shè)其中40%的用戶在饒有興致地看系統(tǒng)公告(注意:“看”這個動作是不會對服務(wù)端產(chǎn)生任何負擔的),20%的用戶在填寫復雜的表格(對用戶填寫的表格來說,只有在“提交”的時刻才會向服務(wù)端發(fā)送請求,填寫過程是不對服務(wù)端構(gòu)成壓力的),20%部分用戶在發(fā)呆(也就是什么也沒有做),剩下的20%用戶在不停地從一個頁面跳轉(zhuǎn)到另一個頁面——在這種場景下,可以說,只有20%的用戶真正對服務(wù)器構(gòu)成了壓力。因此,從上面的例子中可以看出,服務(wù)器實際承受的壓力不只取決于業(yè)務(wù)并發(fā)用戶數(shù),還取決于用戶的業(yè)務(wù)場景。
所以說要理解集合點和并發(fā)數(shù),從根本上就應(yīng)該更清晰地理解業(yè)務(wù)流程,只有把業(yè)務(wù)分析清楚了,方才可以合理地使用集合點,正確地理解并發(fā)用戶數(shù)。
通過Loadrunner的理解,我認為Loadrunner本身就已經(jīng)在模擬實現(xiàn)一個并發(fā)的過程,而增加集合點設(shè)置只是為了實現(xiàn)嚴格意義上的所謂并發(fā),而實際是這個集合點的設(shè)置也并非絕對達到了這個目的,結(jié)構(gòu)圖中的過程就可以證明。當然,為此也通過一些實例來做驗證,以下是對cetcbbs內(nèi)部論壇首頁,錄制訪問過程,腳本如下:
腳本1:設(shè)置集合點
在場景中設(shè)置100個并發(fā)用戶,執(zhí)行2個腳本之后,可以得到它們的平均事務(wù)響應(yīng)時間,如圖2和圖3所示,從圖中可以看到2個腳本的運行結(jié)果相差很小。
圖2 腳本1平均事務(wù)響應(yīng)時間
圖3 腳本2平均事務(wù)響應(yīng)時間
集合點在性能測試中并不是沒有作用,而是要理解如何選擇去用它,這才是關(guān)鍵。
在一些業(yè)務(wù)流程比較復雜的應(yīng)用程序測試中,就必須要使用集合點。比如一個應(yīng)用系統(tǒng)中業(yè)務(wù)是這樣的:用戶登錄進入之后,一部分人在完善資料,一部分人在查詢數(shù)據(jù),另一部分人在執(zhí)行刪除操作,還有一部分人在發(fā)送消息等等。就這樣的一個業(yè)務(wù)中,在模擬執(zhí)行性能測試時,就必須明確并發(fā)用戶跟集合點的關(guān)系,在實際錄制腳本的時候,就需要把這個業(yè)務(wù)分割成多個事務(wù),然后分別對各個不同的事務(wù)設(shè)置集合點。
為什么此時要使用集合點呢?因為必須分析出每一個事務(wù)的并發(fā)情況,加入200個用戶進去之后,就這樣放任這200個用戶自由去操作,就不能判斷出查詢并發(fā)數(shù)多少、刪除并發(fā)數(shù)多少、發(fā)送消息的并發(fā)數(shù)又是多少,因為進入系統(tǒng)之后,沒辦法確定200個用戶都同時干了些什么,所以此處才是集合點使用最合理的地方。
通常情況,主要是對單一業(yè)務(wù)進行壓力測試,如登錄或者注冊,單一功能就如同上面的那個訪問web頁面一樣,腳本只有一個操作,此時對于Loadrunner來講,其實有沒有設(shè)置集合點效果不大,而且為了模擬能更加接近實際情況,當然這也是要做實際分析的。
性能測試的執(zhí)行應(yīng)該是有目的,通常是為了調(diào)優(yōu),也有的是為了評測。在以評測為目的的性能測試中,用戶更關(guān)心的是業(yè)務(wù)上的并發(fā),其實是真實業(yè)務(wù)場景的并發(fā)情況,這種情況下就不需要設(shè)置集合點了。
集合點是一種特殊情況下的并發(fā),通常是在以調(diào)優(yōu)為目的的性能測試中才會用到,主要是為了有針對性的進行施壓,以便找到性能瓶頸。
[1]于涌.軟件性能測試與LOADRUNNER實戰(zhàn)[M].北京:人民郵電出版社,2008.
[2]段念.軟件性能測試過程詳解與案例剖析[M].北京:清華大學出版社,2006.
[3]柳純錄.軟件評測師教程[M].北京:清華大學出版社,2005.