系統性能的改善是測試、調整、再測試、再調整……的一個持續改進的過程,即性能調優,根據性能測試的結果對軟體的設計,代碼,系統的配置進行調整。
性能測試的類型
性能測試主要包含6種類型,如下表所示。
類型
說明
負載測試
確定軟體在給定時間內隨著工作負載增加的運行方式,工作負載可以是並發用戶、事務數、軟體行為等。在被測系統上不斷增加壓力,直到性能指標(如響應時間)超過預期指標或者某種資源使用已經達到飽和狀態。可以找到系統的處理極限,為系統調優提供數據。
壓力測試
評估軟體在一個固定的常規工作負載下的長期性能。換句話說,它決定了軟體能夠承受恆定的工作負載多長時間以提供長期的可持續性。在測試期間,測試團隊監控KPI,如內存洩漏、內存使用、內存不足等。穩定性測試還分析長時間使用後的響應時間和吞吐量,以觀察這些指標是否一致。
尖峰測試是一種壓力測試,它測量軟體在顯著的、突然的工作負載增加(如用戶並發數量)情況下的性能。軟體是否能夠反覆快速地處理突然增加的工作負載。容量測試如今,隨著DevOps的發展,性能測試已經上升為軟體系統全生命周期性能工程。本文從五個方面介紹性能測試的工具和解決方案:客戶端性能測試、服務端性能測試、分布式系統的應用性能監控、分布式系統的全鏈路壓測。
Google Lighthouse
PerfDog
Monkey
Monekyrunner
mobileperf
Pyroscope
MemoryLeakDetector
JMeter
LoadRunner
Webload
Gatling
k6
Vegata
Locust
Skywalking
Pinpoint
客戶端性能測試工具
1)Google Lighthouse
2) PerfDog
PerfDog 性能狗是移動全平臺 iOS\Android 性能測試工具平臺,快速定位分析性能問題,提升 APP 應用及遊戲性能和品質,手機無需 ROOT/越獄,手機硬體、遊戲及應用無需做任何更改,極簡化即插即用。
官網地址:
https://wetest.qq.com/product/perfdog
3) Monkey
Monkey 是 Android SDK 提供的一個命令行工具,使用簡單、方便地運行在任何版本的 Android 模擬器和實體設備上。Monkey 會發送偽隨機的用戶事件流,適合對 app 做壓力測試。
4) Monkeyrunner
MonkeyRunner工具提供了多個API,通過monkeyrunner API 可以寫一個Python的程序來模擬操作控制Android APP,測試其穩定性並通過截屏可以方便地記錄出現的問題。
5) mobileperf
天貓團隊開源的PC Android性能穩定性測試工具,可以收集Android性能數據: cpu 內存 流暢度fps logcat日誌 流量 進程線程數 進程啟動日誌,mobileperf也支持原生monkey test。https://github.com/alibaba/mobileperf6) Pyroscope
Pyroscope是一個開源的連續分析平臺。能夠幫你發現代碼中的性能問題和瓶頸、CPU利用率高的原因。並且幫你了解應用程式的調用樹,提供豐富的圖表和調用樹展示。官網地址:https://pyroscope.io7) MemoryLeakDetector
MemoryLeakDetector是由西瓜視頻android團隊開發的本地內存洩漏監視工具,它具有訪問簡單,監視範圍廣,性能優良和穩定性好的優點。它被廣泛用於ByteDance的主要應用程式的本機內存洩漏管理中。
官網地址:https://github.com/bytedance/memory-leak-detector服務端性能測試工具
8) JMeter
JMeter 是 Apache 組織開發的基於 Java 的壓力測試工具。用於對軟體做壓力測試,它最初被設計用於 Web 應用測試,但後來擴展到其他測試領域。它可以用於測試靜態和動態資源,例如靜態文件、Java 小服務程序、CGI 腳本、Java 對象、資料庫、FTP 伺服器等等。
JMeter 可以用於對伺服器、網絡或對象模擬巨大的負載,來自不同壓力類別下測試它們的強度和分析整體性能。
官網地址:https://jmeter.apache.org/
9) LoadRunner
LoadRunner 是一種預測系統行為和性能的負載測試工具。通過模擬上千萬用戶實施並發負載及實時性能監測的方式來確認和查找問題,LoadRunner 能夠對整個企業架構進行測試。
官網地址:
https://www.microfocus.com/zh-cn/portfolio/performance-engineering/overview
10) WebLOAD
WebLOAD是一款針對Web應用程式的企業級負載和性能測試工具,提供性能、完整性和可伸縮性測試等功能,能夠同時模擬數千個用戶,因此您可以測試重流量負載,並報告應用程式中的弱點、約束和性能瓶頸。使用WebLOAD進行網站負載測試、連續測試、雲負載測試等。該工具可以從雲端或本地機器生成負載,並提供一個集成開發環境(IDE),用於可視化地記錄、編輯和調試測試腳本。官網地址:https://www.radview.com/11) Gatling
Gatling 是一款基於 Scala 開發的高性能伺服器性能測試開源工具,同時也是一款功能強大的負載測試工具,開箱即用。Gatling主要用於測量基於HTTP的伺服器,比如Web應用程式,RESTful服務等。Gatling是針對任何 HTTP 伺服器進行負載測試的首選工具。
官網地址:https://gatling.io/
12) k6
k6是高性能的負載測試工具,也是一種高性能工具,旨在在預生產和QA環境中以高負載運行測試,可使用JavaScript編寫腳本。它是一個以開發人員為中心(當然,測試人員亦可以使用,因為真的很方便),免費和開源的負載測試工具,旨在使性能測試具有生產力和令人愉悅的體驗,可最大程度地減少系統資源的消耗。
官網地址:https://k6.io/
13) Vegata
Vegeta 是一個用Go語言編寫的多功能的 HTTP 負載測試工具,提供命令行工具和一個開發包。
官網地址:
https://github.com/tsenart/vegeta
14) Locust
Locust是使用Python開發的支持分布式的一款開源壓力測試工具,可以通過寫python腳本的方式來對web接口進行負載測試。Locust在單臺機器上能夠支持幾千並發用戶訪問,並且由於其對分布式運行的支持,理論上來說,Locust能在使用較少壓力機的前提下支持極高並發數的測試。
官網地址:https://locust.io/
分布式系統的性能監控工具
在微服務架構的分布式系統中,當客戶端發起一個請求時,往往會調用多個服務,涉及多個中間件,加上系統又分布在多臺伺服器上,因此,當系統出現性能瓶頸時,故障診斷就變得非常複雜。分布式系統的應用性能監控(APM)工具通過服務調用鏈追蹤分析來定位鏈路上的性能瓶頸。
在線性能監控是指藉助監控工具,監控系統性能的實際數據,因為是真實數據,比研發環境中通過工具產生負載得到的測試結果更客觀,更有分析價值。
SkyWalking是一款國內開源的優秀的APM工具,提供了一個分布式系統的直觀的觀測平臺,用於從服務和雲原生基礎設施收集、處理及可視化數據,通過監控、告警、可視化和分布式追蹤等功能為微服務、分布式,以及容器化的系統架構提供了可觀測性(observability)。它可以觀測橫跨不同雲的分布式系統,而且從SkyWalking 6 開始支持下一代的分布式架構Service Mesh。
http://skywalking.apache.org/16)Pinpoint
Pinpoint是一個用於大規模分布式系統的APM(應用程式性能管理)工具,用Java/PHP編寫。Pinpoint提供了一個解決方案,幫助分析系統的總體結構,以及通過跟蹤分布式應用程式中的事務,分析系統中的組件如何相互連接,用於大型分布式系統的全鏈路監控,可以獲取不同服務之間,服務與資料庫,以及服務內部的方法的調用關係,還可以監控方法調用時長、可用率和內存等。下載地址:
https://pinpoint-apm.github.io/pinpoint/
分布式系統的全鏈路壓測平臺
全鏈路壓測是指模擬真實業務場景中的海量用戶請求和數據訪問生產環境,對整個業務鏈路進行全方位的、真實的壓力測試,提前找到分布式系統的性能瓶頸點並持續調優的實踐。目前企業大多採用的是基於開源工具Gatling、JMeter 搭建壓測集群進行全鏈路壓測。同時,國內也有商用的全鏈路壓測解決方案,如Perfma全鏈路壓測解決方案、京東ForceBot平臺、美團的 Quake、高德的 TestPG、字節跳動的Rhino、阿里媽媽的MagicOTP和性能測試平臺ACP,以及阿里的AMAZON、PTS和JVM-SANDBOX平臺。