性能測(cè)試淺談
性能測(cè)試的目的,簡(jiǎn)單說(shuō)其實(shí)就是為了獲取待測(cè)系統(tǒng)的響應(yīng)時(shí)間、吞吐量、穩(wěn)定性、容量等信息。而發(fā)現(xiàn)一些具體的性能相關(guān)的缺陷(如內(nèi)存溢出、并發(fā) 處理等問(wèn)題),我認(rèn)為只是一種附加結(jié)果。從更高的層次來(lái)說(shuō),性能測(cè)試最想發(fā)現(xiàn)的,是瓶頸。如何能得到所需要的信息,就需要從多方面進(jìn)行測(cè)試。
性能測(cè)試的內(nèi)容
性能測(cè)試種類的劃分與定義這里就不說(shuō)了,各有各的說(shuō)法,比如性能測(cè)試、負(fù)載測(cè)試、壓力測(cè)試這三個(gè)詞,在網(wǎng)上能找到N個(gè)版本的定義,大體理解就行 了,沒(méi)必要在文字層面上較這個(gè)真。以下的內(nèi)容也只是我個(gè)人的理解,一些名詞的定義可能和其他資料有所不同,但在我的工作中,這樣是比較形象和容易理解的。
在實(shí)際工作,一般的應(yīng)用系統(tǒng)會(huì)從這么幾個(gè)方面進(jìn)行性能測(cè)試。
1.基準(zhǔn)測(cè)試
Benchmark或者Baseline測(cè)試。一般為單用戶測(cè)試,或者是零數(shù)據(jù)量環(huán)境下的測(cè)試。目的在于建立一個(gè)可度 量的參考標(biāo)準(zhǔn),為其他測(cè)試場(chǎng)景或者調(diào)優(yōu)過(guò)程提供對(duì)比參考。也可認(rèn)為是最基礎(chǔ)的性能測(cè)試,如果基準(zhǔn)測(cè)試的結(jié)果都不能達(dá)到預(yù)期要求,那么后續(xù)場(chǎng)景也就沒(méi)必要測(cè) 試了。
2.日常壓力測(cè)試
在基準(zhǔn)測(cè)試通過(guò)后,應(yīng)該先進(jìn)行較小壓力下的測(cè)試,首先對(duì)系統(tǒng)在日常壓力下的表現(xiàn)進(jìn)行測(cè)試。此壓力需要根據(jù)系統(tǒng)使用相關(guān)數(shù)據(jù)得出,如系統(tǒng)平均每天訪問(wèn)量、平均在線人數(shù)、每日完成事務(wù)數(shù)等。通過(guò)此測(cè)試,發(fā)現(xiàn)一些較表面的性能問(wèn)題并進(jìn)行處理。
3.峰值壓力測(cè)試
在日常壓力測(cè)試通過(guò)后,需要進(jìn)行更大壓力的測(cè)試。此處壓力同樣需要相關(guān)數(shù)據(jù)的支持,一般為未來(lái)幾年后的預(yù)期壓力。 可根據(jù)歷史日均壓力、日最高壓力等信息,估算出未來(lái)幾年的日均以及日最高壓力。再通過(guò)一些通用估算方法、如二八原則(80%的工作在20%時(shí)間內(nèi)完成,相 當(dāng)于2小時(shí)完成一天8小時(shí)的工作量),將日壓力轉(zhuǎn)換成峰值壓力。
峰值壓力為可預(yù)期到的最大負(fù)載壓力,通過(guò)了此測(cè)試,則認(rèn)為系統(tǒng)有能力滿足未來(lái)增長(zhǎng)的壓力。
4.容量測(cè)試
驗(yàn)證了系統(tǒng)是否可滿足預(yù)期的壓力后,還需要知道系統(tǒng)能夠承受的最大壓力,也就是容量。一般通過(guò)“拐點(diǎn)法”進(jìn)行測(cè)試,逐步增大系統(tǒng)的壓力,直到性能指標(biāo)不可接受或者出現(xiàn)了明顯的拐點(diǎn)。如下圖,拐點(diǎn)在哪?
5.穩(wěn)定性測(cè)試
驗(yàn)證系統(tǒng)是否可長(zhǎng)期穩(wěn)定的運(yùn)行,是否存在一些短時(shí)間內(nèi)可能無(wú)法發(fā)現(xiàn)的缺陷(如內(nèi)存溢出、數(shù)據(jù)庫(kù)連接不釋放等)。為了 縮短測(cè)試工期,一般可將預(yù)期一天的壓力集中在2小時(shí)內(nèi)完成(二八原則),這樣持續(xù)加壓10小時(shí),便相當(dāng)于系統(tǒng)運(yùn)行5天。注意監(jiān)控各種性能指標(biāo)是否平穩(wěn),有 無(wú)下降。
以上幾種類型的測(cè)試,是性能測(cè)試過(guò)程中最多用到的。當(dāng)然也也其他一些比較常用的類型,如絕對(duì)并發(fā)測(cè)試,測(cè)試多用戶對(duì)某一功能的瞬時(shí)請(qǐng)求,主要用 于驗(yàn)證系統(tǒng)是否存在并發(fā)邏輯上的處理問(wèn)題。此測(cè)試也可劃分到不同的壓力測(cè)試場(chǎng)景中去,根據(jù)不同的用戶壓力,測(cè)試相應(yīng)的絕對(duì)并發(fā),一般取在線用戶數(shù)的10% 進(jìn)行測(cè)試;突發(fā)壓力測(cè)試,對(duì)一些不在預(yù)期內(nèi)的突然壓力進(jìn)行測(cè)試(其實(shí)既然想到了,就應(yīng)該是在預(yù)期內(nèi)了)。以銀行門戶網(wǎng)站為例,可能會(huì)由于發(fā)布了一條重要消 息(政策調(diào)整)而導(dǎo)致訪問(wèn)量激增,這種壓力是否會(huì)導(dǎo)致系統(tǒng)宕機(jī)或者暫時(shí)無(wú)法提供服務(wù),就是突發(fā)壓力測(cè)試需要考慮的了。也有人將此壓力定義為峰值壓力,這就 無(wú)所謂了,只要考慮到會(huì)有這么一個(gè)問(wèn)題就夠了。
性能測(cè)試的階段
上面主要說(shuō)的是測(cè)試內(nèi)容的劃分,也就是說(shuō)做性能測(cè)試時(shí)要考慮到的幾個(gè)方面。從實(shí)際執(zhí)行層面來(lái)看,測(cè)試的過(guò)程一般分為這么幾個(gè)階段:
1.測(cè)試確認(rèn)
理解被測(cè)系統(tǒng)、尋找測(cè)試點(diǎn)、確認(rèn)測(cè)試范圍、測(cè)試環(huán)境等。一些重要信息需要同PM、需求人員、設(shè)計(jì)人員討論確認(rèn),如用戶最常用哪些功能、最關(guān)注哪的性能,程序上哪可能是壓力點(diǎn),哪些數(shù)據(jù)需要模擬到真實(shí)的量級(jí),大體上需要使用哪種測(cè)試方法。
2.確定通過(guò)標(biāo)準(zhǔn)
性能是好是壞、測(cè)試是否通過(guò),必須有明確的標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn),主要從客戶的期望和業(yè)務(wù)上的需求兩方面來(lái)考慮,客戶的 期望一般指頁(yè)面上的響應(yīng)時(shí)間,業(yè)務(wù)需求則是系統(tǒng)的處理能力,一般為吞吐量或TPS(每秒完成事務(wù)數(shù))。標(biāo)準(zhǔn)制定的不合理,測(cè)試結(jié)果可能無(wú)法反映系統(tǒng)真實(shí)的 性能表現(xiàn),或者會(huì)讓客戶無(wú)法接受我們認(rèn)為通過(guò)的軟件。
至于具體如何去設(shè)定,是需要同業(yè)務(wù)負(fù)責(zé)人(一般為PM)和技術(shù)負(fù)責(zé)人(一般為設(shè)計(jì)人員)共同確認(rèn)的,業(yè)務(wù)負(fù)責(zé)人了解用戶的實(shí)際需求和期望,技術(shù)負(fù)責(zé)人了解具體的實(shí)現(xiàn),可以判斷哪些是不可達(dá)到的要求。
一旦達(dá)成了共識(shí),那么測(cè)試就要嚴(yán)格的按照標(biāo)準(zhǔn)去執(zhí)行。
3.測(cè)試設(shè)計(jì)
主要從上面提到的幾個(gè)方面進(jìn)行分析,針對(duì)系統(tǒng)的特點(diǎn)設(shè)計(jì)出合理的測(cè)試場(chǎng)景。為了讓測(cè)試結(jié)果更加準(zhǔn)確,這里需要很細(xì)致的 工作。如建立用戶模型,只有知道真實(shí)的用戶是如何對(duì)系統(tǒng)產(chǎn)生壓力,才可以設(shè)計(jì)出有代表性的壓力測(cè)試場(chǎng)景。這就涉及到很多信息,如用戶群的分布、各類型用戶 用到的功能、用戶的使用習(xí)慣、工作時(shí)間段、系統(tǒng)各模塊壓力分布等等。只有從多方面不斷的積累這種數(shù)據(jù),才會(huì)讓壓力場(chǎng)景更有意義。最后將設(shè)計(jì)場(chǎng)景轉(zhuǎn)換成具體 的用例。
測(cè)試數(shù)據(jù)的設(shè)計(jì)也是一個(gè)重點(diǎn)且容易出問(wèn)題的地方。生成測(cè)試數(shù)據(jù)量達(dá)到未來(lái)預(yù)期數(shù)量只是最基礎(chǔ)的一步,更需要考慮的是數(shù)據(jù)的分布是否合 理,需要仔細(xì)的確認(rèn)程序中使用到的各種查詢條件,這些重點(diǎn)列的數(shù)值要盡可能的模擬真實(shí)的數(shù)據(jù)分布(數(shù)據(jù)統(tǒng)計(jì)信息、執(zhí)行計(jì)劃相關(guān)的內(nèi)容,此處就不細(xì)說(shuō)了), 否則測(cè)試的結(jié)果可能是無(wú)效的。
此外,性能測(cè)試執(zhí)行過(guò)程中,需要監(jiān)控收集的各種指標(biāo)數(shù)據(jù),也需要明確下來(lái)。
4.測(cè)試環(huán)境準(zhǔn)備
部署測(cè)試環(huán)境,生成測(cè)試數(shù)據(jù),環(huán)境預(yù)調(diào)優(yōu)等等。預(yù)調(diào)優(yōu)指根據(jù)系統(tǒng)的特點(diǎn)和自己的經(jīng)驗(yàn),提前對(duì)系統(tǒng)的各個(gè)方面做一些優(yōu)化調(diào)整,避免測(cè)試執(zhí)行過(guò)程中的無(wú)謂返工。比如一個(gè)高并發(fā)的系統(tǒng),10000人在線,連接池和線程池的配置還用默認(rèn)的,顯然是會(huì)測(cè)出問(wèn)題的。
5.測(cè)試執(zhí)行、監(jiān)控
準(zhǔn)備測(cè)試腳本,執(zhí)行之前設(shè)計(jì)好的各個(gè)用例,監(jiān)控并收集需要的數(shù)據(jù)。出現(xiàn)問(wèn)題時(shí),切記要全面的保留事故現(xiàn)場(chǎng)、或者是能進(jìn)行分析的數(shù)據(jù)。比如TOMCAT不再響應(yīng),不能只把這個(gè)現(xiàn)象記錄下來(lái),這對(duì)問(wèn)題的排查定位是沒(méi)有意義的,要保留所有相關(guān)的日志,導(dǎo)出線程轉(zhuǎn)儲(chǔ)和堆轉(zhuǎn)儲(chǔ)。
6.問(wèn)題分析定位、調(diào)優(yōu)
發(fā)現(xiàn)問(wèn)題或者性能指標(biāo)達(dá)不到預(yù)期,及時(shí)的分析定位,處理后重復(fù)測(cè)試過(guò)程。
性能問(wèn)題通常是相互關(guān)聯(lián)相互影響的,表面上看到的現(xiàn)象很可能不是根本問(wèn)題,而是另一處出現(xiàn)問(wèn)題后引起的反應(yīng)。這就要求監(jiān)控收集數(shù)據(jù)時(shí)要全面,從多方面多個(gè)角度去判斷定位。
調(diào)優(yōu)的過(guò)程其實(shí)也是一種平衡的過(guò)程,在系統(tǒng)的多個(gè)方面達(dá)到一個(gè)平衡即可。
7.性能報(bào)告
將測(cè)試過(guò)程中記錄的各種數(shù)據(jù)匯總成報(bào)告,將各方面需要的結(jié)果清楚的展現(xiàn)出來(lái)。
上面所有內(nèi)容中,如果排除技術(shù)上的問(wèn)題,性能測(cè)試中最難做好的,就是用戶模型(或者叫系統(tǒng)使用模型)的分析。它直接決定了壓力測(cè)試場(chǎng)景是否能夠 有效的模擬真實(shí)世界壓力,而正是這種對(duì)真實(shí)壓力的模擬,才使性能測(cè)試有了更大的意義。可以說(shuō),性能測(cè)試做到一定程度,差距就體現(xiàn)在了模型建立上。
至于性能問(wèn)題的分析、定位或者調(diào)優(yōu),很大程度是一種技術(shù)問(wèn)題,需要多方面的專業(yè)知識(shí)。數(shù)據(jù)庫(kù)、操作系統(tǒng)、網(wǎng)絡(luò)、開(kāi)發(fā)都是一個(gè)合格的性能測(cè)試人員需要擁有的技能,只有這樣,才能從多角度全方位的去考慮分析問(wèn)題。
當(dāng)然,對(duì)于測(cè)試人員來(lái)說(shuō),技術(shù)能力只能排在第二號(hào),測(cè)試思想才是最根本的。敏銳的嗅覺(jué)、嚴(yán)謹(jǐn)?shù)倪壿嫛⒑侠淼耐茰y(cè)、大膽的實(shí)踐是一個(gè)合格測(cè)試工程師的必備要素。
模擬演練
寫了一大堆,新手還是不知道如何去做。其實(shí)寫本文的目的也不是講具體操作,而是思想,思想。新手學(xué)性能測(cè)試,建議找一本從LOADRUNNER開(kāi)講的書比較好。如51TESTING上有連載的《性能測(cè)試從零開(kāi)始》。
不過(guò)還是盡量說(shuō)點(diǎn)具體些的內(nèi)容吧。
普通BS架構(gòu)的系統(tǒng),一般都采用測(cè)試工具(如LR)直接錄制手工操作的方式進(jìn)行測(cè)試。這種方式簡(jiǎn)單有效,對(duì)測(cè)試人員要求不高。但在一些情況下, 這種基于錄制的方法可能無(wú)法完成,比如頁(yè)面上有特殊控件、系統(tǒng)是CS架構(gòu)、或者通訊的協(xié)議無(wú)法捕獲等。這時(shí)就需要更復(fù)雜的測(cè)試方法,如手動(dòng)編寫模擬客戶端 的JAVA代碼,而把測(cè)試工具當(dāng)作一個(gè)調(diào)度控制臺(tái),去調(diào)度大量的虛擬用戶線程執(zhí)行編寫好的代碼。
現(xiàn)在假設(shè)有一個(gè)簡(jiǎn)易版的12306網(wǎng)站,JAVA實(shí)現(xiàn),中間件為TOMCAT,數(shù)據(jù)庫(kù)為SYBASE,沒(méi)有集群處理(一切從簡(jiǎn),只有查詢和訂票功能)。如何對(duì)它進(jìn)行性能測(cè)試呢?
按照上面的幾個(gè)步驟來(lái)想一想吧,這里只簡(jiǎn)單寫幾點(diǎn)。
第一步,測(cè)試確認(rèn)。海量并發(fā),數(shù)據(jù)也應(yīng)該是海量的,但基本都是簡(jiǎn)單查詢,沒(méi)有復(fù)雜的統(tǒng)計(jì),所以主要困難還是在海量并發(fā)事務(wù)的處理上。中間件、數(shù) 據(jù)庫(kù)上都會(huì)承受巨大壓力。此類高并發(fā)系統(tǒng)還需要對(duì)一些功能特別注意,比如一個(gè)車次有10張票,5個(gè)人同時(shí)購(gòu)票,如何處理?如果是12個(gè)人同時(shí)點(diǎn)購(gòu)票,又是 如何處理?
第二步,通過(guò)標(biāo)準(zhǔn)。無(wú)非是系統(tǒng)能夠滿足多少人同時(shí)在線,一分鐘內(nèi)能處理多少訂單,用戶最大等待時(shí)間是幾分鐘。注意這個(gè)標(biāo)準(zhǔn)一定要是經(jīng)過(guò)各方面確認(rèn)過(guò)實(shí)際可行的啊,定一個(gè)訂單響應(yīng)時(shí)間不超過(guò)5秒有意義么?確認(rèn)了以后,就要按著這個(gè)目標(biāo)來(lái)設(shè)計(jì)測(cè)試和執(zhí)行。
另一個(gè)需要注意的問(wèn)題,按照預(yù)期的壓力測(cè)試通過(guò)了以后,是不是就高枕無(wú)憂了?答案是否定的,因?yàn)楹芸赡苓@個(gè)預(yù)期或者標(biāo)準(zhǔn)是不合理的,這個(gè)是非常 可能的,只有長(zhǎng)期的數(shù)據(jù)積累,才會(huì)一點(diǎn)點(diǎn)走向精確。想想奧運(yùn)訂票系統(tǒng),開(kāi)通后短短五分鐘,網(wǎng)站就癱瘓了,你們以為這種系統(tǒng)沒(méi)有經(jīng)過(guò)專業(yè)的性能測(cè)試么?據(jù)我 所知,奧運(yùn)訂票系統(tǒng)性能測(cè)試時(shí)制定的標(biāo)準(zhǔn)是每分鐘處理四百萬(wàn)訪問(wèn)(具體數(shù)據(jù)記不住了,就假設(shè)是這個(gè)數(shù)吧),出事后的檢查發(fā)現(xiàn),每分鐘的訪問(wèn)量超過(guò)了八百 萬(wàn)。這種事故責(zé)任在誰(shuí)呢?測(cè)試機(jī)構(gòu)敢拍胸脯保證,每分鐘處理四百萬(wàn)就是沒(méi)問(wèn)題的。而奧組委自己設(shè)定的每分鐘四百萬(wàn)目標(biāo),和實(shí)際出現(xiàn)偏差也是正常的,畢竟這 種系統(tǒng)是第一次上線。最后的處理方法就是,壓力達(dá)到了預(yù)期最大值以后,再后來(lái)的訪問(wèn)就被排隊(duì)了。好好體會(huì)這個(gè)案例吧,會(huì)有收獲的。
第三步,測(cè)試設(shè)計(jì)。設(shè)計(jì)用戶模型,設(shè)計(jì)測(cè)試場(chǎng)景,設(shè)計(jì)測(cè)試用例。一個(gè)典型的用戶是如何使用系統(tǒng)的?登錄、查詢車次余票、訂票、付款,這是理想化 的情況。實(shí)際更可能是這樣的,登錄(一次登不進(jìn)去,重復(fù)多次)、查詢A車次(未到放票時(shí)間、不斷重試,時(shí)間到無(wú)票)、查詢B車次(無(wú)票)、查詢C車次(有 票)、訂票、付款、查詢訂單。兩種交互方式對(duì)系統(tǒng)產(chǎn)生的壓力,差別是很大的。
將多個(gè)用戶行動(dòng)整合到一起,也就是用戶模型,或者叫系統(tǒng)使用模型,是壓力場(chǎng)景設(shè)計(jì)的依據(jù)。假設(shè)系統(tǒng)一天的訪問(wèn)量是一萬(wàn)個(gè)用戶,這一萬(wàn)訪問(wèn)量是在 24小時(shí)內(nèi)平均分布的,還是分布在8小時(shí)內(nèi),還是在某一時(shí)間點(diǎn)上集中訪問(wèn)?這些具體到用例中也就是虛擬用戶的加載策略,直接決定了壓力的大小。
除了這個(gè)壓力場(chǎng)景,針對(duì)此系統(tǒng)還需要進(jìn)行絕對(duì)并發(fā)測(cè)試,參考第一步的分析。
第四、五步就不細(xì)說(shuō)了,準(zhǔn)備環(huán)境、數(shù)據(jù),針對(duì)大量用戶的并發(fā)進(jìn)行一些預(yù)調(diào)優(yōu)。按照第三步設(shè)計(jì)好的各個(gè)測(cè)試用例準(zhǔn)備腳本、執(zhí)行測(cè)試。
第六步,發(fā)現(xiàn)問(wèn)題了怎么辦?比如1000人的壓力下,系統(tǒng)響應(yīng)就比較慢了,查詢車次需要1分鐘,下訂單需要2分鐘,接下來(lái)要做什么?能把這些作 為一個(gè)性能缺陷提起么?顯然是不可以的,這只是通過(guò)你的壓力測(cè)試場(chǎng)景產(chǎn)生的一個(gè)現(xiàn)象,可能是測(cè)試腳本有問(wèn)題、也可能是測(cè)試環(huán)境有問(wèn)題。作為一個(gè)性能測(cè)試人 員,需要盡量深入的定位到問(wèn)題產(chǎn)生的原因。就像這個(gè)響應(yīng)慢,只是一個(gè)表面現(xiàn)象,慢在哪?是中間件還是數(shù)據(jù)庫(kù)?一些簡(jiǎn)單的測(cè)試方法就可以進(jìn)行判斷,如在頁(yè)面 上進(jìn)行一些數(shù)據(jù)庫(kù)無(wú)關(guān)的操作,如果依然比較慢,說(shuō)明在中間件上壓力就已經(jīng)比較大了。還可以部署另一套中間件測(cè)試環(huán)境,連接之前相同的數(shù)據(jù)庫(kù),在壓力測(cè)試出 現(xiàn)問(wèn)題的同時(shí),手動(dòng)訪問(wèn)新部署的應(yīng)用(只有一個(gè)用戶),如果同樣很慢,那說(shuō)明慢在了數(shù)據(jù)庫(kù)端的處理上。還可以通過(guò)日志的方式更準(zhǔn)確的進(jìn)行判斷,如應(yīng)用日志 和數(shù)據(jù)庫(kù)SQL執(zhí)行日志。總之方法是多種多樣的,但目的只有一個(gè),就是不斷的排除無(wú)關(guān)部分、縮小問(wèn)題范圍。
定位到了中間件和數(shù)據(jù)庫(kù)之一,然后又該怎么辦?此時(shí)恐怕就需要一些相關(guān)方面的專業(yè)知識(shí)了,但其實(shí)最常見(jiàn)的還是那些。中間件相關(guān)的一般是線程池、 JVM、數(shù)據(jù)庫(kù)連接池等,數(shù)據(jù)庫(kù)相關(guān)的有鎖、緩存、IO(一般就是SQL語(yǔ)句的問(wèn)題)等。要進(jìn)行全面的監(jiān)控和分析,再做一些合理的調(diào)優(yōu)并重復(fù)測(cè)試。
問(wèn)題定位到什么程度才行?我認(rèn)為是要讓人看了知道改哪就可以了。比如提一個(gè)“這個(gè)SQL語(yǔ)句進(jìn)行了大量的物理IO,性能不好”,這就不是個(gè)好問(wèn) 題,物理IO是什么?怎么改?如果這么說(shuō)就好多了“這個(gè)SQL語(yǔ)句沒(méi)有使用索引,導(dǎo)致了全表掃描,進(jìn)行了大量的物理IO,性能不好。如果要避免全表掃描, 需要調(diào)整SQL語(yǔ)句或者添加X(jué)X索引”,這才是定位問(wèn)題。
當(dāng)然了,上面只是一個(gè)非常簡(jiǎn)陋的舉例,真實(shí)的性能測(cè)試要比這復(fù)雜的多。
總的來(lái)說(shuō),我認(rèn)為,性能測(cè)試的難度主要不在技術(shù)手段上,互聯(lián)網(wǎng)時(shí)代技術(shù)都是共享的,要善于去搜索利用他人的成果。即使自己搞不定,團(tuán)隊(duì)內(nèi)一定還 有專業(yè)的開(kāi)發(fā)工程師、數(shù)據(jù)庫(kù)管理員、系統(tǒng)管理員可以幫你搞定。真正的難點(diǎn)在于,你要想出來(lái)如何去測(cè)是有效的、有保障的,這才是測(cè)試工程師最重要的能力。
還是那個(gè)觀點(diǎn),思想才是根本。
posted on 2012-05-21 11:59 順其自然EVO 閱讀(271) 評(píng)論(0) 編輯 收藏 所屬分類: loadrunner 、性能測(cè)試