性能测试真如你想象的那么简单?
我是阿里云彈性計(jì)算性能測(cè)試負(fù)責(zé)人西邪。
我從 2018 年開始組建阿里云彈性計(jì)算的性能測(cè)試團(tuán)隊(duì),從要一周完成一組性能測(cè)試,到只需 1 分鐘就可以觸發(fā)一組全自動(dòng)性能測(cè)試,到最后結(jié)果整理一鍵搞定,內(nèi)部命名為開天斧。
現(xiàn)在開天斧已經(jīng)承擔(dān)整個(gè)彈性計(jì)算所有的性能測(cè)試工作:新技術(shù)、新設(shè)備、新規(guī)格等等,保證了線上的性能穩(wěn)定性。在性能測(cè)試的同時(shí),還要負(fù)責(zé)解決客戶的性能問題。期間還負(fù)責(zé)了“變形金剛”這個(gè)項(xiàng)目,把物理機(jī)的底層資源管理產(chǎn)品化了,使得現(xiàn)在線上千變?nèi)f化的規(guī)格,只需一個(gè)模板就可以簡(jiǎn)單實(shí)現(xiàn)。
這里就先跟大家分享下這 3 年在性能測(cè)試上的一些收獲。
什么是性能測(cè)試?
性能測(cè)試不同于功能測(cè)試,功能測(cè)試驗(yàn)證的是某個(gè)功能是否完成,性能測(cè)試驗(yàn)證的是某個(gè)性能是否達(dá)到。
驗(yàn)證性能就需要很多性能“標(biāo)尺”,如衡量 CPU 性能:通過 SPEC CPU,UnixBench 等;衡量網(wǎng)絡(luò)性能用 netperf,iperf,sockperf 等等;衡量存儲(chǔ)性能最好用的是 fio,衡量?jī)?nèi)存帶寬性能則是 stream。
上述說的都 micro Benchmark,通常如果某塊做的不好,就可以直接提缺陷給相關(guān)的團(tuán)隊(duì)去優(yōu)化;而客戶實(shí)際感知的是真實(shí)業(yè)務(wù)場(chǎng)景,那就需要去模擬客戶的場(chǎng)景,比如客戶經(jīng)常使用的是 nginx,redis,MySQL 等,通過實(shí)際的場(chǎng)景測(cè)試,來驗(yàn)證當(dāng)前服務(wù)器的優(yōu)劣。通過做好性能測(cè)試,才能建立自己的底氣,做好性能分析,才能知道哪里薄弱,從而往哪里發(fā)力!
性能測(cè)試要做哪些?
性能的重要性無需多言,我就直接略過了。一個(gè)服務(wù)器有 5 大塊:CPU、內(nèi)存、存儲(chǔ)、網(wǎng)絡(luò)、OS。對(duì),就是驗(yàn)證這些模塊的性能,上面也簡(jiǎn)單介紹了下該用哪些工具進(jìn)行性能測(cè)試。但是對(duì)于性能測(cè)試而言,如果僅僅是一個(gè)測(cè)試,那太簡(jiǎn)單了,實(shí)際上還需要考慮很多。
性能主要可以看以下幾個(gè)方面:
可能光談問題還是抽象了點(diǎn),我再具體舉幾個(gè)例子。
先談與 CPU 相關(guān):
● Intel、AMD、ARM 差異?指令差異
● CPU 不同代數(shù)差異
● CPU 主頻、基頻、睿頻、P0-n、P0-1
● CPU 是否 PIN 住
● 超線程開關(guān):底層開關(guān)、OS 開關(guān)
● NUMA 架構(gòu):membind、interleave...
● 電源策略: performance、powersave、C-State 聯(lián)系
● TDP: 睿頻不符預(yù)期時(shí)看下 TDP 是否限制住了,很有用!
● L3 Cache 大小
● 內(nèi)存帶寬、內(nèi)存時(shí)延
● OS:內(nèi)核版本、CPU 漏洞開關(guān)
● CPU 微碼
● 軟件:glibc 版本等
● 不同版本、特殊編譯器:AOCC、icc
上面的這些都是 CPU 需要具備的基礎(chǔ)知識(shí),甚至還需要深入底層去看問題,比如看底層 CPU 的 PMU 相關(guān)的一些東西。同樣其他模塊知識(shí)也是必不可少的。
除了知識(shí)具備外,每個(gè)模塊測(cè)試完備性也很重要,比如分析網(wǎng)絡(luò)性能數(shù)據(jù),重點(diǎn)看下面這些性能:
● 網(wǎng)絡(luò)帶寬:多流、單流
● 網(wǎng)絡(luò) PPS:多流、單流
● 網(wǎng)絡(luò) session 連接數(shù)
● 網(wǎng)絡(luò)新建連接數(shù)
● 網(wǎng)絡(luò)時(shí)延
● 網(wǎng)絡(luò)長(zhǎng)連接、網(wǎng)絡(luò)短連接性能
● 網(wǎng)絡(luò)并發(fā)性能:上述性能在多個(gè)機(jī)器的情況下,并發(fā)效果能否延續(xù)
● 網(wǎng)絡(luò)性能穩(wěn)定性:網(wǎng)絡(luò)壓力變大(pps 變大或者帶寬變大或者 session 數(shù)變大),時(shí)延的穩(wěn)定性
● 網(wǎng)絡(luò)丟包率、重傳率
網(wǎng)絡(luò)性能數(shù)據(jù)出來后,那這些數(shù)據(jù)又怎么看呢?下圖是一個(gè)常見分位圖:
絕大多數(shù)情況,在分析定義一個(gè)數(shù)據(jù)的時(shí)候,不能單單看 min、average、max,倒是分位數(shù)性能數(shù)據(jù)非常重要,還有波動(dòng)率。
如果這些問題你都能很好回答,想必你就是一位功力深厚的大俠了。
為什么性能測(cè)試沒那么簡(jiǎn)單?
性能測(cè)試如果僅僅是一個(gè)測(cè)試,還算簡(jiǎn)單。當(dāng)然復(fù)雜的測(cè)試也很復(fù)雜,比如干擾測(cè)試(模擬吵鬧鄰居)。但總的測(cè)試而言,就是一個(gè)工程自動(dòng)化,效率提升的手段。
那難在哪里?
難在上節(jié)的話題能否執(zhí)行到位。比如內(nèi)存時(shí)延,在 Intel 的 CPU,整機(jī)情況下是 2 個(gè)NUMA NODE,底層是 2 個(gè) CPU,那么需要考慮當(dāng)前 Node 的內(nèi)存時(shí)延,以及跨 Node 的內(nèi)存時(shí)延。知道這些后,那么后面應(yīng)用表現(xiàn)出來的現(xiàn)象才可能有相關(guān)解釋。
舉個(gè)例子,把一個(gè)性能測(cè)試步驟分解開來,如下:
這里只有一個(gè)環(huán)節(jié):test 環(huán)節(jié),需要的功力淺。這存在一個(gè)誤解,很多人以為性能測(cè)試就是 “test” 這一環(huán)節(jié),當(dāng)然不是!
breakdown,design,analyse,如果不是一個(gè)經(jīng)驗(yàn)豐富的性能工程師,怎么可能 breakdown,desgin,甚至 analyse。
舉個(gè)例子:Intel Cascadelake CPU 性能測(cè)試。breakdown 的時(shí)候,你需要很多背景知識(shí),這些背景知識(shí)會(huì)決定你后面的性能分析預(yù)期。
等等......
接下來是性能測(cè)試,在測(cè)試一個(gè)系列的性能測(cè)試時(shí),需要一套完整的性能測(cè)試方案,做個(gè)全方面的對(duì)比。這塊業(yè)界只有 SPEC CPU,SPEC JBB,UnixBench 等一套成熟的 CPU 性能測(cè)試,但是沒有完備服務(wù)器性能測(cè)試方案,這使得客戶上云變得很迷茫,怎么全面衡量云服務(wù)器的性能呢?這些都需要積累豐富,并形成一個(gè)完整體系。
等到性能測(cè)試結(jié)束,就需要去做性能分析,之前講了如何看網(wǎng)絡(luò)性能數(shù)據(jù),但有時(shí)也會(huì)有些奇怪的數(shù)據(jù)需要去解釋。
舉個(gè)實(shí)際例子:比如網(wǎng)絡(luò)單流的性能測(cè)試。有時(shí)候會(huì)發(fā)現(xiàn)波動(dòng)很厲害,起先以為是網(wǎng)絡(luò)性能不穩(wěn)定,后經(jīng)過實(shí)際排查,發(fā)現(xiàn)有概率發(fā)生中斷的 CPU 與網(wǎng)絡(luò)進(jìn)程所在 CPU 在同一個(gè)核的時(shí)候,性能就會(huì)非常差,通過 taskset 硬性隔離開,中斷和網(wǎng)絡(luò)測(cè)試進(jìn)程分別在不同的 CPU 上,網(wǎng)絡(luò)單流性能就上去了且穩(wěn)定。
所以,性能測(cè)試難就難在知識(shí)儲(chǔ)備夠不夠厚、能否充分理解業(yè)務(wù)性能、性能設(shè)計(jì)以及最終的性能分析,以及對(duì)于數(shù)據(jù)結(jié)果預(yù)期的確定等,這些都非一朝一夕之功!
那有什么破解之法呢?我認(rèn)為主要有三點(diǎn):
好學(xué):如果把一個(gè)業(yè)務(wù)系統(tǒng)從上到下去分析,每一個(gè)都可以發(fā)展開來:業(yè)務(wù)架構(gòu)、OS、一門語言、底層虛擬化、CPU 微架構(gòu)都是值得學(xué)習(xí)。推薦《性能之巔》這本書,可以領(lǐng)你入門。
勤:每一個(gè) Case 都是一次機(jī)會(huì),值得好好去研究。
鉆研:肯定會(huì)遇到問題,遇到問題不拋棄不放棄,發(fā)揚(yáng) Geek 精神!
性能測(cè)試人員需要具備的基本技能
文章最后,再分享下我認(rèn)為性能測(cè)試人員應(yīng)該具備的基本技能。
計(jì)算機(jī)體系知識(shí):計(jì)算機(jī)組成原理、操作系統(tǒng)、編譯原理、計(jì)算機(jī)網(wǎng)絡(luò)、軟件測(cè)試、Linux 內(nèi)核分析... 大學(xué)的課程都需要了。不但要有書本知識(shí),還能結(jié)合實(shí)際問題進(jìn)行分析。
架構(gòu)思維:任何一個(gè)需求,問題,都需要站在一個(gè)很高的位置去審視問題,去思考如何設(shè)計(jì);特別是客戶的問題,當(dāng)前架構(gòu)是否合理,出現(xiàn)這個(gè)問題有哪些方向。
自動(dòng)化測(cè)試:如何把這些手工的測(cè)試自動(dòng)化,是解放生產(chǎn)力必須的,同時(shí)才能輕松去完成線上巡檢。針對(duì)特殊問題,還需要具備構(gòu)建特殊的測(cè)試案例能力。
分析技巧:應(yīng)該熟練掌握各種性能分析的工具:top、vmstat、mpstat、pidstat、iostat、sar、火焰圖等,高階如 BPF 技巧。
實(shí)際工作經(jīng)驗(yàn):這個(gè)在設(shè)計(jì) Case 的時(shí)候太重要了,他知道什么要什么不要!
鉆研精神:一個(gè)系統(tǒng)涉及的領(lǐng)域方方面面,從上層業(yè)務(wù)到底層實(shí)現(xiàn),會(huì)遇到很多很多未知,需要潛心研究。
這可能有點(diǎn)虛,特別是架構(gòu)思維,只有接觸過很多很多的 Case,才能有些體悟。所以一般來說一個(gè)剛畢業(yè)的應(yīng)屆生是很難做好性能測(cè)試的。
舉個(gè)例子:一般來說呢,會(huì)有很多的 micro Benchmark,比如測(cè)試網(wǎng)絡(luò) PPS、網(wǎng)絡(luò)帶寬等等,那這些對(duì)用戶的實(shí)際影響是什么呢?很自然地想到,把用戶的 Case 搬過來,這么簡(jiǎn)單的一句話,實(shí)際很難:用戶的 Case 為什么要這么設(shè)計(jì)?每個(gè) Case 背后是有業(yè)務(wù)架構(gòu)師做了設(shè)計(jì)的。
用戶的 Case 該怎么測(cè)試?客戶實(shí)際是怎么壓測(cè)的?服務(wù)器的壓力應(yīng)該定在哪里?那請(qǐng)問一個(gè)從沒有從事過實(shí)際業(yè)務(wù)需求的人怎么知道這個(gè)是合理的?如果有這么一幫人在設(shè)計(jì)用戶的 Case 性能測(cè)試是不是很搞笑。所以如果要做真實(shí)的案例性能測(cè)試,必須是有一線作戰(zhàn)經(jīng)驗(yàn)的同學(xué),他知道怎么樣的壓力是最合適的,他知道這個(gè)服務(wù)器性能是否夠,是不是要提升。
總結(jié)
綜上,性能測(cè)試沒那么簡(jiǎn)單,性能測(cè)試不單單是一個(gè)測(cè)試,他的要求遠(yuǎn)遠(yuǎn)高于一名測(cè)試人員,他是一名性能架構(gòu)師,更是一名全能手!
最后,請(qǐng)記住一個(gè)好的性能工程師是喂出來的,他要經(jīng)歷千錘百煉,方有銳劍出鞘!共勉。
原文鏈接:https://developer.aliyun.com/article/784338?
版權(quán)聲明:本文內(nèi)容由阿里云實(shí)名注冊(cè)用戶自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,阿里云開發(fā)者社區(qū)不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。具體規(guī)則請(qǐng)查看《阿里云開發(fā)者社區(qū)用戶服務(wù)協(xié)議》和《阿里云開發(fā)者社區(qū)知識(shí)產(chǎn)權(quán)保護(hù)指引》。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,填寫侵權(quán)投訴表單進(jìn)行舉報(bào),一經(jīng)查實(shí),本社區(qū)將立刻刪除涉嫌侵權(quán)內(nèi)容。總結(jié)
以上是生活随笔為你收集整理的性能测试真如你想象的那么简单?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从业务在线到互联互通,钉钉宜搭进入低代码
- 下一篇: Openstack迁移DDH最佳实践