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