如何進行有效的性能測試
下方查看歷史精選文章
大數(shù)據(jù)測試過程、策略及挑戰(zhàn)
在性能測試系列前面幾篇文章中我們比較詳細的介紹了相關的知識
所有性能相關的文章,均會同步發(fā)布至下面的公眾號,大家可以關注,以免錯過
而本文講系統(tǒng)的介紹,如何進行有效性能測試的基礎,將從以下幾個方面來介紹:
?應用環(huán)境的準備工作
?如何凍結代碼變更
?設計性能測試環(huán)境
?設計合理的性能測試目標
?梳理關鍵業(yè)務測試場景和開發(fā)測試腳本
?如何準備/管理性能測試數(shù)據(jù)
?如何精確的設計性能測試場景
?確定關鍵性能指標
下面對上述幾個方面進行一一說明。
一、應用測試環(huán)境的準備工作
???????在開始性能測試之前,我們必需首先確保應用測試環(huán)境的部署正常、功能基本穩(wěn)定,以免在性能測試過程中因個別bug的修復,而導致性能測試實施阻塞。畢竟如果系統(tǒng)存在功能上的明顯問題,那么在這樣的版本之上開始性能測試是沒什么意義的。
????????
????? ?通常情況下,現(xiàn)在的應用都會使用到數(shù)據(jù)庫,如果數(shù)據(jù)庫相關的配置或存在一些慢sql或效率不高的存儲過程都會給性能帶來巨大的負面影響,在開啟性能測試實施之前,應該有針對性對數(shù)據(jù)庫相關配置、慢sql、低效的存儲過程進行一一清理。
????????對于一個復雜的系統(tǒng),網絡帶寬也是我們必需準備好的基礎實施,畢竟相當多的性能測試會在生產環(huán)境進行,所以對于基礎網絡帶寬也應該有一個基礎的預判和準備。
????????性能測試實施是一個繁瑣和漫長的過程,在規(guī)劃性能測試時,應該盡可能的預留出足夠的時間。
????? ??對于目標壓測系統(tǒng)相關的配置、基礎資源準備得七七八八的情況下,壓測機方面的資源我們也應當做好相應的資源準備,是單機就能滿足壓力的需求還是需要進行分布式壓測的準備?都是需要考慮準備的。
????????梳理性能測試場景和開發(fā)、調試壓測腳本是性能測試至關重要的步驟,在這個過程中,我們會逐步建立和驗證性能測試場景,以達成本次壓測的目標。
????????還有個最為關鍵的準備工作:梳理、準備和清理測試數(shù)據(jù)。準備測試數(shù)據(jù)是成功實施性能測試的必備條件,而且數(shù)據(jù)準備也是一項精細的活,需要一定的時間和精力,包括測試數(shù)據(jù)后續(xù)的清理方案也是要考慮在內的。
????????最后一個準備工作就是:應對和解決突發(fā)問題的時間的預留,我們在實施性能測試時,不可避免的會有各類突發(fā)問題的出現(xiàn),例如環(huán)境、配置、代碼變更等等因素引起的突發(fā)事件,我們也需要預留一定的時間來應對這類的問題。
二、代碼凍結變更機制
????????通常情況下,我們都會在一個穩(wěn)定的代碼版本之上做性能測試實施,但在性能測試中發(fā)現(xiàn)的問題有可能是需要進行代碼變更的,這也是允許的,但一般是基于當下在測的穩(wěn)定的代碼版本進行修復變更迭代,絕對不允許開發(fā)隨意迭代變更代碼。而且有了變更應當、也必須通知到相關人員。?
????????
????????否則隨意變更代碼,極端的可能導致性能測試腳本得重新開發(fā)、調試。嚴格的管控代碼變更和合理的變更通知機制是必不可少的。
三、設計性能測試環(huán)境
????????理論上,最理想的性能測試環(huán)境應對和生產環(huán)境一致,而大部分企業(yè)是做不到這個的,所以我們要有以下處理方案。
????在配置上,我們盡量做到性能測試環(huán)境與生產環(huán)境的一致。
????在基礎中間件方面,也需要做到版本一致、配置一致。
????在網絡設施方面,盡量讓測試環(huán)境和生產環(huán)境的網絡基礎設施共享相同的網絡設施(這個大體可以做到,因為我們通常都是將服務部署在云上)。
????? ?在數(shù)據(jù)庫版本、容量、配置方面也是盡可能的保持兩個環(huán)境的一致,否則由于數(shù)據(jù)庫版本、容量、配置的差異帶來的影響會直接導致性能測試結果不準確。
????????總結一下,在一些繞不開的限制條件下,我們要盡可能的保持性能測試環(huán)境和生產環(huán)境的一致。
????????如果準備充分、條件允許,我們也是可能考慮,直接在生產環(huán)境進行性能測試實施,這樣所得到的結果是最為精確的。
四、設計合理的性能測試目標
? ??????
????????在進行性能測試前,首先就要設定合理的性能測試目標或是期望,而不是為了做性能測試而測試。
??????????在設定性能目標時,最關鍵的是與各方干系人達成一致的認可,這些干系人包括用戶、管理層、研發(fā)、測試、運維等等。
????????????否則我們在性能測試實施的結果可能會達成相應的結果。
????
????????也只有目標得到相關干系人的認可,我們在最終調度開發(fā)、運維、測試去實施時,才能更好的協(xié)調好相關資源、過程中攻克相關難點,滿足最終需求的去做好相應的性能測試實施成功。
????????一些關鍵指標在設定目標時,通常需要關注的有:
可用性
并發(fā)
吞吐率
響應時間
網絡利用率
服務器利用率
大家可以參考之前的文章?從終端用戶感受來體驗性能指標度量?來了解關鍵指標上的一些說明。
五、梳理關鍵業(yè)務測試場景和開發(fā)測試腳本
????? ?測試場景是性能測試的基礎,我們必需確保梳理出來滿足性能測試目標的業(yè)務場景。一個典型的業(yè)務場景是:登錄 - 業(yè)務操作(查詢、新增、編輯、刪除動作) -?退出系統(tǒng)
要注意的是,不要把性能測試場景與功能測試混淆起來,性能測試的目標不是確保服務的功能正確(功能測試的準確應該是在性能測試之前驗證過了),而是要針對應用制定符合真實的負載來使服務工作在壓力之下進而從性能的角度來觀察服務的表現(xiàn)。
性能測試的目的在于暴露由于并發(fā)、容量不足或配置問題等導致的瓶頸。
在梳理測試場景時有以下一些注意點:
確保場景無二義性,這樣才能確保對應的測試腳本沒有異議
確保所有的輸入數(shù)據(jù)需求和期望返回結果
區(qū)分好不同的用戶角色,例如有管理角色、有查詢角色、有編輯角色、有刪除角色等等,也要確定其大體比例,例如查詢角色的用戶占更大比例,當然這個不能照搬,得根據(jù)實際的業(yè)務場景來定
確定壓測時的網絡環(huán)境,局域網還是廣域網還是混合網絡環(huán)境
梳理出來的測試場景可回放驗證
上面這些是一些大體的思路,大家要進一步根據(jù)對業(yè)務、環(huán)境的熟悉度來進一步挖掘、梳理。
六、如何準備/管理性能測試數(shù)據(jù)
????????
????????準備高質量的測試數(shù)據(jù)是保證性能測試有效進行的基礎,可以這么說:性能測試的成敗取決于測試數(shù)據(jù)的數(shù)量和質量。
先不管業(yè)務的情況下,我們可以對數(shù)據(jù)大體分為三個類型:
輸入數(shù)據(jù)
基礎數(shù)據(jù)
會話數(shù)據(jù)
下面我們對上述三類數(shù)據(jù)進行分解說明。
輸入數(shù)據(jù)
一般包括用戶信息、查詢條件、關聯(lián)文件。
用戶信息這個比較好理解,我們現(xiàn)在幾乎所有的業(yè)務系統(tǒng)都基于用戶會話為中心構建的,用戶信息包括了登錄id、密碼,有的會有驗證碼。
一般情況下,我們在做性能測試時,會提前去專門新增一批專用的用戶賬戶。
查詢條件,幾乎在所有的性能測試過程中,都會有各種查詢業(yè)務場景,為了使我們的場景盡可能的逼近真實情況,我們需要準備好多樣化的查詢。
關聯(lián)文件,在很多業(yè)務類型中,會有各種附件的上傳、下載功能,這些附件可能會涉及pdf、word、excle、png等各種格式,我們需要根據(jù)實際情況來準備。
基礎數(shù)據(jù)
????? ?????如果我們不是在生產環(huán)境進行線上的性能測試,那么在相應的性能測試環(huán)境里,需要提前導入能夠模擬線上環(huán)境的基礎數(shù)據(jù),例如用戶信息、業(yè)務訂單信息等等有效數(shù)據(jù),而且也要確保這些基礎數(shù)據(jù)有一定的量。而不是隨意一點的量意思一下。
????????例如你線上數(shù)據(jù)庫有1TB的數(shù)據(jù)量,你在測試環(huán)境只有100M的數(shù)據(jù)量,那這個玩笑就有點大了,測試出來的結果可能會有很大的偏差。
所以在創(chuàng)建和維護性能測試數(shù)據(jù)庫時,也是一個很大的挑戰(zhàn),具體體現(xiàn)在如下幾個方面:
確保性能測試數(shù)據(jù)庫大小盡可能的接近真實。
在每次進行性能測試前,需要對數(shù)據(jù)庫進行備份,最好每次執(zhí)行前,做一次數(shù)據(jù)回滾。
數(shù)據(jù)量較大的情況下,數(shù)據(jù)回滾所需要的時間,需要提前演練,做好預估。
會話數(shù)據(jù)
????????????
????????在性能測試執(zhí)行過程中,必然會涉及一些由服務端返回的數(shù)據(jù),需要我們進行處理,并應用于性能測試過程中。一個典型的會話數(shù)據(jù):例如token。所以對于這類數(shù)據(jù)我們一定要做好相應的處理,以免導致整個性能測試過程上的一些邏輯上的問題。
????????最后要注意一點的是,現(xiàn)在很多業(yè)務系統(tǒng)都會出一些關鍵數(shù)據(jù)做一些脫敏處理,這些可能會影響到我們性能測試過程中的一些腳本開發(fā)工作,這些就需要跟開發(fā)人員做好相關的溝通協(xié)作。同一樣的,對于一些敏感數(shù)據(jù),例如用戶名/密碼、身份證、銀行卡這類的數(shù)據(jù),要做好規(guī)避,以免泄露出去,造成不必要的一些問題出現(xiàn)。
七、如何精確的設計性能測試場景
????
????????為了精確的設計好性能測試場景,我們必需將上文涉及的知識進行綜合應用。通過測試場景來精確的模擬性能測試目標中定義的相關指標。
????????下面我們看看設計好性能測試場景,必需理解的幾種性能測試類型。
基準測試
????????基準測試,也是一種準備性、參考性測試,通過基準測試,我們可以驗證我們的性能測試腳本的可行性。通常情況下,基準測試基于單位用戶來執(zhí)行測試場景(注:單位用戶,可以是一個用戶,也可以是10個,具體根據(jù)需要來定義),可以執(zhí)行一段時間,或一定循環(huán)次數(shù)。
????????通過基準測試,我們要達成以下幾個小目標:
?驗證我們的性能測試腳本的可行性
?獲取基準的指標監(jiān)控信息
根據(jù)基準測試所采集的監(jiān)控數(shù)據(jù),來評估后續(xù)的測試趨勢
負載測試
????????
????????負載測試是最典型的性能測試類型,在負載測試過程中會施加足夠的負載來達成預期的并發(fā)目標。
?????????通常在負載達到預期目標后,一般不會繼續(xù)增加負載,而是會保持負載不變的情況下,去驗證系統(tǒng)的可行性、并發(fā)數(shù)、吞吐率和響應時間等技術指標。
壓力測試
????????
????????壓力測試的目標與上述兩種測試會不大一樣。我們會利用壓力測試去嘗試探索系統(tǒng)的某些指標的極限能力。因此在壓力測試過程中,會持續(xù)的一直增加負載,直到系統(tǒng)的部分功能不能正常工作。
?????????
穩(wěn)定性測試
????????
????????穩(wěn)定性測試是為了發(fā)現(xiàn)那些經過長時間運行才會暴露的問題。典型的例如緩慢的內存泄漏,持續(xù)長時間下偶發(fā)的線程鎖等等。為了配合發(fā)現(xiàn)這類的問題,我們需要去構建持續(xù)的基礎監(jiān)控系統(tǒng),來對相關指標進行持續(xù)性的監(jiān)控,以便于我們分析、挖掘問題所在。
當然了,在你會在其他書籍或博客上看到還有其他各種性能測試類型,例如容量測試、冒煙測試、隔離測試等等,這里就不一一說明了,我筆者的實踐中,基準、負載、壓力和穩(wěn)定性測試是最常用的類型。
????????為了做好我們的性能測試場景,我們需要充分考慮測試數(shù)據(jù)的量對場景的影響,通常有量的方式:小數(shù)據(jù)量模式、中等數(shù)據(jù)量模式、大數(shù)據(jù)模式。
????????這里的數(shù)據(jù)量,主要是指我們基礎數(shù)據(jù)量,打個簡單的比方,你的數(shù)據(jù)庫里有100條訂單記錄和有1千萬條訂單記錄,對性能測試的結果的影響會有質的區(qū)別。所以我們在構建性能測試模型時,要充分考慮各種情況。
下面我們看看性能測試過中,施壓的一般采用的兩種方式。
大爆炸式施壓
遞增方式施壓
大爆炸式
????????這種模式的意思是,所有虛擬用戶同時執(zhí)行,用于模擬單位時間內大壓力的業(yè)務模型,例如我們像秒殺,業(yè)務活動期間,會有大量的用戶業(yè)務行為。
遞增式
????? ??這種模式,一般會在開始時啟動一部分虛擬用戶執(zhí)行,然后按照固定的單位時間間隔逐步增加虛擬用戶,直至達到某個特定的數(shù)量。在我們評估一個服務能支撐多少并發(fā)用戶時,通常會采用這種模式。
????????這種方式一般又會分為下面兩種方式:
1. 分段遞增方式,即我們會測試某個或某些指標,但在執(zhí)行過程中的某些時刻我們會保持一定的虛擬用戶數(shù)。例如我們的并發(fā)目標是2000,但在這個過程我們需要觀察500、1000、1500并發(fā)情況的相關指標。這時我們會根據(jù)這些階段目標,在施壓的過程中,當并發(fā)用戶達到了指定的值,就會暫停繼續(xù)新增并發(fā)數(shù),直到我們觀察、采集了完成了相關指標的數(shù)據(jù)后,才會繼續(xù)新增并發(fā)數(shù)。當然這個也可以通過獨立的多個測試來達成效果。
2. 分段遞增然后遞減方式,這個我們會用于模擬業(yè)務系統(tǒng)經歷一定的業(yè)務峰值后,業(yè)務下降時的業(yè)務情況。但不是所有工具都支持這種方式的。
不管是哪種方式,我們應該根據(jù)業(yè)務特征來設計多種模式,以達到深入探索、挖掘、評估系統(tǒng)的性能情況。
八、確定關鍵性能指標
????????性能測試過程中必須明確需要監(jiān)控的服務器和網絡關鍵性能指標。因為我們在進行性能測試過程中的問題的分析、溯源,基本都是依賴這些基礎、關鍵的監(jiān)控指標。
????????在理想情況下,這些監(jiān)控應該是被整合進性能測試方案里的,但在實際操作中,受限于工具的能力,大部分情況采取的是性能測試和監(jiān)控分離的方式,而不是監(jiān)控集成進工具里。
????????下面我們看看要監(jiān)控哪些關鍵的性能指標和一般用到的監(jiān)控工具,這里大家可以參考之前的文章:
如何建立有效的性能指標監(jiān)控及診斷調優(yōu)體系?
????服務器指標監(jiān)控,通常通過安裝監(jiān)控軟件來采集一些特定的性能數(shù)據(jù)或性能計數(shù)器,我們通常比較熟悉的有Perfmon(這是windows自帶的工具),這個工具有數(shù)以百計的性能計數(shù)器。很適合windows平臺的監(jiān)控。
????????在unix/linux下,則有很多的命令可用,例如top、monitor、vmstat、iostat等等。
當然更好的方式,筆者推薦你采用zabbix這類通用的服務器監(jiān)控系統(tǒng),免費、開源好用。
下面是筆者整理出來,大家在構建自己的監(jiān)控體系時,需要去關注的關鍵指標,這些指標覆蓋關鍵的監(jiān)控指標:例如cpu、io、內存、網絡錯誤等
-?CPU使用率%
- 處理器隊列長度
-?每秒上下文切換次數(shù)
- 可用內存
-?內存:每秒頁面失效次數(shù)
- 內存:每秒換成失效次數(shù)
-?內存:每秒物理頁讀取次數(shù)
-?虛擬內存頁使用率%
-?基于上一次計數(shù)的前十進程
- 磁盤空間可用率%
-?物理磁盤:平均磁盤隊列長度
- 物理磁盤:磁盤時間百分比%
- 網卡:接收包錯誤率
- 網卡:發(fā)送包錯誤率
web和應用程序,這塊的監(jiān)控主要關注web或應用程序服務器層的,例如tomcat、apache等這類的web服務器的監(jiān)控。
數(shù)據(jù)庫服務器,我們最熟悉的數(shù)據(jù)庫有Oracle、Mysql、sql server等等,我們也是需要去進行監(jiān)控,主要監(jiān)控:
- 全面了解數(shù)據(jù)庫的監(jiān)控狀況和性能。
-?根據(jù)慢SQL、排查響應時間延誤、故障、頁面錯誤等。
在網絡指標方面,我們主要關注網路包的傳輸時間、數(shù)據(jù)流量以及大流量時可能導致的網絡錯誤。在這方面,我們通常監(jiān)控幾個少數(shù)關鍵指標就好了,一般包括以下幾項:
- 網絡錯誤,對于性能來講,任何網絡錯誤都是值得我們去關注的,因為網絡錯誤可以反映網絡設備的無聊問題或是流量過載問題
- 網絡延遲
- 網絡帶寬消耗
在本文中,我們一起了解了如何有效開展性能測試的關鍵前置條件,不管你之前在性能測試方面是否有足夠的了解,強烈推薦你把本文收藏,后續(xù)反復查閱。


