我是阿里雲神龍計算平臺高級專家西邪。
我從 2018 年開始組建阿里雲彈性計算的性能測試團隊,從要一週完成一組性能測試,到只需 1 分鐘就可以觸發一組全自動性能測試,到最後結果整理一鍵搞定,內部命名為開天斧。
現在開天斧已經承擔整個彈性計算所有的性能測試工作:新技術、新設備、新規格等等,保證了線上的性能穩定性。在性能測試的同時,還要負責解決客戶的性能問題。期間還負責了“變形金剛”這個項目,把物理機的底層資源管理產品化了,使得現在線上千變萬化的規格,只需一個模板就可以簡單實現。
這裡就先跟大家分享下這 3 年在性能測試上的一些收穫。
什麼是性能測試?
性能測試不同於功能測試,功能測試驗證的是某個功能是否完成,性能測試驗證的是某個性能是否達到。
驗證性能就需要很多性能“標尺”,如衡量 CPU 性能:通過 SPEC CPU,UnixBench 等;衡量網絡性能用 netperf,iperf,sockperf 等等;衡量存儲性能最好用的是 fio,衡量內存帶寬性能則是 stream。
上述說的都 micro Benchmark,通常如果某塊做的不好,就可以直接提缺陷給相關的團隊去優化;而客戶實際感知的是真實業務場景,那就需要去模擬客戶的場景,比如客戶經常使用的是 nginx,redis,MySQL 等,通過實際的場景測試,來驗證當前服務器的優劣。通過做好性能測試,才能建立自己的底氣,做好性能分析,才能知道哪裡薄弱,從而往哪裡發力!
性能測試要做哪些?
性能的重要性無需多言,我就直接略過了。一個服務器有 5 大塊:CPU、內存、存儲、網絡、OS。對,就是驗證這些模塊的性能,上面也簡單介紹了下該用哪些工具進行性能測試。但是對於性能測試而言,如果僅僅是一個測試,那太簡單了,實際上還需要考慮很多。
性能主要可以看以下幾個方面:
- 用什麼工具來驗證?性能測試的完備性如何保證?如何快速持續構建性能測試,手工跑就直接廢了,工程化如何構建?
- 性能測試怎麼設計?如何針對性去設計?性能測試其實是去測試一個預期。
- 出來的性能數據怎麼分析,重點關注哪個?
- 性能有差異?為什麼有差異?虛擬化問題,物理機問題,OS 問題,Benchmark 問題?還是...
- 如何去分析異常性能數據?這個問題一般是通用業務團隊的架構師才能解。
可能光談問題還是抽象了點,我再具體舉幾個例子。
先談與 CPU 相關:
● Intel、AMD、ARM 差異?指令差異
● CPU 不同代數差異
● CPU 主頻、基頻、睿頻、P0-n、P0-1
● CPU 是否 PIN 住
● 超線程開關:底層開關、OS 開關
● NUMA 架構:membind、interleave...
● 電源策略: performance、powersave、C-State 聯繫
● TDP: 睿頻不符預期時看下 TDP 是否限制住了,很有用!
● L3 Cache 大小
● 內存帶寬、內存時延
● OS:內核版本、CPU 漏洞開關
● CPU 微碼
● 軟件:glibc 版本等
● 不同版本、特殊編譯器:AOCC、icc
上面的這些都是 CPU 需要具備的基礎知識,甚至還需要深入底層去看問題,比如看底層 CPU 的 PMU 相關的一些東西。同樣其他模塊知識也是必不可少的。
除了知識具備外,每個模塊測試完備性也很重要,比如分析網絡性能數據,重點看下面這些性能:
● 網絡帶寬:多流、單流
● 網絡 PPS:多流、單流
● 網絡 session 連接數
● 網絡新建連接數
● 網絡時延
● 網絡長連接、網絡短連接性能
● 網絡併發性能:上述性能在多個機器的情況下,併發效果能否延續
● 網絡性能穩定性:網絡壓力變大(pps 變大或者帶寬變大或者 session 數變大),時延的穩定性
● 網絡丟包率、重傳率
網絡性能數據出來後,那這些數據又怎麼看呢?下圖是一個常見分位圖:
絕大多數情況,在分析定義一個數據的時候,不能單單看 min、average、max,倒是分位數性能數據非常重要,還有波動率。
如果這些問題你都能很好回答,想必你就是一位功力深厚的大俠了。
為什麼性能測試沒那麼簡單?
性能測試如果僅僅是一個測試,還算簡單。當然複雜的測試也很複雜,比如干擾測試(模擬吵鬧鄰居)。但總的測試而言,就是一個工程自動化,效率提升的手段。
那難在哪裡?
難在上節的話題能否執行到位。比如內存時延,在 Intel 的 CPU,整機情況下是 2 個NUMA NODE,底層是 2 個 CPU,那麼需要考慮當前 Node 的內存時延,以及跨 Node 的內存時延。知道這些後,那麼後面應用表現出來的現象才可能有相關解釋。
舉個例子,把一個性能測試步驟分解開來,如下:
這裡只有一個環節:test 環節,需要的功力淺。這存在一個誤解,很多人以為性能測試就是 “test” 這一環節,當然不是!
breakdown,design,analyse,如果不是一個經驗豐富的性能工程師,怎麼可能 breakdown,desgin,甚至 analyse。
舉個例子:Intel Cascadelake CPU 性能測試。breakdown 的時候,你需要很多背景知識,這些背景知識會決定你後面的性能分析預期。
- 與 Skylake CPU 的區別:主頻設置,CPU 代數差異等。
- 虛擬化方案:是否 PIN 住,是否跨 Socket。
- 底層技術適配:網絡存儲有無優化。
- 實例形態:有哪些規格,CPU 如何綁定。
等等......
接下來是性能測試,在測試一個系列的性能測試時,需要一套完整的性能測試方案,做個全方面的對比。這塊業界只有 SPEC CPU,SPEC JBB,UnixBench 等一套成熟的 CPU 性能測試,但是沒有完備服務器性能測試方案,這使得客戶上雲變得很迷茫,怎麼全面衡量雲服務器的性能呢?這些都需要積累豐富,並形成一個完整體系。
等到性能測試結束,就需要去做性能分析,之前講了如何看網絡性能數據,但有時也會有些奇怪的數據需要去解釋。
舉個實際例子:比如網絡單流的性能測試。有時候會發現波動很厲害,起先以為是網絡性能不穩定,後經過實際排查,發現有概率發生中斷的 CPU 與網絡進程所在 CPU 在同一個核的時候,性能就會非常差,通過 taskset 硬性隔離開,中斷和網絡測試進程分別在不同的 CPU 上,網絡單流性能就上去了且穩定。
所以,性能測試難就難在知識儲備夠不夠厚、能否充分理解業務性能、性能設計以及最終的性能分析,以及對於數據結果預期的確定等,這些都非一朝一夕之功!
那有什麼破解之法呢?我認為主要有三點:
好學:如果把一個業務系統從上到下去分析,每一個都可以發展開來:業務架構、OS、一門語言、底層虛擬化、CPU 微架構都是值得學習。推薦《性能之巔》這本書,可以領你入門。
勤:每一個 Case 都是一次機會,值得好好去研究。
鑽研:肯定會遇到問題,遇到問題不拋棄不放棄,發揚 Geek 精神!
性能測試人員需要具備的基本技能
文章最後,再分享下我認為性能測試人員應該具備的基本技能。
計算機體系知識:計算機組成原理、操作系統、編譯原理、計算機網絡、軟件測試、Linux 內核分析... 大學的課程都需要了。不但要有書本知識,還能結合實際問題進行分析。
架構思維:任何一個需求,問題,都需要站在一個很高的位置去審視問題,去思考如何設計;特別是客戶的問題,當前架構是否合理,出現這個問題有哪些方向。
自動化測試:如何把這些手工的測試自動化,是解放生產力必須的,同時才能輕鬆去完成線上巡檢。針對特殊問題,還需要具備構建特殊的測試案例能力。
分析技巧:應該熟練掌握各種性能分析的工具:top、vmstat、mpstat、pidstat、iostat、sar、火焰圖等,高階如 BPF 技巧。
實際工作經驗:這個在設計 Case 的時候太重要了,他知道什麼要什麼不要!
鑽研精神:一個系統涉及的領域方方面面,從上層業務到底層實現,會遇到很多很多未知,需要潛心研究。
這可能有點虛,特別是架構思維,只有接觸過很多很多的 Case,才能有些體悟。所以一般來說一個剛畢業的應屆生是很難做好性能測試的。
舉個例子:一般來說呢,會有很多的 micro Benchmark,比如測試網絡 PPS、網絡帶寬等等,那這些對用戶的實際影響是什麼呢?很自然地想到,把用戶的 Case 搬過來,這麼簡單的一句話,實際很難:用戶的 Case 為什麼要這麼設計?每個 Case 背後是有業務架構師做了設計的。
用戶的 Case 該怎麼測試?客戶實際是怎麼壓測的?服務器的壓力應該定在哪裡?那請問一個從沒有從事過實際業務需求的人怎麼知道這個是合理的?如果有這麼一幫人在設計用戶的 Case 性能測試是不是很搞笑。所以如果要做真實的案例性能測試,必須是有一線作戰經驗的同學,他知道怎麼樣的壓力是最合適的,他知道這個服務器性能是否夠,是不是要提升。
總結
綜上,性能測試沒那麼簡單,性能測試不單單是一個測試,他的要求遠遠高於一名測試人員,他是一名性能架構師,更是一名全能手!
最後,請記住一個好的性能工程師是喂出來的,他要經歷千錘百煉,方有銳劍出鞘!共勉。