外行人談壓力測(cè)試

          不是專(zhuān)職做壓力測(cè)試這行當(dāng)?shù)模荒苁且宰约旱慕?jīng)驗(yàn)來(lái)以外行人的眼光來(lái)說(shuō)說(shuō)壓力測(cè)試,壓力測(cè)試并不僅僅是個(gè)壓力測(cè)試的過(guò)程,而是一個(gè)相當(dāng)系統(tǒng)和復(fù)雜的工程,我認(rèn)為壓力測(cè)試是為了讓系統(tǒng)達(dá)到所期望的運(yùn)行效果以及承受所期望的壓力,這也就要求壓力測(cè)試應(yīng)該幫助性能調(diào)優(yōu)團(tuán)隊(duì),為其提供一定程度的指導(dǎo),在這里我不將壓力測(cè)試和性能調(diào)優(yōu)分的那么清楚了,在我看來(lái),壓力測(cè)試過(guò)程包括了:明確壓力測(cè)試的目標(biāo)、制定壓力測(cè)試方案、進(jìn)行壓力測(cè)試、分析壓力測(cè)試結(jié)果、尋找瓶頸并進(jìn)行調(diào)優(yōu)以達(dá)到目標(biāo),在這篇blog中來(lái)細(xì)看下這幾個(gè)過(guò)程以及常用的方法。
          明確壓力測(cè)試的目標(biāo)
          通常來(lái)說(shuō)(注意是通常),壓力測(cè)試的目標(biāo)有這么幾點(diǎn):
          1、評(píng)測(cè)系統(tǒng)是否滿(mǎn)足壓力支撐的要求
             要評(píng)測(cè)系統(tǒng)是否滿(mǎn)足壓力支撐的要求,同樣要做的就是需要明確定義系統(tǒng)需要支撐多大的壓力,例如:
             機(jī)器的配置:CPU、內(nèi)存、硬盤(pán)、etc.
             網(wǎng)絡(luò)條件:100M
             操作系統(tǒng):Linux core: 2.6
             當(dāng)并發(fā)數(shù)為10用戶(hù)時(shí),系統(tǒng)應(yīng)能在20ms內(nèi)響應(yīng)完畢(這個(gè)時(shí)候的TPS為500),系統(tǒng)的load需在2以下;當(dāng)并發(fā)數(shù)為100用戶(hù)時(shí),系統(tǒng)應(yīng)能在50ms內(nèi)響應(yīng)完畢(這個(gè)時(shí)候的TPS為2000),系統(tǒng)的load需在4以下;當(dāng)并發(fā)數(shù)為200用戶(hù)時(shí),系統(tǒng)應(yīng)能在80ms內(nèi)響應(yīng)完畢(這個(gè)時(shí)候的TPS為2500),允許其中有千分之一的出錯(cuò)率,系統(tǒng)的load需在6以下,在壓力測(cè)試的過(guò)程中,只要其中的任何指標(biāo)未達(dá)到,均可判定系統(tǒng)尚未達(dá)到壓力的目標(biāo)。
             實(shí)際的壓力測(cè)試的這個(gè)指標(biāo)會(huì)比我這里舉的例子復(fù)雜很多,例如還需要考慮網(wǎng)絡(luò)流量、內(nèi)存消耗、IOPS、連接數(shù)等等。
             這里面壓力測(cè)試隱藏的目標(biāo)是為容量規(guī)劃提供一定的指導(dǎo),例如目前的系統(tǒng)在某種配置的情況下單臺(tái)機(jī)器能承受的最大并發(fā)數(shù)為100用戶(hù),那么如果系統(tǒng)的高峰壓力是1000的話(huà),如果系統(tǒng)支撐無(wú)損水平擴(kuò)展的話(huà)就意味著需要10臺(tái)這類(lèi)配置的機(jī)器,這一步同樣是經(jīng)過(guò)測(cè)試的。
          2、預(yù)估系統(tǒng)上線運(yùn)行的狀況 
             畢竟通常壓力測(cè)試環(huán)境和線上的環(huán)境是會(huì)有很大的不同的,壓力、數(shù)據(jù)量、硬件環(huán)境等,基本上只能是根據(jù)線下的環(huán)境的情況進(jìn)行一定比例的對(duì)比后計(jì)算來(lái)預(yù)估,這里面很重要的是要預(yù)估系統(tǒng)上線后正常情況下的表現(xiàn)狀況、一定的增長(zhǎng)比率后的運(yùn)行狀況以及風(fēng)險(xiǎn)點(diǎn)(例如當(dāng)并發(fā)用戶(hù)數(shù)增長(zhǎng)到多少時(shí)、系統(tǒng)load到多少時(shí)可能會(huì)出現(xiàn)問(wèn)題)。
             這一個(gè)目標(biāo)我覺(jué)得非常難達(dá)到,但隨著經(jīng)驗(yàn),我相信是可以做到的,如果能做到這種效果的話(huà)是會(huì)有很大的幫助的。
          以上這個(gè)兩個(gè)目標(biāo)基本是壓力測(cè)試都要達(dá)到或希望達(dá)到的,而具體有可能會(huì)因?yàn)橄到y(tǒng)的業(yè)務(wù)的具體情況會(huì)制定其他不同的目標(biāo)。
          制定壓力測(cè)試方案
          這步是壓力測(cè)試整個(gè)過(guò)程中最難的步驟之一,為了能夠測(cè)試出系統(tǒng)是否符合壓力支撐的要求以及評(píng)估上線的表現(xiàn),通常我們會(huì)希望搭建出和生產(chǎn)環(huán)境完全相同的環(huán)境,但這就是最麻煩的一點(diǎn)了,基本上是不太可能的,因此通常能采取的方法會(huì)是:
          1、做等比例的縮放
             按照生產(chǎn)環(huán)境的情況做一定比例的縮放,例如生產(chǎn)環(huán)境的數(shù)據(jù)量為1億條,那么測(cè)試環(huán)境等比縮放到5000w條,生產(chǎn)環(huán)境的處理速度的情況...;
          2、更差環(huán)境、更高壓力的測(cè)試
             采取比生產(chǎn)環(huán)境更差的機(jī)器配置、網(wǎng)絡(luò)環(huán)境來(lái)進(jìn)行測(cè)試,例如ebay的要求是能夠承受10x的壓力。
          3、仿真測(cè)試
             據(jù)資深人士而言,仿真測(cè)試要做到基本是不太可能的,仿真測(cè)試首先要求的是收集到生產(chǎn)環(huán)境中的運(yùn)行狀態(tài)的數(shù)據(jù),然后在測(cè)試環(huán)境中編寫(xiě)程序來(lái)做到模擬生產(chǎn)環(huán)境運(yùn)行的效果,這個(gè)難度基本是非常高的。
          我自己現(xiàn)在做壓力測(cè)試更多采取的做法是以上三種方法的合集。
          在確定了測(cè)試方法后,就基本可以確定壓力測(cè)試的環(huán)境了,環(huán)境確定好后需要做的是壓力測(cè)試的案例或場(chǎng)景了,在壓力測(cè)試的案例中需要涵蓋正常場(chǎng)景以及異常的場(chǎng)景,正常場(chǎng)景是非常容易做出來(lái)的,只是需要根據(jù)生產(chǎn)環(huán)境收集的數(shù)據(jù)(例如不同級(jí)別的用戶(hù)比例通常是7:2:1)或預(yù)估的數(shù)據(jù)來(lái)搭建相應(yīng)的測(cè)試案例,異常場(chǎng)景則是比較復(fù)雜的,需要考慮很多的因素,例如數(shù)據(jù)庫(kù)出現(xiàn)異常、網(wǎng)絡(luò)出現(xiàn)異常等,這里我覺(jué)得通常的做法是畫(huà)出正常場(chǎng)景的處理流程,然后劃分交互邊界的信任邊界,對(duì)于所有的第三方交互都認(rèn)為是不可信任,例如不能信任調(diào)用數(shù)據(jù)庫(kù)是一定會(huì)快的,或一定會(huì)成功的,在異常場(chǎng)景中應(yīng)涵蓋這些信任邊界的異常狀況的測(cè)試,這些對(duì)于高可用性的系統(tǒng)而言是非常重要的,幾個(gè)9的成敗就在此了,^_^,當(dāng)然,高可用性又是個(gè)更復(fù)雜的話(huà)題,不在這里講。
          在壓力測(cè)試方案中還需確定的是考評(píng)的指標(biāo),通過(guò)會(huì)包括:tps、系統(tǒng)load等等。
          進(jìn)行壓力測(cè)試
          相對(duì)來(lái)講,在有了壓力測(cè)試方案后,這一步并不是什么太復(fù)雜的事情,只是需要選擇一個(gè)和壓力測(cè)試方案比較符合的工具來(lái)執(zhí)行,例如jmeter、loadrunner等,當(dāng)然,這些工具相對(duì)來(lái)說(shuō)也是比較復(fù)雜的,而且之間的差距也是比較大的,至少目前來(lái)看,jmeter和loadrunner的差距還是不小的,尤其是需要進(jìn)行高壓力的測(cè)試時(shí)。
          分析壓力測(cè)試結(jié)果
          這步同樣是壓力測(cè)試中很難的一步,在這一步需要做出的根據(jù)壓力測(cè)試的結(jié)果分析出系統(tǒng)的具體表現(xiàn)情況,判定系統(tǒng)是否能夠滿(mǎn)足壓力指標(biāo)。
          以loadrunner產(chǎn)生的分析結(jié)果圖而言,通常需要分析以下圖:
          1、Total Transactions per Second
             這張圖中顯示了系統(tǒng)在進(jìn)行壓力測(cè)試過(guò)程的TPS的變化情況,從這張圖中我們可以看到系統(tǒng)的TPS的情況,通常來(lái)講,隨著用戶(hù)數(shù)的增加,TPS應(yīng)該是呈一定比率的增長(zhǎng)的,等增長(zhǎng)到一定程度后會(huì)達(dá)到瓶頸,甚至開(kāi)始下降,這也是TPS的瓶頸值了,這張圖可以幫助我們?cè)u(píng)估系統(tǒng)的TPS是否符合要求。
             另外,在這張圖中,我們可以看到系統(tǒng)從什么時(shí)候開(kāi)始出現(xiàn)出錯(cuò)的transactions,從而判斷出錯(cuò)率是否在可接受的范圍。
          2、Transaction Response Time Under Load
             這張圖非常的重要,借助這張圖我們可以分析隨著用戶(hù)數(shù)增加的情況下,系統(tǒng)的劣化狀況,最佳狀況當(dāng)然是一條直線,但這基本是不可能的,畢竟資源是有限的,需要判斷的是劣化的程度是否為可接受范疇。
             另外就是需要關(guān)注數(shù)據(jù)中90%的用戶(hù)的響應(yīng)時(shí)間的狀況,如果少量用戶(hù)響應(yīng)慢是可接受的話(huà),那么有可能在之上指標(biāo)不達(dá)標(biāo)的情況下仍然滿(mǎn)足了壓力指標(biāo)。
          3、Unix Resources
             這張系統(tǒng)load圖自然是非常的重要,借助這張圖大致可以判斷系統(tǒng)隨著用戶(hù)數(shù)的增長(zhǎng)消耗的資源的變化情況,這對(duì)于調(diào)優(yōu)以及容量規(guī)劃而言是很重要的,但還是得取決于應(yīng)用本身,:)。
          loadrunner還提供了其他方面很多的圖,可以根據(jù)考評(píng)的要求來(lái)自行進(jìn)行分析。
          尋找瓶頸并進(jìn)行調(diào)優(yōu)以達(dá)到目標(biāo)
          這步不屬于壓力測(cè)試范疇,但還是在這里稍微講講,畢竟壓力測(cè)試結(jié)束后如果系統(tǒng)沒(méi)達(dá)標(biāo)的話(huà)就必須進(jìn)行這步了。
          尋找瓶頸,這自然是非常難的事了,通常系統(tǒng)達(dá)不到要求的狀況都會(huì)是隨著用戶(hù)的增長(zhǎng),響應(yīng)時(shí)間劣化的過(guò)于厲害,在這樣的情況下首先得觀察系統(tǒng)硬件資源的變化情況,如果是硬件資源耗盡的話(huà),需要查查為什么資源被耗盡,假設(shè)最后判斷確實(shí)需要耗費(fèi)這么多的硬件資源的話(huà),也許需要考慮增加硬件資源或是水平擴(kuò)展,否則的話(huà)可能需要從軟件層面相應(yīng)的優(yōu)化系統(tǒng)了,這樣的話(huà)可以進(jìn)入下一步了。
          如果不是硬件資源的限制的話(huà),得在系統(tǒng)中從頭到尾設(shè)置時(shí)間跟蹤filter,從而判斷響應(yīng)時(shí)間劣化的原因,看看是系統(tǒng)中哪些步驟造成的,這個(gè)是細(xì)致活了,有可能要查非常久。
          其實(shí)這里說(shuō)的還是相當(dāng)?shù)暮?jiǎn)單了,在尋找瓶頸的過(guò)程中是個(gè)非常繁瑣的過(guò)程,需要不斷的嘗試,硬件的增加、OS的調(diào)優(yōu)、jvm的調(diào)優(yōu)以及軟件系統(tǒng)本身的調(diào)優(yōu)等等,這些很多時(shí)候需要的是經(jīng)驗(yàn),因此某知名人士曾經(jīng)說(shuō)過(guò)如何尋找瓶頸和調(diào)優(yōu),其中依靠的一點(diǎn)就是直覺(jué),^_^。
          當(dāng)然,在尋找瓶頸的過(guò)程中,可以借助os的工具、java的工具(例如gc打印、jprofiler等)來(lái)進(jìn)行查找。
          (ps: 不過(guò)感覺(jué)很多情況下都是應(yīng)用本身造成的性能瓶頸,在寫(xiě)程序時(shí)稍不注意用錯(cuò)一個(gè)數(shù)據(jù)結(jié)構(gòu)都有可能會(huì)導(dǎo)致比較大的問(wèn)題,所以我現(xiàn)在查找瓶頸的時(shí)候更多的還是先從軟件本身下手,只是軟件性能要做到提升通常來(lái)付出較大的代價(jià),這個(gè)時(shí)候需要權(quán)衡)
          調(diào)優(yōu)基本上要求對(duì)硬件、OS、JDK、數(shù)據(jù)庫(kù)甚至軟件的實(shí)現(xiàn)方式等都要有非常深入的理解,至少要能做到判斷出瓶頸因素,然后找相應(yīng)領(lǐng)域的專(zhuān)家來(lái)解決,因此要求是非常高的。
          關(guān)于性能調(diào)優(yōu)的知識(shí)體系這里有篇不錯(cuò)的文章:
          http://www.cnblogs.com/jackei/archive/2008/06/27/1231307.html

          話(huà)題太大了,寫(xiě)到最后發(fā)現(xiàn)基本上還是有些泛泛而談了,后面會(huì)針對(duì)這里的每一步來(lái)做更為細(xì)致的實(shí)例的講述吧,不過(guò)畢竟是外行人,肯定有很多不對(duì)的地方,歡迎大家指正、拍磚。

          posted on 2008-07-25 17:40 BlueDavy 閱讀(6813) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): 業(yè)界隨想Internet

          評(píng)論

          # re: 外行人談壓力測(cè)試 2009-01-14 15:44

          多謝  回復(fù)  更多評(píng)論   

          # re: 外行人談壓力測(cè)試 2009-04-29 14:40 qingxiaohua

          ding~~樓主很博學(xué)嘛  回復(fù)  更多評(píng)論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

          <2008年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          隨筆分類(lèi)

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 舞钢市| 长乐市| 旺苍县| 扎兰屯市| 泰顺县| 喜德县| 汾阳市| 龙泉市| 凤台县| 新田县| 泾源县| 漳平市| 偏关县| 沂源县| 大悟县| 宣汉县| 若尔盖县| 勐海县| 肥城市| 依兰县| 神池县| 曲松县| 夏邑县| 梅河口市| 凤山市| 凤山县| 洪泽县| 边坝县| 额济纳旗| 沧源| 民乐县| 竹溪县| 武威市| 塘沽区| 乐安县| 松滋市| 台山市| 高雄县| 抚顺县| 神池县| 屯留县|