我是阿裡雲彈性計算性能測試負責人西邪。
我從 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 性能測試是不是很搞笑。是以如果要做真實的案例性能測試,必須是有一線作戰經驗的同學,他知道怎麼樣的壓力是最合适的,他知道這個伺服器性能是否夠,是不是要提升。
總結
綜上,性能測試沒那麼簡單,性能測試不單單是一個測試,他的要求遠遠高于一名測試人員,他是一名性能架構師,更是一名全能手!
最後,請記住一個好的性能工程師是喂出來的,他要經曆千錘百煉,方有銳劍出鞘!共勉。