彭振龍
(泉州師范學院陳守仁工商信息學院,福建泉州 362000)
隨著互聯網技術及應用的飛速發展,軟件系統的性能已是衡量軟件質量的一個重要指標.根據CNNIC發布的第29次報告,截止2011年底,中國的網民數量已達到5.13億,網站數量達到229.6萬,CN的域名注冊數量達353萬[1].所有這些基于B/S架構的網絡服務都面臨性能問題,如大型電子商務網站促銷或高考分數公布,人們會在同一時間要求服務器響應服務,瞬時負載有可能達到或超過系統所能承受的極限,導致系統響應緩慢甚至癱瘓,因此對網絡系統進行測試和優化顯得尤為重要.而性能測試是和功能測試相對應的概念,功能測試是指為確認軟件是否能完成某項功能而進行的一系列測試,而性能測試則是指為確認軟件執行效率而實施的一系列測試行為,這包括在一定負載和壓力下軟件系統的執行效率,包括服務響應時間、連接數、穩定性、安全性、可擴展性、資源占用率等項目和指標[2-3].
利用負載測試(load testing)和壓力測試(stress testing)等性能測試方法[2-5],能有效地模擬出軟件系統在現實環境中的應用情況,通過分析軟件在不同壓力和負載下的表現,如CPU占用率、內存使用率、客戶端響應時間、網絡通信數據率等,根據工程的分析方法,找到軟件系統架構、功能模塊等方面的瓶頸,并找出軟件系統能提供的最大服務級別,從而為軟件系統的全面優化提供基本參考.
在自動化測試出現以前,性能測試工作主要依靠多臺單機,在統一指揮下,同一時刻點擊某個操作,以達到模擬并發的目的.自從性能測試的自動化工具出現后,這一工作變得簡單了許多.目前,商業性的工具主要有Loadrunner、QAload、SilkPerformance、Webload,Rational Performance Tester(RPT),而免費的測試工具主要有OpenSTA、微軟的WAST(Web Application Stress Tool).其中loadrunner以其圖形化界面直觀友好,支持協議眾多,可預測并調優系統,功能強大而深受好評[6].下面以loadrunner為例進行討論,為了后面論述的方便先介紹一下loadrunner在性能測試中所涉及的重要概念.
并發:指有多個業務操作在同一時間發生.
事務:用于度量服務器響應時間的任務或操作集.
虛擬用戶(Vuser):是指通過loadrunner軟件模擬出真實用戶,通常在同一臺機器中可以模擬出很多虛擬用戶.
吞吐量:一定時間內,處理客戶端請求的數量,直接反映了軟件的性能承載能力.
思考時間:用戶在執行兩個連續操作期間等待的時間.
集合點:用于同步虛擬用戶以便恰好在同一時刻執行任務.
測試環境主要包括服務器的硬件環境如CPU、硬盤、內存、網卡、網絡帶寬等,軟件環境主要包括操作系統、數據庫、web服務器軟件等.同時還需要根據用戶使用手冊列出的在某個并發數下的服務響應時間,內存及CPU的占用率等要求達到的性能指標,以便在進行測試結果分析時參考.
Loadrunner允許用戶通過實際的操作來錄制腳本,當然對于非常熟悉loadrunner腳本編寫的用戶,也可以手動編輯腳本.對于B/S系統,在錄制腳本前,需選擇“web(http/html)”協議,如圖1所示.之后設置錄制參數,如圖2所示.完成后,點擊OK,則啟動web服務,開始錄制腳本.錄制期間,用戶通過瀏覽器與服務正常會話,loadrunner會記錄下用戶的所有動作.用戶可以點擊錄制工具條上的“”,以停止錄制,如圖3所示,此時loadrunner自動生成測試腳本.
腳本錄制完成后,需要對其進行完善,比如加入集合點、加入思考時間、加入其他事務等.腳本修改的另一個重要內容就是“參數化”.所謂的參數化是指對不允許重復輸入的數據,需要用變量(參數)代替固定文本.例如在測試注冊事務過程中,錄制的腳本如下:
Web_submit_form(“register.jsp”,

圖1 loadrunner腳本錄制協議選擇框
“Snapshot=t2.inf”,
ITEMDATA,
“Name=unitname”,“value=jxndpzl”,ENDITEM,
LAST);
其中的“value=jxndpzl”是錄制腳本時注冊用戶名.顯然,在實際業務中不允許再次注冊一個jxndpzl的用戶名.這就導致在腳本回放或者要模擬多個用戶同時注冊時,腳本無法成功提交.因此需要對腳本進行參數化,即將
“Name=unitname”,“value=jxndpzl”,ENDITEM.改為
“Name=unitname”,“value={punitname} ”,ENDITEM.
其中的punitname即是代表注冊用戶名的參數,它可以是一個文本文件或數據庫,具體的設置可參見文獻[2].
腳本錄制完成后,由loadrunner的controller負責測試場景的設置.如Vuser的生成數量,持續運行時間、加壓及減壓規則等.還有其他用于腳本調試和運行控制的設置,如連接超時、運行、中斷、停止、中間檢查點、路徑轉換、監視器設置等.這些設置都將更好地幫助模擬真實的使用環境,并且更好地理解性能測試的過程,從而找出性能瓶頸.以下為場景設置的一個例子:
(1)Vuser的數量為200
(2)每5 s增加10個Vuser
(3)Vuser登錄后,持續運行時間為5 min
(4)思考時間為15 s,并在30%~100%之間隨機
(5)每2 s退出12個Vuser
很顯然,可以設置不同策略,設置不同的場景,同一場景中也可以加載不同的事務.
根據前面設置的場景,執行已經錄制好的腳本.實際上為了得到更為真實的測試結果,需要設置許多不同的場景進行測試,而錄制好的腳本不用修改或只需要簡單的微調就可以,這樣就為后續的結果分析準備了更多的數據.
Loadrunner擁有專門的分析工具Analysis,它利用數學及統計學原理,具有強大的數據分析能力,而且還能將數據分析的結果通過可視化的方式展示出來.圖4為Analysis界面.

圖2 錄制參數設置框

圖3 腳本錄制工具條
下面,通過一個實際例子說明loadrunner進行性能測試并調優的過程.筆者測試的是一個電子政務系統.限于文章篇幅,略去了腳本錄制及修改過程.測試場景設置如下.

圖4 loadrunner Analysis主界面
只測試了三個事務.(1)登錄事務,即后文的vuser_init_Transaction;(2)點擊一般案件登記,即后文的“點擊一般案件登記”事務;(3)一般案件的保存事務,即后文的“點擊保存”事務.同時,設計了五個場景.(1)50個用戶并發;(2)100個用戶并發;(3)200個用戶并發(主測試機和負載生成器各100個);(4)300個用戶并發(主測試機100個,負載生成器200個);(5)500個用戶并發(主測試機200個,負載生成器300個),共有15個事務(見表1)限于篇幅,點擊一般案件登記事務只列出了res100.lrr,而res100and100.lrr即表示主附測試機各100個Vuser,共200個用戶同時登錄,在表中省略,以此類推,點擊保存事務與此一樣.

表1 事務名稱及說明
負載方案為同時加載所有Vuser,減壓方式為5 min內依次減為0,實際測試過程中,得到的實際Vuser情況如表2所示.

表2 Vuser用戶數量表
從表2中可以看出,當總Vuser數量在200、300、500時,最大值并不能達到相應的數量,說明負載生成器本身無法達到在某個時間內生成相應數量Vuser的要求.
測試過程中,選擇重點需要關注的平均事務響應時間、吞吐量、Vuser連接數等數據進行分析.限于篇幅,只選擇了點擊“保存”事務在不同場景下的數據進行分析.平均事務響應時間見表3.

表3 平均事務響應時間表
從表3中可以看出,平均響應時間隨著用戶數量的增加而增加,但根據最大值顯示,當用戶數達到300、500時,分別為19.778 s及21.086 s,這個值是比較大的,說明系統在這一壓力下已經出現了一定的瓶頸.

表4 不同負載壓力下的每秒點擊數統計
根據表4的統計數據,當Vuser數為300、500時,平均點擊數分別為561.984,560.913,這顯然于實際的應用不相符,說明當Vuser為500時,系統出現了明顯的瓶頸,導致服務器無法接受點擊.
由表5可知當Vuser為500時,服務器的平均吞吐量反而比Vuser為300時的平均吞吐量更少,說明系統出現了嚴重的瓶頸,已經無法正常處理用戶請求了.
同樣的當Vuser為500時,平均連接數反而比Vuser為300時小,其最大值也只多3(見表6).其他如Vuser數為50,100,200時,系統的最大連接數也沒能達到,這有可能是負載生成有服務器有瓶頸,導致用戶丟失,也有可能是服務器系統已經無法正常接受用戶的連接,則需要加大用戶連接數.

表5 不同負載下的服務器吞吐量數據

表6 服務器連接數
通過對平均事務響應時間、吞吐量、點擊數、服務器連接數等幾個數據的分析,基本可以判斷,在排除其他問題的前提下,該系統能接受的用戶并發數為300以下.從表2~6的數據可以看出,平均值、最大值都存在瓶頸,而該系統的最優性能(最大能承受的并發用戶數,在此條件下其他事務的執行表現),則需要反復地改變測試參數進行嘗試.
就用戶登錄、案件登記、保存三個事務而言,耗時最長的是用戶登錄,這主要是因為用戶登錄需要在后臺數據庫進行查重,這不但需要進行一定的IO操作,而且不同的查重算法也會有不同的性能表現.后來與軟件開發人員進行了研究,優化了文件的IO操作及用戶名登錄的查重算法,使得服務器響應時間進一步減少.
在實際測試過程中,當負載運行時,監控測試機的CPU使用率幾乎都是100%,這可能導致很多虛擬用戶無法發送出去,這一點在表2中也得到了印證.這必然會影響測試結果的準確性.同時,通過監視網絡、網卡在測試期間的性能,但并沒有發現瓶頸問題.這可能是因為此次測試是在局域網內測試,網絡速度較快.
軟件測試對B/S結構的系統具有非常重要的意義.通過將負載及壓力測試的結果與系統設計的性能要求進行比較,開發人員能有效地了解系統各模塊及整體的性能,從而為滿足預設的性能要求提供優化參考方案.自動化性能測試工具loadrunner具有支持協議多、界面友好、圖表豐富、功能強大的特點,成為我們在進行性能測試時的有力助手.
常用的軟件性能測試方式是基于既定的軟硬件資源,設置用戶數、并發數、任務數等進行測試分析和評估的.這對于用戶數、并發數、任務數有既定目標的系統是適用的,即為了達到這一目標,不斷提升硬件配置,不斷進行軟件調優.但如果想得到某個現有系統(既定的硬軟件系統)的最優性能,則需要不斷調整參數,重復嘗試,這導致工作量成倍增長.后續的研究將致力于基于既定目標的“逆向測試”,即用比較簡單的方式找到使系統性能表現最佳的用戶數、并發數、任務數等指標.
[1]中國互聯網絡信息中心.中國互聯網絡發展狀況調查統計報告[R].中國互聯網絡信息中心,2012.
[2]于涌.軟件性能測試與loadrunner實戰[M].北京:人民郵電出版社,2008:27-36.
[3]段念.軟件性能測試過程詳解與案例剖析[M].北京:清華大學出版社,2006:42-48.
[4]熊忠陽,李光勇,張玉芳,等.Web集群系統性能測試與優化[J].計算機應用研究,2008,25(3):826-832.
[5]文俊浩,桑春艷,何盼.電子政務系統性能測試應用研究[J].計算機科學,2009,36(4):179-180.
[6]MENASCE D A.Load testing ofweb wite[J].IEEE InternetComputing,2002,6(4):66-75.