說到性能測(cè)試,我們到底是想談?wù)撌裁矗?/h2>

任何做產(chǎn)品的,都希望自己家的產(chǎn)品,品質(zhì)優(yōu),性能好,服務(wù)海量用戶,還不出問題。

任何使用產(chǎn)品的,都喜歡自己購(gòu)買的產(chǎn)品功能全,性能優(yōu),不花一分冤枉錢。

不過理想很豐滿,現(xiàn)實(shí)很骨感。實(shí)際產(chǎn)品的性能與開發(fā)周期,部署方式,軟硬件性能等都息息相關(guān)。所以真正提到做性能測(cè)試的場(chǎng)景,多數(shù)是為滿足特定需求而進(jìn)行的度量或調(diào)優(yōu)。

比如:

  • 針對(duì)交付客戶的軟硬件環(huán)境,提供性能測(cè)試報(bào)告,證明對(duì)客戶需求的滿足
  • 針對(duì)特定的性能瓶頸,進(jìn)行針對(duì)性測(cè)試,為問題定位提供幫助
  • 重大功能迭代,架構(gòu)設(shè)計(jì)上線前的性能評(píng)估

所有的這些場(chǎng)景,都隱含著對(duì)性能測(cè)試目標(biāo)的確認(rèn),這一點(diǎn)非常重要。因?yàn)槿绻麤]有明確的測(cè)試目標(biāo),為了做而做,多數(shù)情況是沒有價(jià)值的,浪費(fèi)精力。

而性能測(cè)試的目標(biāo)一般是期望支持的目標(biāo)用戶數(shù)量,負(fù)載,QPS等等,這些信息一般可以從業(yè)務(wù)負(fù)責(zé)人或者產(chǎn)品經(jīng)理處獲得。當(dāng)然如果有實(shí)際的業(yè)務(wù)數(shù)據(jù)支持,也可以據(jù)此分析得出。所以在開展性能測(cè)試之前,一定要先搞清楚測(cè)試目標(biāo)。

目標(biāo)明確之后,如何開展性能測(cè)試?

有了性能測(cè)試目標(biāo),之后還需要進(jìn)一步拆解,做到具體可執(zhí)行。根據(jù)經(jīng)驗(yàn),個(gè)人認(rèn)為性能測(cè)試的執(zhí)行,最終會(huì)落地到以下兩個(gè)場(chǎng)景:

  • 在特定硬件條件,特定部署架構(gòu)下,測(cè)試系統(tǒng)的最大性能表現(xiàn)
  • 在相同場(chǎng)景,相同硬件配置下,與競(jìng)品比較,與過往分析,總結(jié)出優(yōu)劣

不同的目的,做事的方式也不一樣。

第一類場(chǎng)景,因?yàn)榻Y(jié)果的不確定性,測(cè)試時(shí)需要不斷的探索測(cè)試矩陣,找出盡可能優(yōu)的結(jié)果。

第二類場(chǎng)景,首先需要理清楚,業(yè)界同類產(chǎn)品,到底比的是什么,相應(yīng)的測(cè)試工具是什么,測(cè)試方法是什么??傊诠焦臈l件下,遵循業(yè)界標(biāo)準(zhǔn),得出測(cè)試結(jié)果,給出結(jié)論。

所有的性能測(cè)試場(chǎng)景,都需要有明確的分析與結(jié)論,以支持上述兩個(gè)場(chǎng)景下的目的達(dá)成。測(cè)試場(chǎng)景要貼近實(shí)際的目標(biāo)場(chǎng)景,測(cè)試數(shù)據(jù)要貼近實(shí)際的業(yè)務(wù)數(shù)據(jù),最好就用目標(biāo)業(yè)務(wù)場(chǎng)景下的數(shù)據(jù)來進(jìn)行性能測(cè)試。

服務(wù)端性能測(cè)試到底要看哪些指標(biāo)?

不同的領(lǐng)域,業(yè)務(wù)形態(tài),可能關(guān)注的性能指標(biāo)是不一樣的,所以為了表述精確,我們這里只談服務(wù)端的性能測(cè)試指標(biāo)。

一般我們會(huì)用以下指標(biāo)來衡量被測(cè)業(yè)務(wù): QPS, 響應(yīng)時(shí)間(Latency), 成功率,吞吐率,以及服務(wù)端的資源利用率(CPU/Memory/IOPS/句柄等)。

不過,這里有一些常識(shí)需要明確:

  • 響應(yīng)時(shí)間不要用平均值,要用百分值。比如常見的,98值(98th percentile)表示。
  • 成功率是性能數(shù)據(jù)采集標(biāo)準(zhǔn)的前提,在成功率不足的情況下,其他的性能數(shù)據(jù)是沒意義的(當(dāng)然這時(shí)候可以基于失敗請(qǐng)求來分析性能瓶頸)。
  • 單獨(dú)說QPS不夠精確,而應(yīng)結(jié)合響應(yīng)時(shí)間綜合來看。比如 "在響應(yīng)時(shí)間TP98都小于100ms情況下,系統(tǒng)可以達(dá)到10000qps" 這才有意義。
  • 性能測(cè)試一定要持續(xù)一定時(shí)間,在確保被測(cè)業(yè)務(wù)穩(wěn)定的情況下,測(cè)出的數(shù)據(jù)才有意義。

要多體會(huì)下這些常識(shí),實(shí)戰(zhàn)中很多新手對(duì)這塊理解不深,導(dǎo)致有時(shí)出的性能數(shù)據(jù)基本是無效的。

為什么性能測(cè)試報(bào)告一定要給出明確的軟硬件配置,以及部署方式?

前面說到,性能數(shù)據(jù)是與軟件版本,硬件配置,部署方式等息息相關(guān)的。每一項(xiàng)指標(biāo)的不同,得出的數(shù)據(jù)可能是天差萬別。所以在做性能測(cè)試時(shí),一定要明確這些基礎(chǔ)前置條件,且在后期的性能測(cè)試報(bào)告中,清晰的說明。

jmeter, ab, wrk, lotust, k6 這么多性能測(cè)試工具,我應(yīng)該選擇哪個(gè)?

業(yè)界性能測(cè)試數(shù)據(jù)工具非常多,不過適用的場(chǎng)景,以及各自特點(diǎn)會(huì)有不同。所以針對(duì)不同的性能測(cè)試需求,應(yīng)當(dāng)選擇合適的性能工具。比如:

  • jmeter: 主要提供圖形化操作以及錄制功能,入門簡(jiǎn)單,功能也較強(qiáng)大。缺點(diǎn)是需要額外安裝。
  • ab(apech benchmark): 簡(jiǎn)單好用,且一般系統(tǒng)內(nèi)置了,應(yīng)對(duì)簡(jiǎn)單場(chǎng)景已足夠
  • lotust:簡(jiǎn)單好用,支持python編寫自定義腳本,支持多worker,圖形化界面匯總性能數(shù)據(jù)。

這里不一一介紹工具,大家有興趣的都可以自行去網(wǎng)上搜索。

其實(shí)筆者在實(shí)踐過程中發(fā)現(xiàn),其實(shí)絕大多數(shù)性能測(cè)試場(chǎng)景,都需要編碼實(shí)現(xiàn)。所以如何優(yōu)雅的結(jié)合現(xiàn)有的測(cè)試代碼,環(huán)境,以及基礎(chǔ)設(shè)施,來方便的進(jìn)行性能測(cè)試反而是個(gè)可以考量的點(diǎn)。

筆者比較認(rèn)可Go+Prometheus+Kubernetes的模式。首先go語(yǔ)言因其獨(dú)有的并發(fā)模式,上手簡(jiǎn)單等特點(diǎn),在云服務(wù),服務(wù)端程序領(lǐng)域使用已經(jīng)非常廣了,采用其寫腳本,也許與被測(cè)程序天然緊密結(jié)合。且服務(wù)端程序要想很好的運(yùn)維,必然有一套完整的監(jiān)控告警體系,而Prometheus基本是其中熱度最高的,使用范圍最廣的,同時(shí)我們也可以將測(cè)試程序性能數(shù)據(jù)打點(diǎn)到Prometheus,這樣在計(jì)算QPS,成功率等指標(biāo)上,非常方便。

另外大家知道,在性能測(cè)試時(shí),多數(shù)需要不斷的調(diào)整metrix,比如并發(fā)數(shù),worker數(shù)量等,來探測(cè)系統(tǒng)的性能表現(xiàn),這時(shí)候如果將測(cè)試程序跑在Kubernetes上,就可以借助其能力,比如Deployment,靈活的部署和水平擴(kuò)展,體驗(yàn)相當(dāng)優(yōu)雅。

單機(jī)10000并發(fā)為什么可能不靠譜?

我們知道使用goroutine,可以瞬間開很多并發(fā),非常好用。于是可能就會(huì)有同學(xué)覺得用它做性能測(cè)試很方便,直接寫個(gè)腳本,起超多的并發(fā),去做性能測(cè)試。但這樣真的靠譜嗎?

雖然go語(yǔ)言的并發(fā),通過P,G,M模型,在調(diào)度goroutine時(shí),比較高效,但無論如何,任何的程序執(zhí)行,最終消耗的都是系統(tǒng)資源,測(cè)試腳本也同樣。所以單機(jī)上執(zhí)行的并發(fā)效果,最終會(huì)受限于,你腳本的復(fù)雜程序,也就是對(duì)CPU,IO,網(wǎng)絡(luò)等系統(tǒng)資源的消耗。所以,并不是并發(fā)越多越好,一定是基于實(shí)際環(huán)境,通過不斷調(diào)節(jié)并發(fā)數(shù)量,worker數(shù)量等,來達(dá)到最佳姿勢(shì)。

構(gòu)建業(yè)務(wù)性能數(shù)據(jù)的持續(xù)可觀測(cè)性對(duì)產(chǎn)品質(zhì)量意義重大

一次專項(xiàng)性的性能分析,可以觀察當(dāng)前業(yè)務(wù)的性能表現(xiàn),進(jìn)一步的分析性能瓶頸,為之后的改進(jìn)提供幫助,意義挺大。但只這樣可能不夠全面,因?yàn)橹覆欢ǖ哪炒蔚浔鷽]關(guān),goutinue泄露,就會(huì)造成性能問題,如果我們沒有常態(tài)化的檢測(cè)手段,等上線后才發(fā)現(xiàn),很明顯不是我們想看到的。

所以更優(yōu)雅的做法是,將性能測(cè)試常態(tài)化的持續(xù)運(yùn)營(yíng),甚至可以做到每次PR觸發(fā),都自動(dòng)執(zhí)行性能測(cè)試,檢測(cè)性能問題。

To-Be-Continued

性能測(cè)試對(duì)保障產(chǎn)品質(zhì)量,提升用戶體驗(yàn)意義重大。筆者這里只羅列了一些個(gè)人在實(shí)際工作中看的問題,以及一些體會(huì),可能不全面。所以如果您有問題,歡迎拋出來,共同探討。