在 LoadRunner 的運(yùn)行場景中,有一個(gè)不大起眼的設(shè)置,可能經(jīng)常會(huì)被很多人忽略,它就是 Pacing 。具體設(shè)置方式為: Run-Time settings à General à Pacing ,這個(gè)設(shè)置的功能從字面上就很容易理解,即在場景的兩次迭代 (iteration) 之間,加入一個(gè)時(shí)間間隔(步進(jìn))。設(shè)置方法也很簡單,這里就不贅述了,我在這里想說明的是,這個(gè)設(shè)置到底有什么作用?為什么要進(jìn)行這個(gè)設(shè)置?說實(shí)話,雖然我在以前做過的一些性能測試中,偶爾會(huì)對這個(gè)步進(jìn)值進(jìn)行一些設(shè)置,但其實(shí)對它的真正含義和作用,我還并不十分清楚。
前段時(shí)間,我在對X銀行招聘信息系統(tǒng)進(jìn)行性能測試的時(shí)候,發(fā)現(xiàn)這個(gè)值的設(shè)置對于測試的結(jié)果有著很大的影響,很遺憾當(dāng)時(shí)沒有深入研究這個(gè)問題,而只是簡單地認(rèn)為它同腳本中的 thinktime 一樣只是為了更真實(shí)地模擬實(shí)際情況而已。最近在網(wǎng)絡(luò)上看到一篇題為《調(diào)整壓力測試工具》的文章,讀完之后,再用之前我的測試經(jīng)歷加以印證,真有種豁然開朗的感覺。以下就將我的一些體會(huì)與大家分享:
通常我們在談到一個(gè)軟件的“性能”的時(shí)候,首先想到的就是“響應(yīng)時(shí)間”和“并發(fā)用戶數(shù)”這兩個(gè)概念。我們看到的性能需求經(jīng)常都是這樣定義的:
“要求系統(tǒng)支持
100
個(gè)并發(fā)用戶”
看到這樣的性能需求,我們往往會(huì)不假思索地就在測試場景中設(shè)置 100 個(gè)用戶,讓它們同時(shí)執(zhí)行某一個(gè)測試腳本,然后觀察其操作的響應(yīng)時(shí)間,我們都是這樣做的,不是嗎?我在實(shí)際實(shí)施性能測試的過程中,也往往都是這樣做的。可惜的是,我們中的大多數(shù)人很少去更深入地思考一下其中的奧妙,包括我自己。
事實(shí)上,評價(jià)一個(gè)軟件系統(tǒng)的性能,可以從兩個(gè)不同的視角去看待:客戶端視角和服務(wù)器視角(也有人把它叫做用戶視角和系統(tǒng)視角),與此相對應(yīng)的,又可以引出兩個(gè)讓初學(xué)者很容易混淆的兩個(gè)概念:“并發(fā)用戶數(shù)”和“每秒請求數(shù)”。“并發(fā)用戶數(shù)”是從客戶端視角去定義的,而“每秒請求數(shù)”則是從服務(wù)器視角去定義的。
因此,上面所描述的做法的局限性就是,它反映的僅僅是客戶端的視角。
對于這個(gè)世界上的很多事情,變換不同的角度去看它,往往可以有助于我們得到更正確的結(jié)論。現(xiàn)在,我們就轉(zhuǎn)換一下角度,以服務(wù)器的視角來看看性能需求應(yīng)該怎么樣定義:
“要求系統(tǒng)的事務(wù)處理能力達(dá)到
100
個(gè)
/
秒”
(
這里為了理解的方便,假定在測試腳本中的一個(gè)事務(wù)僅僅包含一次請求
)
面對以這樣方式提出的性能需求,在
LoadRunner
中,我們又該如何去設(shè)置它的并發(fā)用戶數(shù)呢?千萬不要想當(dāng)然地以為設(shè)置了
100
個(gè)并發(fā)用戶數(shù),它就會(huì)每秒向服務(wù)器提交
100
個(gè)請求,這是兩個(gè)不同的概念,因?yàn)?/span>
LoadRunner
模擬客戶端向服務(wù)器發(fā)出請求,必須等待服務(wù)器對這個(gè)請求做出響應(yīng),并且客戶端收到這個(gè)響應(yīng)之后,才會(huì)重新發(fā)出新的請求,而服務(wù)器對請求的處理是需要一個(gè)時(shí)間的。我們換個(gè)說法,對于每個(gè)虛擬用戶來說,它對服務(wù)器發(fā)出請求的頻率將依賴于服務(wù)器對這個(gè)請求的處理時(shí)間。而服務(wù)器對請求的處理時(shí)間是不可控的,如果我們想要在測試過程中維持一個(gè)穩(wěn)定的每秒請求數(shù)(
RPS
),只有一個(gè)方法,那就是通過增加并發(fā)用戶數(shù)的數(shù)量來達(dá)到這個(gè)目的。這個(gè)方法看起來似乎沒有什么問題,如果我們在測試場景中只執(zhí)行一次迭代的話。然而有經(jīng)驗(yàn)的朋友都會(huì)知道,實(shí)際情況并不是這樣,我們通常會(huì)對場景設(shè)置一個(gè)持續(xù)運(yùn)行時(shí)間(即多次迭代),通過多個(gè)事務(wù)
(transaction)
的取樣平均值來保證測試結(jié)果的準(zhǔn)確性。測試場景以迭代的方式進(jìn)行,如果不設(shè)置步進(jìn)值的話,那么對于每個(gè)虛擬用戶來說,每一個(gè)發(fā)到服務(wù)器的請求得到響應(yīng)之后,會(huì)馬上發(fā)送下一次請求。同時(shí),我們知道,
LoadRunner
是以客戶端的角度來定義“響應(yīng)時(shí)間”的
,當(dāng)客戶端請求發(fā)出去后,
LoadRunner
就開始計(jì)算響應(yīng)時(shí)間,一直到它收到服務(wù)器端的響應(yīng)。這個(gè)時(shí)候問題就產(chǎn)生了:如果此時(shí)的服務(wù)器端的排隊(duì)隊(duì)列已滿,服務(wù)器資源正處于忙碌的狀態(tài),那么該請求會(huì)駐留在服務(wù)器的線程中,換句話說,這個(gè)新產(chǎn)生的請求并不會(huì)對服務(wù)器端產(chǎn)生真正的負(fù)載,但很遺憾的是,該請求的計(jì)時(shí)器已經(jīng)啟動(dòng)了,因此我們很容易就可以預(yù)見到,這個(gè)請求的響應(yīng)時(shí)間會(huì)變得很長,甚至可能長到使得該請求由于超時(shí)而失敗。等到測試結(jié)束后,我們查看一下結(jié)果,就會(huì)發(fā)現(xiàn)這樣一個(gè)很不幸的現(xiàn)象:事務(wù)平均響應(yīng)時(shí)間很長,最小響應(yīng)時(shí)間與最大響應(yīng)時(shí)間的差距很大,而這個(gè)時(shí)候的平均響應(yīng)時(shí)間,其實(shí)也就失去了它應(yīng)有的意義。也就是說,由于客戶端發(fā)送的請求太快而導(dǎo)致影響了實(shí)際的測量結(jié)果。
因此,為了解決這個(gè)問題,我們可以在每兩個(gè)請求之間插入一個(gè)間隔時(shí)間,這將會(huì)降低單個(gè)用戶啟動(dòng)請求的速度。間歇會(huì)減少請求在線程中駐留的時(shí)間,從而提供更符合現(xiàn)實(shí)的響應(yīng)時(shí)間。這就是我在文章開頭所提到的 Pacing 這個(gè)值的作用。
最后再補(bǔ)充一句話:雖然性能測試通常都是從客戶端活動(dòng)的角度定義的,但是它們應(yīng)該以服務(wù)器為中心的視角來看待。請注意這句話,理解它很重要,只有真正理解了這句話,你才會(huì)明白為什么我們一直強(qiáng)調(diào)做性能測試的時(shí)候要保證一個(gè)獨(dú)立、干凈的測試環(huán)境,以及一個(gè)穩(wěn)定的網(wǎng)絡(luò),因?yàn)槲覀兿Mu價(jià)的是軟件系統(tǒng)真正的性能,所以必須排除其它一切因素對系統(tǒng)性能造成的影響。
花了幾天的時(shí)間才完成這篇文章,如果它能夠幫助大家對性能測試多一些理解或者多一些思考,那就是我的榮幸了。 ^_^
參考資料:
Kirk Pepperdine 《 Tuning your stress test harness 》
http://www.theserverside.com/tt/articles/article.tss?l=StressTest
由于晚上時(shí)間也有限,所以我想今天我先說說我對 Tuning your stress test harness 這篇文章的一些不同看法,改天咱們可以繼續(xù)討論,搞個(gè)連載 ^_^
Kirk 在 Tuning your stress test harness 一文中提出的一個(gè)重要的觀點(diǎn)就是“放慢速度,做得越多”。這其實(shí)是一種場景設(shè)計(jì)的思路,Kirk 提出這個(gè)的原因是他認(rèn)為那些“不增加服務(wù)器負(fù)載的線程看起來會(huì)降低服務(wù)器的性能”,于是,Kirk 通過人為的方法來限制了 RPS(Request per Second)的值——這里我們要注意到的是,實(shí)際上 Kirk 是將 RPS 控制為小于 The Number of Concurrent Users 的值。以文中的例子來說,Kirk 是在 50 個(gè)并發(fā)用戶的情況下,將 RPS 控制在了 9 個(gè)左右。這樣的結(jié)果是什么?不知道你有沒有注意到,在這篇文章中,Kirk 是以 RPS 作為指標(biāo)衡量系統(tǒng)負(fù)載的,這種做法就算是所謂的“服務(wù)器視角”了嗎?
我們知道對于一個(gè)給定的系統(tǒng)來說,在某個(gè)特定的環(huán)境和場景中,它的“最佳并發(fā)用戶數(shù)(The Optimum Number of Concurrent Users)”是客觀存在的——關(guān)于“最佳并發(fā)用戶數(shù)”的概念可以參見我的《LoadRunner沒有告訴你的之三——理發(fā)店模型》一文(http://www.cnblogs.com/jackei/archive/2006/11/20/565527.html )。當(dāng)并發(fā)用戶數(shù)大于這個(gè)“最佳”時(shí),就會(huì)出現(xiàn)排隊(duì)的情況。如果這個(gè)并發(fā)量一直持續(xù),那么隨著時(shí)間的流逝,隊(duì)列也會(huì)越來越長,而越往后的請求在隊(duì)列中等待的時(shí)間也越長,從性能測試工具中看到的響應(yīng)時(shí)間也會(huì)越來越長。而這就是 Kirk 認(rèn)為不合理的地方。但實(shí)際上是這樣嗎?當(dāng)我們使用 LR 或者 JMeter 這類性能測試工具測試時(shí),隊(duì)列真的會(huì)越來越長嗎?響應(yīng)時(shí)間也會(huì)越來越長嗎?
今天先寫這么多,如果有了不同的看法,我們明天繼續(xù) ^_^
按照我的理解,Kirk所說的RPS,是以服務(wù)器為視角來看的每秒請求數(shù),也就是每秒鐘到達(dá)服務(wù)器端的請求,而不是從客戶端發(fā)出請求的頻率,我們知道這二者是會(huì)有差別的,否則的話,我們也用不著一直強(qiáng)調(diào)說做性能測試的時(shí)候一定要排除網(wǎng)絡(luò)等因素的影響。同時(shí)這也是我看這篇文章獲得最大的一個(gè)收獲,因?yàn)樗涛覀冇靡粋€(gè)不同角度去看待問題。不過說實(shí)話,我也沒有弄明白他把RPS設(shè)成9的原因,從他的描述和圖中,我看不出這其中的對應(yīng)關(guān)系。這個(gè)問題其實(shí)也讓我想了好久,但他所說的RPS代表服務(wù)器視角,這一點(diǎn)我還是比較認(rèn)同的,不知道你的意見如何,歡迎繼續(xù)討論。
當(dāng)我們使用LR等工具的時(shí)候,隊(duì)列確實(shí)不會(huì)越來越長,這個(gè)問題Kirk在文中也提到過了,他想告訴我們的是,由于我們所使用的工具的限制,導(dǎo)致了看似服務(wù)器在應(yīng)付一種穩(wěn)定狀態(tài)的負(fù)載,其實(shí)卻是個(gè)發(fā)散的隊(duì)列(因?yàn)楣ぞ邥?huì)在收到服務(wù)器響應(yīng)后才會(huì)發(fā)出第二個(gè)請求),這也是他所指出的問題關(guān)鍵所在。但響應(yīng)時(shí)間的確會(huì)越來越長的,因?yàn)楫?dāng)客戶端收到服務(wù)器請求以后,如果我們沒有設(shè)置延時(shí),那么客戶端會(huì)立即發(fā)出下一個(gè)請求,同時(shí)啟動(dòng)計(jì)時(shí)器,而此時(shí)如果服務(wù)器的資源已經(jīng)滿負(fù)荷,這個(gè)請求并不會(huì)進(jìn)入排隊(duì)隊(duì)列,那么這個(gè)時(shí)間其實(shí)是多計(jì)算的,因此后面的這些請求的平均時(shí)間將越來越長,導(dǎo)致整個(gè)平均值不準(zhǔn)確。
另外這里我再提一個(gè)沒有在我上面的文章中提到的一個(gè)問題,就是這個(gè)以“服務(wù)器視角”提出的性能需求應(yīng)該是什么樣子的,以前從來沒有考慮過這個(gè)問題。
1、測試工程師站在客戶角度,對客戶來說請求的響應(yīng)時(shí)間就是請求的排隊(duì)時(shí)間加上請求的處理時(shí)間再加上網(wǎng)絡(luò)傳輸?shù)臅r(shí)間。測試工程師需要做的是按照需求,設(shè)置場景,然后驗(yàn)證排隊(duì)時(shí)間加上處理時(shí)間加上傳輸時(shí)間是符合客戶的忍耐標(biāo)準(zhǔn)的。在這個(gè)標(biāo)準(zhǔn)下,找到最優(yōu)并發(fā)數(shù),最大并發(fā)數(shù)。
2、而對性能優(yōu)化工程師來說,他們的目標(biāo)是系統(tǒng),設(shè)計(jì)的系統(tǒng)有沒有問題,只和系統(tǒng)的本身有關(guān),而不應(yīng)該考慮那些客觀存在的條件,傳輸?shù)臅r(shí)間太長是網(wǎng)絡(luò)問題和系統(tǒng)無關(guān),傳輸時(shí)間不應(yīng)該考慮進(jìn)去,排隊(duì)的時(shí)間是操作系統(tǒng)的問題,如果已經(jīng)排除呢系統(tǒng)設(shè)置的線程池(例如數(shù)據(jù)庫連接池)的問題,那么也不應(yīng)該考慮進(jìn)去。性能優(yōu)化工程師要考慮的是,系統(tǒng)處理那些連續(xù)的請求,處理時(shí)間是否有線性上升,大概在什么樣的請求數(shù)量下已經(jīng)不符合系統(tǒng)設(shè)計(jì)時(shí)候的處理時(shí)限要求。
最后再舉兩個(gè)例子:A客戶需求上要求100個(gè)并發(fā)用戶下,數(shù)據(jù)庫查詢響應(yīng)時(shí)間不能大于5秒。B系統(tǒng)設(shè)計(jì)書上設(shè)計(jì)系統(tǒng)處理單個(gè)查詢請求不能時(shí)間不能大于2秒。對A的測試腳本很好寫,對B的測試場景設(shè)計(jì)起來要相對復(fù)雜,因?yàn)槟阋业侥莻€(gè)持續(xù)點(diǎn),也就是kirk指的收斂點(diǎn),并設(shè)計(jì)出pacing值。
你說的不錯(cuò),kirk這篇文章的確更適合給性能優(yōu)化工程師看,我不知道國外對于性能測試工程師和性能優(yōu)化工程師是否有明確的定義和分工,但至少在國內(nèi),這二者的區(qū)別是不大的。到目前為止,我所接手過的性能測試工作,大部分也是同時(shí)承擔(dān)這二者的角色的,因?yàn)榭蛻艋蛘唔?xiàng)目經(jīng)理,請你來做性能測試工作,不僅僅是要你指出系統(tǒng)存在什么性能問題,并且往往還希望你能告訴他們?nèi)绾稳ソ鉀Q。而且我也是這樣來要求自己的,作為性能測試工程師,我認(rèn)為我們也只有能夠做到這一步,才更有成就感!:)
Kirk 在文中提到:我們將看到服務(wù)器正在處理穩(wěn)定的請求流,而處理請求的時(shí)間似乎越來越長(“只做力所能及的”的那一節(jié))。后面有提到:不增加服務(wù)器負(fù)載的線程看起來會(huì)降低服務(wù)器的性能。并且“因?yàn)榫€程一離開就進(jìn)入系統(tǒng),就造成了這樣的情況:線程必須等待其他每個(gè)線程完成后才能被服務(wù)。在這種場景下,線程越多就會(huì)造成隊(duì)列和響應(yīng)時(shí)間越長。”——(“三思而后行”那一節(jié))
如果大家對性能測試工具的工作原理比較熟悉,那么不難發(fā)現(xiàn) Kirk 的理解的確存在一些偏差。首先,當(dāng)某個(gè)系統(tǒng)在一個(gè)給定的環(huán)境和場景中時(shí),它的“最佳并發(fā)用戶數(shù)”是客觀存在的,也就是說系統(tǒng)的響應(yīng)能力的限度是客觀存在的。當(dāng)每秒的請求數(shù)量大于這個(gè)限度時(shí),必然會(huì)導(dǎo)致某些請求需要排隊(duì)。但是這個(gè)排隊(duì)并不會(huì)像 Kirk 說的那樣——線程越多就會(huì)造成隊(duì)列和響應(yīng)時(shí)間越長。
我們舉個(gè)例子來看:
- 假如系統(tǒng)的最佳并發(fā)用戶數(shù)是 10,那么當(dāng)并發(fā)用戶數(shù)為 20 時(shí)(假定是 R1-R20),如果系統(tǒng)依舊平穩(wěn)的每秒完成 10 個(gè)請求的響應(yīng),那么我們可以看到。第一秒的時(shí)候,R1-R10 完成了響應(yīng),而 R11-R20 在排隊(duì)。第二秒時(shí),R11-R20 被響應(yīng),而 R1-R10 又重新進(jìn)入隊(duì)列等待處理;第三秒,R1-R10 被處理,R11-R20 在排隊(duì)…… 周而復(fù)始下去。Kirk 的看法,說到根本上就是認(rèn)為這個(gè)隊(duì)列會(huì)越來越長,所以他要控制一下。但是就如上面我們所說的,當(dāng)并發(fā)用戶數(shù)大于最佳并發(fā)用戶數(shù)后,出現(xiàn)排隊(duì)是正常的。而 Kirk 的方法最終的結(jié)果是讓工具模擬了 100 個(gè)用戶,但是系統(tǒng)在任意時(shí)刻卻只有 50 個(gè)負(fù)載。認(rèn)為的將負(fù)載控制在最佳并發(fā)用戶數(shù)的范圍內(nèi)有意義嗎?
所謂的“放慢速度,做得更多”,那么什么時(shí)候做得最多?當(dāng)并發(fā)用戶數(shù)等于系統(tǒng)的最佳并發(fā)用戶數(shù)時(shí)系統(tǒng)做得最多,因?yàn)檫@時(shí)系統(tǒng)的整體效率最高。
Kirk 在文章最后的部分的論述,說明他明白性能測試工具工作的原理,所謂的穩(wěn)定的請求流,而處理請求的時(shí)間似乎越來越長的情況是不會(huì)出現(xiàn)的——恰恰相反的是,請求流是穩(wěn)定的,響應(yīng)時(shí)間也是穩(wěn)定的。而他用大用戶量模擬小并發(fā)量的做法我更是不贊同。因?yàn)樵谖业挠^點(diǎn)看來,RPS 并不是很適合用來度量負(fù)載的大小,因?yàn)樵趯?shí)際的測試中,這個(gè)值只與系統(tǒng)的響應(yīng)能力有關(guān)。理論上來說,RPS 其實(shí)是等于 TPS 的,而 TPS 是用來度量系統(tǒng)的響應(yīng)能力的。
另外,Kirk 在文中的觀點(diǎn)認(rèn)為,響應(yīng)時(shí)間的延長是因?yàn)殛?duì)列造成的,“不增加服務(wù)器負(fù)載的線程看起來會(huì)降低服務(wù)器的性能”。但是事實(shí)上并不是這樣的。因?yàn)槟切┚€程并非“不增加服務(wù)器負(fù)載”,而響應(yīng)時(shí)間的延長也不單單是因?yàn)楹竺娴木€程的響應(yīng)時(shí)間中包含了排隊(duì)時(shí)間。
個(gè)人觀點(diǎn):最佳并發(fā)用戶數(shù)是衡量系統(tǒng)性能的一個(gè)很關(guān)鍵的指標(biāo),而 Kirk 在整篇文章中關(guān)注的其實(shí)是當(dāng)并發(fā)用戶數(shù)大于最佳并發(fā)用戶數(shù)以后的情況。他通過人為的方法將系統(tǒng)的負(fù)載控制在最佳并發(fā)用戶數(shù)上下。所以,我認(rèn)為他提出的以 RPS 來衡量系統(tǒng)負(fù)載的方法并不是合適,因?yàn)檎嬲龖?yīng)該關(guān)心的其實(shí)應(yīng)該是系統(tǒng)在任意時(shí)刻的負(fù)載。
說實(shí)話,我現(xiàn)在覺得 Kirk 這篇文章的思路并不是很清晰,或許是因?yàn)樗麤]有提供更多的背景信息吧。
我把你舉的例子進(jìn)一步假設(shè):這是一個(gè)基于80端口的web項(xiàng)目(我們暫且叫做A程序),采用的windows nt操作系統(tǒng),該操作系統(tǒng)對于80端口的連接限制為6個(gè),A程序在運(yùn)行過程中最多向cpu申請到4個(gè)線程。每個(gè)用戶每次只發(fā)一個(gè)請求。
讓我來按照我理解的kirk的思想分析你舉的例子的:
1、讓我們先來看看10個(gè)最佳并發(fā)用戶數(shù)都在干些什么。按照單cpu來看,系統(tǒng)在一個(gè)時(shí)間片上只處理一個(gè)請求,也就是說只有1個(gè)用戶被系統(tǒng)處理,那么其他的9個(gè)在干什么呢?按照假設(shè),3個(gè)請求已經(jīng)申請到線程,在等待cpu處理。6個(gè)請求在操作系統(tǒng)端,已經(jīng)建立了連接,等待分配線程。
2、當(dāng)20個(gè)并發(fā)數(shù)產(chǎn)生時(shí),他們又在干什么呢?還是只有一個(gè)請求在被cpu處理,還是只有3個(gè)請求申請到線程,在等待cpu處理,仍然只有6個(gè)請求在操作系統(tǒng)端,已經(jīng)建立了連接,等待分配線程,但是我們發(fā)現(xiàn)卻多了10個(gè)請求在等待進(jìn)入80端口,還沒有建立連接。
3、那么kirk作為java程序優(yōu)化工程師,什么是他關(guān)心的呢?有兩點(diǎn)是他最關(guān)心的。a、每個(gè)請求的A程序處理時(shí)限;b、A程序?qū)Y源的占用和釋放,對cpu線程申請是否合理。前一個(gè)很好理解,后一個(gè)我再做進(jìn)一步解釋,程序?qū)懙暮脡模泻艽笠徊糠衷谟趯Y源的占用和釋放,假設(shè)有個(gè)死循環(huán)在系統(tǒng)里,那么一旦申請到資源(cpu時(shí)間片),它始終不釋放,必然導(dǎo)致cpu占用率一直是100%。再假設(shè)如果按照cpu的處理能力,A程序其實(shí)可以申請到4個(gè)時(shí)間片進(jìn)行處理,但是實(shí)際上由于某個(gè)線程沒有及時(shí)釋放資源,或者對于一個(gè)需要長時(shí)間的請求沒有sleep,導(dǎo)致只能申請到2個(gè)時(shí)間片,那就需要優(yōu)化程序了。
通過上面的解釋我們就可以發(fā)現(xiàn)其實(shí)只有4個(gè)請求的處理時(shí)間是kirk關(guān)心的。而其他的,那并不是程序優(yōu)化應(yīng)該關(guān)心的事情,你可以轉(zhuǎn)交給系統(tǒng)工程師進(jìn)行進(jìn)一步的優(yōu)化。
4、那么如何才能讓這4個(gè)請求的處理時(shí)間更加準(zhǔn)確了?很顯然,由于loadrunner只能從發(fā)出請求就開始計(jì)算時(shí)間,因此如果前面的等待端口和等待分配線程的時(shí)間越長,那么得到的數(shù)據(jù)就越不準(zhǔn)確。最合理的是根本就不要等待端口,最好每個(gè)請求都能直接建立并得到線程,進(jìn)入cpu處理隊(duì)列,當(dāng)然因?yàn)槲覀儾⒉恢纁pu實(shí)際的隊(duì)列長度,所以很難進(jìn)行控制。
5、那么我們應(yīng)該怎么作呢?首先我們找到最佳請求數(shù),因?yàn)槲覀冎雷罴颜埱髷?shù)其實(shí)就是已經(jīng)建立連接的6個(gè)請求加上分配到線程的3個(gè)請求,再加上1個(gè)正在處理的請求。然后我們逐步減少最佳請求數(shù),其實(shí)也就是減少建立連接等待分配線程的請求數(shù),隨著逐步的減少,等待分配線程的時(shí)間也就減少,最終當(dāng)我們減少到4個(gè)時(shí),我們發(fā)現(xiàn)響應(yīng)時(shí)間不再提高,我們也就找到了我們最關(guān)心的響應(yīng)時(shí)間的最準(zhǔn)確值。這個(gè)過程就是kirk說的從發(fā)散到平穩(wěn)到收斂的過程。
6、我們還應(yīng)該注意什么呢?因?yàn)槲覀儫o法把握cpu的處理時(shí)間,所以我們也不可能算好,第5個(gè)請求正好在第一個(gè)請求處理完成后發(fā)起,因此我們不可能準(zhǔn)確的找到這個(gè)值。所以我在上個(gè)回復(fù)中說了,我們只有盡可能的接近收斂點(diǎn),反復(fù)設(shè)置pacing值,好達(dá)到第5個(gè)請求到達(dá)時(shí)間接近第一個(gè)請求的釋放時(shí)間,或是第6個(gè)請求到達(dá)時(shí)間不超過太多第一個(gè)請求釋放時(shí)間。
7、什么是系統(tǒng)真正的性能,什么是程序A的最佳并發(fā)數(shù)?系統(tǒng)真正的性能并不等同于用戶需求定義的性能,在kirk理解上,系統(tǒng)真正的性能是系統(tǒng)處理他應(yīng)該去處理的事所得到的性能。如果請求建立連接的數(shù)量越多,那么必然耗損cpu時(shí)間,從而降低去處理A程序的效率,因此kirk認(rèn)為我們應(yīng)該減少并發(fā)數(shù)量,去測試真正的系統(tǒng)性能。而從這個(gè)角度理解,4個(gè)用戶才是kirk認(rèn)為的最佳并發(fā)數(shù)。
一個(gè)性能優(yōu)化工程師所要積累的知識(shí)并不是看看書,編編程就能達(dá)到的,我覺得一個(gè)優(yōu)秀的性能優(yōu)化工程師大概要有3年的操作系統(tǒng)級編程經(jīng)驗(yàn),2年的web經(jīng)驗(yàn),3年的數(shù)據(jù)庫經(jīng)驗(yàn),再加2年的測試經(jīng)驗(yàn)。
而國內(nèi)根本不具備這個(gè)條件,對測試的輕視,對技術(shù)的追逐,導(dǎo)致有幾個(gè)資深的開發(fā)人員會(huì)進(jìn)入這個(gè)行業(yè),導(dǎo)致有幾個(gè)項(xiàng)目能給你時(shí)間,成本去積累這些知識(shí)。這真是可悲啊。
所以我覺得,我們這批測試工程師只能更多的發(fā)現(xiàn)問題,更多的去揭示問題,讓中國的軟件行業(yè)快點(diǎn)意識(shí)到其實(shí)還有一片更大的天空。
見教了,真是“聽君一席話,勝讀十年書”啊。 ^_^
希望您以后多多指教。如果不介意,大家可以交換一下聯(lián)系方式 ^_^
本來想把手頭上的事情處理掉再來回復(fù)Jackie的貼,沒想到wufeiwufei已經(jīng)搶先回答了,并且說得真是清楚明了,那我也就不多廢話了,贊一個(gè)!
也就是說,我們知道通常一個(gè)請求并不是只用一個(gè) CPU 時(shí)間片就可以處理完的,而且單個(gè) CPU 時(shí)間片是很短的。那么我們對于最佳請求數(shù)的評估是否要有一個(gè)時(shí)間單位做為基準(zhǔn)?例如 1 秒。那么如果以 1 秒做為基準(zhǔn),是否最佳請求數(shù)同我之前提到的最佳并發(fā)用戶數(shù)是同一個(gè)概念?
我看過你寫的《LoadRunner沒有告訴你的》,里面對于“最佳并發(fā)用戶數(shù)”的解釋,我是贊同的,但“最佳請求數(shù)”這個(gè)概念,我相信很少有性能需求會(huì)這樣去提的。所以我覺得還是像wufeiwufei所提到的那樣,國內(nèi)把測試工程師和性能優(yōu)化工程師兩個(gè)角色混在一起了,因此這二者之間的界限很模糊,在我做過的性能測試工作中,很多都是混在一起的,而偏偏客戶和測試者都沒有意識(shí)到這一點(diǎn)。
因此我是這樣來理解的:如果是以用戶的角度去測試,那之前談到的最佳并發(fā)用戶數(shù)的概念是沒有錯(cuò)的,而一旦是涉及到性能瓶頸的定位、調(diào)優(yōu)等,那還是需要從服務(wù)器的角度去測試。系統(tǒng)是否存在一個(gè)“最佳請求數(shù)”,并不是很重要,我們只需要保證在測試的過程中,能夠使系統(tǒng)維持一個(gè)穩(wěn)定的負(fù)載,保證測試結(jié)果準(zhǔn)確、可信,不會(huì)有偏差就夠了,也就是kirk說的,讓服務(wù)器的隊(duì)列處于穩(wěn)定的而不是發(fā)散的狀態(tài)。
我覺得可以這么理解,但是最佳并不是非常合適,雖然從大的方面講增加請求數(shù)會(huì)在一定程度上增加cpu的負(fù)載,因而導(dǎo)致rps在某個(gè)階段是有個(gè)最大的值,但實(shí)際上這和性能測試工程師理解的最佳有一定的差別的,性能測試工程師得到最佳并發(fā)用戶數(shù)是更多的為了驗(yàn)證用戶要求的性能目標(biāo)或是為了以后的擴(kuò)容有個(gè)量的了解,而從測試中得到這個(gè)rps更多的是為了發(fā)現(xiàn)問題進(jìn)行優(yōu)化,而不是為了達(dá)到某個(gè)目標(biāo),從這個(gè)角度來講,rps沒有最佳。
我一直認(rèn)為rps對我們現(xiàn)在來說沒有太大的意義,為什么這么說呢?
這是由于現(xiàn)在的性能測試過程決定的。現(xiàn)在的測試過程一般是:根據(jù)業(yè)務(wù)需求,設(shè)置目標(biāo),進(jìn)行性能測試,獲得基礎(chǔ)數(shù)據(jù)->根據(jù)數(shù)據(jù)對比業(yè)務(wù)需求,分解transcation,設(shè)置關(guān)注點(diǎn)->再次測試 這樣一個(gè)循環(huán)的過程。我們之所以認(rèn)為有問題,是因?yàn)槲覀冋驹谟脩艚嵌热ミM(jìn)行測試,對于客戶來說是不管是設(shè)備的問題還是軟件的問題都是我們的問題,因此對于我們來說并不需要按照kirk的方式去追求rps,因?yàn)樵谶@個(gè)過程中,我們可以把等待連接和分配進(jìn)程的時(shí)間看成一個(gè)常量,而這個(gè)常量在所有的transcation中都是存在的。我們更多是去確定是那個(gè)trancation有問題,然后針對這個(gè)transcation進(jìn)行優(yōu)化。
而kirk是這樣測試的(僅僅是我自己的看法),分別對軟硬件進(jìn)行性能測試->軟件尋找rps->根據(jù)經(jīng)驗(yàn),判斷是否合理->然后進(jìn)行優(yōu)化。
看出這兩個(gè)差別了嗎?舉個(gè)例子更好理解,項(xiàng)目A要求100個(gè)并發(fā)數(shù)下動(dòng)態(tài)頁面的響應(yīng)時(shí)間不大于5秒,靜態(tài)頁面的響應(yīng)時(shí)間不大于2秒。舉出三種測試情況:
1、動(dòng)態(tài)頁面是6秒,靜態(tài)頁面是1秒。
2、動(dòng)態(tài)頁面是6秒,靜態(tài)頁面是3秒。
3、動(dòng)態(tài)頁面是4秒,靜態(tài)頁面是1秒。
只有在第二種情況下,我們才會(huì)去尋找是否是硬件的問題。而通常在這種情況下,其實(shí)我們已經(jīng)要求更換硬件了。
而對kirk來說,三種情況并沒什么區(qū)別,他一樣要找到rps,然后根據(jù)技術(shù)標(biāo)準(zhǔn)來看是否需要對程序進(jìn)行優(yōu)化。
為什么會(huì)造成這種差別呢?我認(rèn)為最重要的原因,國內(nèi)沒有積累,企業(yè)缺少規(guī)范,非常缺少性能優(yōu)化工程師這類專業(yè)人才,只有用業(yè)務(wù)需求的標(biāo)準(zhǔn)來衡量,而沒有真正的技術(shù)標(biāo)準(zhǔn),沒有技術(shù)標(biāo)準(zhǔn),即使我們得到rps,你又如何分析出是否合理,是否需要優(yōu)化呢?
以上只是我一家之言,而且我對操作系統(tǒng)層面的東西也不是很清楚,畢竟我只作過1年不到的開發(fā)。
很高興能和你們一起交流。
我的聯(lián)系方式:wufei@133sh.com
msn:wufeisuliang@hotmail.com
嚴(yán)重同意wufeiwufei的觀點(diǎn),Kirk提出的問題,其實(shí)關(guān)鍵點(diǎn)在于他是從 “代碼優(yōu)化” 的角度來考慮問題的,他要的結(jié)果是“沒有任何疑義的完全由于代碼執(zhí)行消耗的時(shí)間”,而不應(yīng)該包括“隊(duì)列等待時(shí)間”。
但對測試工程師來說,我們的任務(wù)是準(zhǔn)確地知道真正的用戶在使用這個(gè)系統(tǒng)時(shí)的性能感受,也就是完全的用戶視角的“響應(yīng)時(shí)間”,那當(dāng)然應(yīng)該包括全部的時(shí)間范圍在內(nèi),Kirk提出的方法并不適用——所謂目的不同。
另外, 提出一點(diǎn)我的個(gè)人意見,上文所提到的RPS(或是TPS),我認(rèn)為可以作為一個(gè)衡量系統(tǒng)壓力的主要指標(biāo),在我看來,并發(fā)用戶數(shù)和TPS都是在進(jìn)行性能壓力測試,或是衡量響應(yīng)時(shí)間的依據(jù),只有說“在XX用戶數(shù)下,在XXTPS水平下”,響應(yīng)時(shí)間才是有意義的。
Kirk確實(shí)是從“代碼優(yōu)化”的角度來考慮問題的。我不知道國外對于測試工程師和性能優(yōu)化工程師這兩個(gè)角色是否有嚴(yán)格的劃分,但至少我自己在實(shí)際工作中,是沒有分的,很多時(shí)候我都要身兼這兩個(gè)角色,所以我覺得學(xué)會(huì)從兩個(gè)角度來看待性能,是很有必要的,這也是我看Kirk文章的收獲。另外,在我所做過的性能測試中,通常都會(huì)要求將后臺(tái)服務(wù)器的一些無關(guān)進(jìn)程、服務(wù)停掉,并且盡量使網(wǎng)絡(luò)獨(dú)立、或者保證帶寬足夠,這樣的做法,本質(zhì)上也是在確保使測試出來的性能結(jié)果盡量接近“實(shí)際的代碼執(zhí)行時(shí)間”。不知道各位在實(shí)際的工作中是怎樣做的,這個(gè)問題也希望大家踴躍討論。
關(guān)于關(guān)河老師最后提到的將RPS(TPS)作為衡量系統(tǒng)壓力的指標(biāo),我也非常認(rèn)同。
“在XX用戶數(shù)下,在XXTPS水平下”,響應(yīng)時(shí)間才是有意義的。 ”
我覺得準(zhǔn)確得應(yīng)該說 在xx用戶數(shù)下,響應(yīng)時(shí)間是多少,并單獨(dú)加上tps值,和響應(yīng)時(shí)間作為并列的性能指標(biāo)。tps提交給開發(fā)組,響應(yīng)時(shí)間記錄進(jìn)性能測試報(bào)告中。
我有幾點(diǎn)問題,想請教關(guān)老師,jackei,xingxing等各位前輩同仁
1、我們都知道現(xiàn)在的性能測試,幾乎都是根據(jù)預(yù)定的系統(tǒng)目標(biāo)來衡量,而對代碼的執(zhí)行效率幾乎沒有任何評估,在這種情況下tps這個(gè)值到底還有多大意義。
2、如果我們真的關(guān)注代碼的執(zhí)行效率,那么通過loadrunner等性能測試工具得出tps值既煩瑣而且得出的數(shù)值對定位問題幾乎無多大的幫助,而據(jù)我所知行業(yè)中有針對java和.net的應(yīng)用級的監(jiān)控工具(例如:wily公司的introscope),從這個(gè)工具可以很輕松的觀察到各個(gè)程序塊的相對運(yùn)行時(shí)間,隨著并發(fā)用戶數(shù)增加的,處理時(shí)間,占用資源的情況。那么kirk這篇文章又有多大的作用呢?
說說我的想法。
問題1:以我的實(shí)際經(jīng)驗(yàn)來看,tps這個(gè)值通常是客戶方關(guān)注得比較多,這是他們衡量一個(gè)應(yīng)用系統(tǒng)性能好壞的一個(gè)重要標(biāo)準(zhǔn)。而對于項(xiàng)目組(程序代碼的直接開發(fā)者)的性能定位、調(diào)優(yōu)則幾乎沒有什么幫助。換句話說,這個(gè)值更多的用于“性能評測”,而不是“性能調(diào)優(yōu)”。
問題2:你提到的wily公司的introscope主要是幫助我們來定位應(yīng)用系統(tǒng)的性能問題,而kirk這篇文章則啟發(fā)了我們,根據(jù)不同的測試目的應(yīng)該有不同的測試策略。如果你的性能測試是為了定位程序中的性能問題,就應(yīng)當(dāng)盡可能地排除其它因素的干擾。
另:introscope這個(gè)工具我曾經(jīng)看過wily公司的演示,感覺還可以,但我自己試用的時(shí)候卻沒配置成功。不知道你有是否對它有研究?
不好意思,寫錯(cuò)了,不是tps,我的意思是rps,你可能沒有明白我的意思,我是說我們現(xiàn)在的測試立足點(diǎn)基本就是站在客戶方,而調(diào)優(yōu)僅僅是在達(dá)不到客戶方要求的情況下才進(jìn)行的,因此我覺得過分追捧kirk的理論對我們現(xiàn)實(shí)的測試工作沒有任何幫助,因?yàn)榧词刮覀兝眠@個(gè)理論去找到最接近系統(tǒng)處理能力的rps,但是實(shí)際上也無助于我們進(jìn)行性能調(diào)優(yōu)(因?yàn)槲覀儙缀鯚o法對這個(gè)值進(jìn)行評測)。
至于introscope的設(shè)置不好搞,我個(gè)人認(rèn)為也因而導(dǎo)致他的推廣的不力,我自己并沒有單獨(dú)成功配置過,基本上都需要他們的支持人員幫助才能搞定(通常還要花很長時(shí)間)
非常同意wufeiwufei的觀點(diǎn),我們現(xiàn)在的性能測試相當(dāng)于驗(yàn)收測試,在功能差不多穩(wěn)定的情況下,驗(yàn)證系統(tǒng)是否滿足需求方提出的各個(gè)性能指標(biāo)。而Kirk跟我們進(jìn)行的不是一個(gè)層面的工作。他不管用戶需求,只考慮自己的程序是否還有調(diào)優(yōu)的空間。
有關(guān)于RPS說幾句。在我們公司的測試中,性能指標(biāo)不是由需求方提出來的,而是我們測試人員根據(jù)線上的日志分析出出來的。一般關(guān)鍵的指標(biāo)是2點(diǎn):TPS和響應(yīng)時(shí)間。而并發(fā)用戶數(shù)我們是不關(guān)注的。跟我們系統(tǒng)本身的特點(diǎn)有關(guān)。我們做的是網(wǎng)絡(luò)支付行業(yè),一般來說,如果用戶不提交請求,只瀏覽頁面,對于系統(tǒng)造成的壓力我們是忽略的。
TPS是測試工程師分析線上的日志情況,計(jì)算出每天的高峰請求數(shù)。響應(yīng)時(shí)間則是按照行業(yè)內(nèi)的2/5/8原則。
按照這樣的情況設(shè)計(jì)的測試場景[測試工具是LoadRunner],是基于目標(biāo)的場景,即設(shè)置系統(tǒng)每秒要達(dá)到的TPS,至于并發(fā)用戶數(shù)是工具根據(jù)響應(yīng)時(shí)間自動(dòng)計(jì)算出來的。
在這種情況下,我在想Pacing的設(shè)置可能沒有太多的關(guān)系。因?yàn)槲覀兊臏y試本身就是以服務(wù)器的角度來考慮的。不知道這樣的想法是否正確,還請各位高手指點(diǎn)。
@檻外人
我個(gè)人的看法,如果按照你所說的,場景是基于目標(biāo)的,那么Pacing的設(shè)置確實(shí)沒有太多關(guān)系,不過在我的實(shí)際工作中,通過并發(fā)用戶去設(shè)置場景的情況還是比較多,所以Pacing的設(shè)置還是會(huì)對測試結(jié)果產(chǎn)生一些影響的。
謝謝你的回復(fù),歡迎繼續(xù)探討!
俺是新手,說的不對,先抱歉下.
一,
對檻外人說的,網(wǎng)絡(luò)支付這個(gè)特定的性能測試來說,一些人只瀏覽頁面不提交對服務(wù)器的壓力就可以忽略.
----對于以上一個(gè)觀點(diǎn)我有疑問,這些人瀏覽頁面不需要占用服務(wù)器內(nèi)存或影響CPU的效率么,要知道瀏覽頁面的用戶值N可能是一個(gè)很大的數(shù).
我想請大家給個(gè)準(zhǔn)確的意見.比如在考慮網(wǎng)上支付混合場景性能測試的時(shí)候,一個(gè)腳本做付款;一個(gè)腳本做注冊;一個(gè)腳本做查詢,還需要不需要設(shè)置一個(gè)腳本就是模擬那些只瀏覽不提交的情況呢?
二,
我想試著回答下檻外人的問題.
我想你沒理解他們使用pacing的意義在哪里.我覺的前面幾個(gè)大俠已經(jīng)討論的很清楚.他們是用PACING,在忽略硬件的環(huán)境下,來盡量找出代碼的RPS這個(gè)值.
而代碼的RPS這個(gè)值對于我們現(xiàn)情況的性能測試工程師來說,是沒有實(shí)際意義的.( 這點(diǎn)樓上大俠也說的清楚.) 代碼的RPS是針對代碼的性能調(diào)優(yōu)的.而我們現(xiàn)階段的性能測試工程師是做不到這一點(diǎn)的.我們現(xiàn)階段的性能測試工程師,測試的是硬件環(huán)境+軟件環(huán)境+網(wǎng)絡(luò)條件下的性能的.
而硬件環(huán)境+軟件環(huán)境+網(wǎng)絡(luò)條件,也更接近于用戶的實(shí)際環(huán)境.所以我們現(xiàn)在測試沒必要去設(shè)置PACING.
-----不知道,我這樣的理解對不對
第一個(gè)問題:我是基于一種假設(shè),在我們的支付平臺(tái)中,主要的壓力來自于系統(tǒng)處理用戶提交的涉及數(shù)據(jù)庫的請求,比如說付款、查詢交易等等。而那些只瀏覽不提交的頁面,在大并發(fā)的用戶訪問下,性能是受限于網(wǎng)絡(luò)流量的。這些系統(tǒng)管理員可以做出當(dāng)前的昨天可以支持的用戶數(shù)。所以我們忽略它。在實(shí)際的測試過程中,如何確定是否要對一個(gè)功能進(jìn)行性能測試,是根據(jù)其實(shí)現(xiàn)過程分析它給系統(tǒng)帶來的性能消耗來決定的。假設(shè)說一個(gè)靜態(tài)頁面,里面就簡單顯示了幾張圖片,那么其實(shí)它的消耗只在帶寬上,根本沒有必要做性能測試的。
第二個(gè)問題:對于性能測試的建模,目前有2種方式。一種是基于用戶(客戶端)的,另一種是基于系統(tǒng)(服務(wù)器)的。2種方式各有優(yōu)缺點(diǎn)。而我們目前選擇的是第二種。這種建模方式不關(guān)注客戶端的操作,只關(guān)心系統(tǒng)在多大的壓力(通過設(shè)置TPS)下工作。 而Pacing按照我的理解是客戶端的設(shè)置,它控制的是虛擬用戶。
這個(gè)帖子越來越火了哈,真高興我們能有這么一個(gè)平臺(tái)。 不過樓主最近貌似很少出現(xiàn)了哦。
我的MSN是 dtzfl@hotmail.com 希望和大家交流.
最近忙于在外地出差,所以就不常來發(fā)貼了,不好意思!
我也來說說看法吧。
對于以上的第一個(gè)問題,我同意檻外人“如何確定是否要對一個(gè)功能進(jìn)行性能測試,是根據(jù)其實(shí)現(xiàn)過程分析它給系統(tǒng)帶來的性能消耗來決定的。”的說法。
至于第二個(gè)問題,Pacing設(shè)置的確是客戶端的設(shè)置,通過控制虛擬用戶發(fā)送的請求頻率來對服務(wù)器端造成壓力。Pacing究竟對服務(wù)器的性能結(jié)果是否有影響?以及如何影響的?在原文中已經(jīng)說得很清楚,當(dāng)發(fā)送的請求頻率在服務(wù)器處理能力范圍內(nèi)(隊(duì)列處于收斂和穩(wěn)定狀態(tài))時(shí),而當(dāng)發(fā)送的請求達(dá)到一定的頻率,超過了服務(wù)器處理的能力(隊(duì)列處于發(fā)散狀態(tài))時(shí),是會(huì)對測試結(jié)果產(chǎn)生影響的。
pacing是指在測試過程中,每兩次迭代(或稱循環(huán))間的停頓。
系統(tǒng)是JBOSS + ORACLE ,我在系統(tǒng)入賬時(shí)設(shè)置了集合點(diǎn),增加了入賬事務(wù)
我在測試100并發(fā)的時(shí)候,發(fā)現(xiàn)系統(tǒng)響應(yīng)時(shí)間很大,達(dá)到12S。修改了ORACLE的參數(shù),情況仍然存在。但是從監(jiān)控中看到,應(yīng)用機(jī)和數(shù)據(jù)庫機(jī)器的壓力并不是很大。然后我在每次循環(huán)中間添加了10S的間隔時(shí)間,系統(tǒng)的響應(yīng)時(shí)間就在2S左右了。
我想問,這個(gè)情況會(huì)不會(huì)是JBOSS的設(shè)置連接數(shù)的問題,導(dǎo)致隊(duì)列滿后,后面的請求在等待。
還有就是,這里指的一個(gè)請求是不是WEB_URL?還是一個(gè)虛擬用戶的請求。客戶端接收到服務(wù)器響應(yīng)后就發(fā)送下一個(gè)申請,那么這個(gè)響應(yīng)是服務(wù)器接受到請求后的響應(yīng)還是處理完請求的響應(yīng)?
從你描述的情況看,我想很可能是JBOSS的連接數(shù)問題。
這里指的一個(gè)請求是指客戶端和服務(wù)器的一次交互(或者連接)。
服務(wù)器的響應(yīng)是處理完請求的響應(yīng)。
為什么不能通過檢索VUser來讓處理效率趨于平穩(wěn)來判斷服務(wù)器的實(shí)際處理能力呢?這樣豈不是更簡單些?
謝謝
能否更詳細(xì)說一下,如何通過檢查VUser來處理實(shí)際處理能力?