唐承玲 王 虎 李光平 唐春蓬
(汽車噪聲振動(dòng)與安全技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,重慶 401122)
隨著互聯(lián)網(wǎng)的飛速發(fā)展、計(jì)算機(jī)的普及,Web 應(yīng)用系統(tǒng)已滲透到人們的生活及工作中。隨著網(wǎng)絡(luò)的發(fā)展,用戶對(duì)計(jì)算機(jī)、網(wǎng)絡(luò)的依賴性越來(lái)越大,在使用Web應(yīng)用強(qiáng)大、便捷的功能同時(shí),用戶也更加關(guān)注Web應(yīng)用的良好性能。用戶期望能獲得更快、更高的服務(wù)品質(zhì)。軟件的性能測(cè)試已成為衡量軟件質(zhì)量的重要標(biāo)準(zhǔn)之一。
性能測(cè)試的價(jià)值就是保障系統(tǒng)的性能,提供良好的用戶體驗(yàn);盡可能地找出系統(tǒng)性能薄弱環(huán)節(jié),幫助進(jìn)行性能優(yōu)化。
Apache JMeter是Apache組織開(kāi)發(fā)的基于Java的壓力測(cè)試工具,用于對(duì)軟件做壓力測(cè)試。它最初被設(shè)計(jì)用于Web應(yīng)用測(cè)試,后來(lái)擴(kuò)展到其他測(cè)試領(lǐng)域。它可以用于測(cè)試靜態(tài)和動(dòng)態(tài)資源,例如靜態(tài)文件、Java 小服務(wù)程序、CGI 腳本、Java對(duì)象、數(shù)據(jù)庫(kù)、FTP服務(wù)器等等[1]。
JMeter 的工作原理是通過(guò)線程組來(lái)驅(qū)動(dòng)多個(gè)線程運(yùn)行測(cè)試腳本對(duì)被測(cè)服務(wù)器發(fā)起負(fù)載,每一個(gè)負(fù)載機(jī)上都可以運(yùn)行多個(gè)線程組[1]。
在Web性能測(cè)試中,JMeter軟件被當(dāng)作Web服務(wù)器與瀏覽器之間的一個(gè)代理網(wǎng)管,模擬在服務(wù)器、網(wǎng)絡(luò)或者其他對(duì)象上附加高負(fù)載以測(cè)試他們提供服務(wù)的受壓能力,或者分析他們提供的服務(wù)在不同負(fù)載條件下的總性能情況。
使用JMeter 進(jìn)行性能測(cè)試具有以下優(yōu)勢(shì):開(kāi)源免費(fèi),文件小安裝方便,不受軟件界面改動(dòng)的影響,操作簡(jiǎn)單易上手,可進(jìn)行功能定制或擴(kuò)充,不需要關(guān)注對(duì)象是否被識(shí)別的問(wèn)題,可以通過(guò)其自帶的配置元件及其他元件的組合來(lái)處理復(fù)雜的業(yè)務(wù)邏輯,測(cè)試腳本維護(hù)方便[1]。
Web性能測(cè)試是指在各種負(fù)載條件下,利用測(cè)試工具模擬運(yùn)行被測(cè)系統(tǒng),以此獲得該系統(tǒng)的各種性能指標(biāo),并對(duì)所得結(jié)果加以分析的一種測(cè)試活動(dòng)。性能測(cè)試的目的主要體現(xiàn)在以下5點(diǎn)[2]:
(1)驗(yàn)證系統(tǒng)是否達(dá)到用戶預(yù)期的性能目標(biāo)。
(2)尋找系統(tǒng)的最優(yōu)配置,獲取最小的系統(tǒng)成本。
(3)挖掘存在的性能缺陷和瓶頸,以此優(yōu)化系統(tǒng)。
(4)驗(yàn)證系統(tǒng)是否具有穩(wěn)定性、可靠性。
(5)預(yù)測(cè)未來(lái)性能。當(dāng)用戶數(shù)和業(yè)務(wù)量增加時(shí)能否及時(shí)應(yīng)對(duì)?如何調(diào)整?是增加應(yīng)用服務(wù)器,還是數(shù)據(jù)庫(kù)服務(wù)器,還是要優(yōu)化代碼邏輯?
性能測(cè)試是在軟件可靠性和正確性的基礎(chǔ)上側(cè)重效率方面的驗(yàn)證,是在功能測(cè)試的基礎(chǔ)上測(cè)試軟件在集成系統(tǒng)中的運(yùn)行性能。Web性能測(cè)試一般包含以下6項(xiàng)[2]:
(1)負(fù)載測(cè)試:通過(guò)不斷加壓直到系統(tǒng)性能測(cè)試瓶頸或資源達(dá)到飽和。
(2)壓力測(cè)試:系統(tǒng)在一定的負(fù)載下長(zhǎng)時(shí)間運(yùn)行的穩(wěn)定性,關(guān)注大業(yè)務(wù)量下系統(tǒng)長(zhǎng)時(shí)間運(yùn)行時(shí)性能的變化,確定在什么負(fù)載條件下,系統(tǒng)性能處于失效狀態(tài)。
(3)配置測(cè)試:通過(guò)對(duì)被測(cè)系統(tǒng)的軟硬件環(huán)境的調(diào)整,找到系統(tǒng)各項(xiàng)資源的最優(yōu)分配原則。
(4)并發(fā)測(cè)試:模擬多用戶并發(fā)訪問(wèn)同一應(yīng)用的測(cè)試,記錄是否存在線程鎖、資源爭(zhēng)用、內(nèi)存泄漏等問(wèn)題。
(5)容量測(cè)試:運(yùn)行一種或多種業(yè)務(wù)場(chǎng)景在一定虛擬用戶數(shù)量的情況下,獲取不同數(shù)量級(jí)別的性能指標(biāo),從而得到數(shù)據(jù)庫(kù)能夠處理的最大會(huì)話能力、最大容量等。
(6)可靠性測(cè)試:給系統(tǒng)加載一定的業(yè)務(wù)壓力,讓其持續(xù)運(yùn)行一段時(shí)間,測(cè)試系統(tǒng)是否可以穩(wěn)定運(yùn)行。
軟件的性能從不同角度來(lái)看會(huì)有不同的結(jié)果,以下從3個(gè)不同的角度來(lái)看待軟件的性能[3]:
(1)用戶角度:他們關(guān)心的是應(yīng)用程序的單步響應(yīng)時(shí)間,也就是數(shù)據(jù)流經(jīng)過(guò)服務(wù)器/服務(wù)器集群經(jīng)過(guò)網(wǎng)絡(luò)傳輸后往返的時(shí)間總和。例如當(dāng)用戶點(diǎn)擊“查詢”按鈕后多長(zhǎng)時(shí)間能獲得結(jié)果。
(2)軟件開(kāi)發(fā)者的角度:他們關(guān)注的是功能的代碼實(shí)現(xiàn),數(shù)據(jù)庫(kù)的設(shè)計(jì),框架設(shè)計(jì)是否合理,系統(tǒng)里內(nèi)存的使用方法是否合理,線程使用方式是否合理,系統(tǒng)資源是否存在不合理競(jìng)爭(zhēng)。
(3)運(yùn)維人員的角度:他們關(guān)注的是系統(tǒng)所有服務(wù)器是否正常運(yùn)行,數(shù)據(jù)庫(kù)、中間件等服務(wù)器的硬件資源利用率情況,內(nèi)存是否有可用空間,CPU 是否超過(guò)70%,網(wǎng)絡(luò)是否順暢,I/O是否存在瓶頸。
體現(xiàn)軟件性能的數(shù)據(jù)我們稱之為性能指標(biāo)[4],常見(jiàn)的Web性能指標(biāo)如下:
(1)響應(yīng)時(shí)間:用戶從客戶端發(fā)出請(qǐng)求,并得到響應(yīng),以及展示出來(lái)的整個(gè)過(guò)程的時(shí)間。
(2)吞吐量:每秒鐘系統(tǒng)能夠處理的請(qǐng)求數(shù)/事務(wù)數(shù)。
(3)資源利用率:系統(tǒng)中不同資源的使用程度,如CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)帶寬等。
(4)并發(fā)用戶數(shù):系統(tǒng)能同時(shí)處理的請(qǐng)求數(shù)/事務(wù)數(shù)。
(5)錯(cuò)誤率:一段時(shí)間內(nèi)出錯(cuò)的請(qǐng)求在總請(qǐng)求數(shù)中的占比。
(6)平均傳輸帶寬:計(jì)算服務(wù)端的數(shù)據(jù)傳輸量。
性能測(cè)試實(shí)施流程能夠加強(qiáng)測(cè)試工作的控制,明確測(cè)試各階段應(yīng)完成的工作,主要流程如下:
(1)性能測(cè)試準(zhǔn)備工作:組建團(tuán)隊(duì),需求調(diào)研,選擇工具。
(2)性能測(cè)試計(jì)劃:分析測(cè)試背景、用戶場(chǎng)景,確定性能指標(biāo),制定性能測(cè)試實(shí)施計(jì)劃。
(3)性能測(cè)試設(shè)計(jì):測(cè)試環(huán)境設(shè)計(jì),測(cè)試場(chǎng)景設(shè)計(jì),測(cè)試用例設(shè)計(jì),編寫(xiě)或錄制測(cè)試腳本。
(4)性能測(cè)試執(zhí)行:部署測(cè)試環(huán)境,執(zhí)行測(cè)試腳本,性能監(jiān)控和記錄。
(5)性能測(cè)試報(bào)告:根據(jù)執(zhí)行結(jié)果,整理編寫(xiě)性能測(cè)試報(bào)告。
(6)性能測(cè)試總結(jié):根據(jù)執(zhí)行結(jié)果對(duì)比性能指標(biāo),分析并統(tǒng)計(jì)系統(tǒng)的性能瓶頸,給出系統(tǒng)調(diào)優(yōu)建議。
文章以某個(gè)項(xiàng)目管理系統(tǒng)為例,該項(xiàng)目管理系統(tǒng)主要包括項(xiàng)目管理、協(xié)議管理、市場(chǎng)拓展、維修改造、接管項(xiàng)目五個(gè)模塊。其中項(xiàng)目信息填報(bào)列表的查詢是最為重要的,使用頻率最高,因此以查詢項(xiàng)目信息填報(bào)列表接口為例使用JMeter軟件進(jìn)行Web性能測(cè)試。系統(tǒng)頁(yè)面如圖1所示。
圖1 項(xiàng)目管理系統(tǒng)
(1)小組準(zhǔn)備3個(gè)人參加,與項(xiàng)目經(jīng)理、產(chǎn)品經(jīng)理一起對(duì)需求進(jìn)行調(diào)研。
(2)搭建測(cè)試環(huán)境,將此系統(tǒng)安裝到與線上環(huán)境相似的測(cè)試環(huán)境服務(wù)器上。
(3)準(zhǔn)備數(shù)據(jù),新增10萬(wàn)條項(xiàng)目管理填報(bào)數(shù)據(jù)。
(4)根據(jù)接口文檔詳細(xì)信息,打開(kāi)JMeter工具,將服務(wù)器地址、端口號(hào)、路徑等參數(shù)填入HTTP請(qǐng)求中。
(5)添加監(jiān)聽(tīng)器來(lái)記錄測(cè)試結(jié)果,在線程組或HTTP請(qǐng)求下添加“察看結(jié)果樹(shù)”“聚合報(bào)告”“響應(yīng)時(shí)間圖”“圖形結(jié)果”“PerfMon Metrics Collector”。在“PerfMon Metrics Collector”界面上添加需要監(jiān)控的服務(wù)器對(duì)應(yīng)的CPU、Memory、Disks I/O。對(duì)腳本所做的設(shè)置如圖2所示。
圖2 腳本設(shè)置
根據(jù)項(xiàng)目管理系統(tǒng)的需求,首先并發(fā)用戶數(shù)從100開(kāi)始,逐漸增加100,最大并發(fā)用戶數(shù)為500,制定性能指標(biāo)如表1所示。
表1 測(cè)試系統(tǒng)性能指標(biāo)
在腳本中線程組界面,對(duì)屬性“線程數(shù)”“Ramp-Up Period(in seconds)”“循環(huán)次數(shù)”“調(diào)度器配置”設(shè)置不同的屬性值,可實(shí)現(xiàn)系統(tǒng)在不同負(fù)載下的性能測(cè)試。結(jié)合本實(shí)例系統(tǒng)的性能指標(biāo),計(jì)劃如表2所示。
表2 性能測(cè)試計(jì)劃
根據(jù)測(cè)試計(jì)劃,運(yùn)行腳本,可看到測(cè)試結(jié)果如表3所示。
表3 性能測(cè)試結(jié)果
測(cè)試執(zhí)行時(shí)監(jiān)控的資源利用率結(jié)果如圖3-圖7所示。
圖3 測(cè)試計(jì)劃1的資源利用率結(jié)果
圖4 測(cè)試計(jì)劃2的資源利用率結(jié)果
圖5 測(cè)試計(jì)劃3的資源利用率結(jié)果
圖6 測(cè)試計(jì)劃4的資源利用率結(jié)果
圖7 測(cè)試計(jì)劃5的資源利用率結(jié)果
對(duì)上述測(cè)試結(jié)果,分析如下:
(1)當(dāng)并發(fā)用戶數(shù)為100 時(shí),平均響應(yīng)時(shí)間是0.502 秒,CPU 使用率比較低,平均值在36%左右,內(nèi)存使用率保持平穩(wěn),平均在43%左右,磁盤(pán)讀寫(xiě)速度正常,系統(tǒng)各項(xiàng)結(jié)果數(shù)據(jù)都滿足性能指標(biāo)。
(2)當(dāng)并發(fā)用戶數(shù)為200 時(shí),平均響應(yīng)時(shí)間是0.692 秒,CPU 使用率最高是54%,平均值在30%左右,內(nèi)存使用率保持平穩(wěn),平均在40%左右,磁盤(pán)讀寫(xiě)速度正常,系統(tǒng)各項(xiàng)結(jié)果數(shù)據(jù)都滿足性能指標(biāo)。
(3)當(dāng)并發(fā)用戶數(shù)為300 時(shí),平均響應(yīng)時(shí)間是1.345 秒,CPU使用率有些波動(dòng),最高是69%,平均值在40%左右,內(nèi)存使用率保持平穩(wěn),平均在40%左右,磁盤(pán)讀寫(xiě)速度正常,系統(tǒng)各項(xiàng)結(jié)果數(shù)據(jù)都滿足性能指標(biāo)。
(4)當(dāng)并發(fā)用戶數(shù)為400時(shí),平均響應(yīng)時(shí)間是2.597滿足指標(biāo),CPU 使用率有些波動(dòng),最高是91%,平均值在43%左右,內(nèi)存使用率保持平穩(wěn),平均在35%左右,磁盤(pán)讀寫(xiě)速度正常,最長(zhǎng)響應(yīng)時(shí)間、吞吐量、CPU使用率均未滿足性能指標(biāo)。
(5)當(dāng)并發(fā)用戶數(shù)為500時(shí),平均響應(yīng)時(shí)間是5.06,對(duì)服務(wù)器的CPU消耗比較大,小部分時(shí)間使用率達(dá)到了100%,部分時(shí)間磁盤(pán)讀寫(xiě)速度比較快。系統(tǒng)各項(xiàng)結(jié)果數(shù)據(jù)都未滿足性能指標(biāo)。
對(duì)上述測(cè)試結(jié)果做出風(fēng)險(xiǎn)判斷和建議如下:
風(fēng)險(xiǎn)一:在查詢時(shí),篩選條件同時(shí)具備了分區(qū)和索引性質(zhì),查詢語(yǔ)句只走了分區(qū),沒(méi)有走索引。
建議:采用全局索引。
風(fēng)險(xiǎn)二:當(dāng)并發(fā)用戶數(shù)為500時(shí),會(huì)大量報(bào)錯(cuò),查看日志顯示外部通信異常。
建議:建立管理線程池,支持大量并發(fā),避免線程異常拒絕。
風(fēng)險(xiǎn)三:當(dāng)并發(fā)用戶數(shù)>=400時(shí),對(duì)服務(wù)器的CPU消耗比較大,可能會(huì)造成服務(wù)器宕機(jī)。
建議:對(duì)線程隊(duì)列做限制,不能無(wú)限制地消耗服務(wù)器資源。
Web性能測(cè)試是系統(tǒng)開(kāi)發(fā)的重要環(huán)節(jié),它能保障系統(tǒng)性能,給用戶提供良好體驗(yàn)。文章以某項(xiàng)目管理系統(tǒng)為例,給出了基于JMeter測(cè)試工具的性能測(cè)試方案,根據(jù)測(cè)試需求制定了性能指標(biāo),根據(jù)測(cè)試計(jì)劃設(shè)置了不同場(chǎng)景下的性能測(cè)試,根據(jù)測(cè)試的執(zhí)行結(jié)果,分析了該項(xiàng)目管理系統(tǒng)的性能瓶頸,給出了風(fēng)險(xiǎn)判斷及優(yōu)化策略。