mcm伺服器怎麼樣
Ⅰ AMD EPYC的模塊化和NUMA之路
看起來似乎有強行把晶元設計和數據中心建設拉到一起尬聊的感覺,但世間也沒有那麼多的一見如故,一些有意義的討論未嘗不是從尬聊開始的。
就我個人而言,今年已經多次在關於數據中心的文章和(線上)分享中提到AMD:「從1月29日開始到2月6日,騰訊會議每天都在進行資源擴容,日均擴容雲主機接近1.5萬台,8天總共擴容超過10萬台雲主機,共涉及超百萬核的計算資源投入,全部由騰訊雲自研的伺服器星星海提供支撐。」這款伺服器基於AMD去年8月發布的代號Rome(羅馬)的第二代EPYC處理器,最大的特點就是核多——雙路配置再算上超線程,一台採用騰訊雲定製版EPYC處理器的星星海伺服器可以為雲伺服器提供多達180個核——也就是說,這100萬核伺服器資源,「只」需要不到6000台該款自研伺服器即可滿足。
騰訊雲星星海SA2伺服器採用2U高度結合類似遠程散熱片(remote heat-sink)的設計,配合6個60mm風扇,據稱可以支持2個300W級別的CPU(AMD第二代EPYC處理器公開版本最高TDP為280W)
實際上,官方名稱為AMD EPYC 7002系列的第二代EPYC處理器最多能提供64個核芯、128個線程,騰訊雲定製版本選擇了48核芯(96線程)而已。至少在CPU的核數(core count)上,AMD給Intel(英特爾,昵稱「大英」)造成了很大的壓力。上個月英特爾發布了代號為Cooper Lake的第三代至強可擴展處理器(Xeon Scalable Processor,XSP),主打四路和八路市場,四路配置可提供112核芯224線程,核數上堪與雙路EPYC 7002系列抗衡,為10nm製程的Ice Lake爭取時間。
摩爾定律難以延續的後果就是CPU的功耗持續攀升,第一代至強可擴展處理器(公開版)里TDP最高的205W,到第三代已是尋常,250W算是克制——畢竟要考慮四路的散熱需求
話說上一次AMD搞得大英如此狼狽,還要追溯到本世紀初的64位路線之爭。眾所周知,英特爾是x86及其生態(特別是軟體生態)的締造者,屬於「親媽」級別,AMD充其量是個「後媽」。但是,x86幾十年的發展史證明,「親媽」未必就比「後媽」更了解孩子的發展潛力。也可以前一陣大火的劇集《隱秘的角落》為例,看完就會發現,對於朱朝陽的隱藏能力,後媽的認知似乎先於親媽。
Cooper Lake:你看我還有機會嗎?
簡單的說,Intel建立發展x86生態,AMD堅定捍衛x86路線——不斷改造作為生態核心的x86處理器,煥顏新生
盛衰無常:架構與製程的雙簧
雖然已經在過去十年中逐漸淪為愛好者口中的「牙膏廠」,但在歷史上,英特爾一直不乏創新精神。對待x86的態度可以算是這種精神的一個體現,起碼在進入64位時代之前,英特爾其實不太瞧得上x86,總覺得這個娃太low——可能是親媽更了解孕育過程中的種種先天不足吧——幾次三番地在重大的轉折點,想要「與時俱進」,重起爐灶,帶給用戶「船新體驗」。反而是AMD屢屢在關鍵時刻出來捍衛x86,通過翻新加蓋來維持其生命力。
64位是關鍵的轉折點。上世紀九十年代末,還是32位的x86剛「插足」伺服器市場不久,英特爾選擇與惠普(HP)聯手開發基於IA-64架構的Itanium(安騰)作為接班人,與已經64位了的RISC陣營大佬們對抗。然而,AMD認為x86還可以搶救一下,決定通過64位擴展來「續命」,並在2003年4月發布首款64位x86處理器Opteron,兩年後又把x86(-64)帶入多核時代。
此時,英特爾已經在IA-64的路上走了十多年。時過境遷,當初設定的目標並沒有實現,而x86擴展到64位和多核之後,不僅軟體和應用的生態系統得到了完整的繼承,性能也完全可以一戰。用戶用腳投票,大英不得不從。
第二代EPYC處理器發布會上,Google出示2008年7月9日上線的其第100萬台伺服器的照片,追訴與AMD的革命友情……還是台四路伺服器
英特爾痛定思痛,決定用架構和製程構築雙保險,在2007年提出了Tick-Tock(取自於時鍾的「嘀-嗒」周期)量產模式,即先通過製程升級將晶元面積縮小,是為Tick;再基於操練純熟的製程改用新的微架構,是為Tock。當時的英特爾工廠在技術和產能上都占據明顯優勢,只要架構上回到正軌,左右手組合拳一出,產量受限的AMD哪裡支撐得住?在2008年推出Nehalem微架構之後,英特爾終於奪回主動權。
在英特爾施加的強大壓力下,AMD在處理器架構上也犯了錯誤,2011年推出的Bulldozer(推土機)架構採用了即使現在看來也過於激進的模塊化設計。隨著2012年英特爾開啟至強E5時代,AMD在節節失利後不得不退出伺服器市場,上一個巔峰期徹底結束。
有道是:福兮禍所依,禍兮福所伏。先賢曾經曰過:縱有架構、製程雙保險,奈何CEO是單點。2016年英特爾推出最後一代至強E5/E7(v4),這是英特爾首批採用14nm製程的伺服器CPU,同時也宣告了Tick-Tock模式的終結,改用Process–Architecture–Optimization (製程-架構-優化)的三步走模式。
在這個可以簡稱為PAO的模式里,雖然仍是先製程、後架構的節奏,但新加入的優化不管是針對兩者中的哪一個還是兼而有之,都起到了拉長製程換代周期的效果。第三代至強可擴展處理器已經是第四波採用14nm製程的伺服器CPU,14nm後面的「+」都數不清楚有幾個了——還好預計年底發布的Ice Lake將終止這個「土撥鼠之日」式的製程循環。
架構層面上,從代號Skylake的初代至強可擴展處理器開始,由環形匯流排改為6×6的2D-mesh,然後持續「優化」。在架構的角度,Mesh和環形匯流排都屬於所謂傳統的單片(Monolithic)式架構,優點是整體性好,涉及到I/O的性能比較有保證;缺點是對製程不太友好,隨著規模的擴大,譬如核數和Cache的增加,良率上的挑戰很大,高端產品的成本下不來,這對於追求高核數的雲計算服務提供商顯然不是個好消息。
至強E5/E7 v4的四環(2組雙向環形匯流排)與至強SP的6×6 Mesh架構
關鍵時刻,又是沉寂多年的AMD挺身而出,接盤Tick-Tock,以自己的方式「維護」摩爾定律。
這個方式,就是模塊化。
MCM:同構對等模塊化的利與弊
先簡單回顧一下AMD之前的模塊化設計為什麼會失敗。 Bulldozer架構的模塊化設計,建立在AMD對未來應用趨勢的不靠譜假設上,即整數(Integer,INT)運算將占據絕對主導地位,結論是增加整數運算單元,減少浮點(Floating Point,FP)運算單元。 於是,Bulldozer架構很「雞賊」的採用了兩個(具有完整整數運算單元的)核芯共用一個浮點運算單元的模塊化設計,兩個模塊就可以提供4個核芯(但只有2個浮點運算單元),6核以此類推。
模塊化本身並沒有錯,Intel Nehalem的模塊化設計就很成功。Bulldozer錯在「拆東牆補西牆」,結果連補強都算不上
不用放馬後炮,這也是一個妄揣用意(用戶意志)的行為。即使是在AI大行其道的今天,第二代英特爾至強可擴展處理器已經支持INT8加速推理運算,也不能和通常意義上CPU的整數運算劃等號。貿然押寶,錯了當然怪不得別人。
不難看出,Bulldozer的模塊化,與之前Intel Nehalem架構的模塊化設計,只限於架構層面,並不是為製程考慮——CPU不論幾個模塊多少核,都是作為一個整體(die)來製造的,畢竟十年前製程還沒到瓶頸。
然而,到了AMD以代號Naples的(第一代)EPYC處理器重返伺服器市場的2017年,摩爾定律放緩的跡象已很明顯。同樣的14nm(可能還沒有英特爾的先進)製程,AMD如何以更低的成本提供更多的核芯?
EPYC系列處理器基於AMD的Zen系列架構,從Zen、Zen+到Zen 2,以及規劃中的Zen 3的發展路線,有點像前面提到的Tick-Tock:開發一個良好的基礎然後交替演進,不斷優化。
與先輩們不同,Zen系列的模塊化明顯側重於解決製程面對的挑戰,即晶元在物理上被切割為多個die(比較小的晶元更容易製造,良率有保證,有利於降低成本),通過Infinity Fabric(IF)互連為一個整體,所以每個die就是一個模塊,但不一定是模塊化設計的最小單位。
第一代EPYC處理器的4個die及Infinity Fabric示意
還是從初代EPYC處理器所採用的Zen架構說起。Zen確立了該系列計算單元模塊化的最小單位CCX(Core Complex,核芯復合體),每個CCX包括4個Zen核芯(Core),以及8 MiB共享L3 Cache,每核芯2 MiB。
從AMD公開的示意圖來看,各片(Slice)L3 Cache之間的連接方式像是full-mesh(全網狀,即每兩個點之間都有直接連接,無需跳轉),CCX內部的跨核芯L3 Cache訪問是一致的
Zen的CCD里除了2個CCX,還有2個DDR內存控制器(各對應1個內存通道),用於片上(die之間)互連的Infinity Fabric(IF On-Package,IFOP),而CPU之間互連的Infinity Fabric(IF Inter-Socket,IFIS)與對外的PCIe通道是復用的——這個知識點在後面會用到。
晶元層面的模塊是CCD(Core Complex Die),包括2個CCX,共8個Core、4 MiB L2 Cache、16 MiB L3 Cache。官方名稱為AMD EPYC 7001系列的第一代EPYC處理器只有CCD這一種(die層面的)模塊,所以每個CCD除了2個CCX,還有大量I/O介面器件,包括DDR、Infinity Fabric/PCIe控制器,CCX佔CCD面積的比例只比一半略多(56%)。
這個多晶元模塊(multi-chip mole,MCM)架構的代號為Zeppelin(齊柏林),四個這樣的「復合型」CCD構成完整的第一代EPYC處理器,最多能提供32核芯、64 MiB L3 Cache,直接減少CCD的數量就會得到面向PC市場的高端(2×CCD)和主流產品(單CCD)。
按照AMD提供的數據:每個die的面積為213mm²(平方毫米),4個die的MCM封裝總面積為852mm²,如果要用大型單一晶元來實現,面積可以縮小到777mm²,大約節省10%,但是製造和測試成本要提高約40%,完全32核的收益下降約17%、成本提高約70%。投入產出比當然非常劃算,也變相的說出了大英的苦衷——可是,後者為什麼還在堅持單片路線呢?
MCM這種完全對稱的模塊化方案,如果套用到數據中心領域,相當於一個園區,幾棟建築結構和功能完全一樣,都包含了機房、變配電、柴發、冷站、辦公和接待區域等。好處當然是彼此之間沒有硬性依賴,每棟建築都可以獨立作為數據中心使用,照此復制就可成倍擴大規模;缺點是沒有其他類型的建築,而有些功能還是需要專門的建築集中和分區管理的,譬如人員辦公和統一接待……
如果一個數據中心園區只有黃框里這一種建築(模塊)……實際上,加上左邊的66KV變電站,這里也只是整個園區的一角
況且,與絕大多數的數據中心園區不同,CPU對各模塊之間的耦合度要求高得多,否則無法作為一個整體來運作,分工合作快速完成數據處理等任務。而這,正是MCM方案的局限性所在。
第一代EPYC的每個CCD都有「自己的」內存和I/O(主要是PCIe)通道,加上CCD之間的互連,每個CCD的外部I/O都很「重度」
多晶元(對稱)設計、全「分布式」架構的特點是內存和I/O擴展能力與CCD數量同步,隨著核芯數量的增加,內存和I/O的總「容量」(包括帶寬)會增加,這當然是優點,但缺點也隨之而來:
首先是局部性(locality)會降低I/O的性能,主要是跨CCD的內存訪問時延(latency)明顯上升。因為每組(2個)CCX都有自己的本地內存,如果要訪問其他CCD上連接的內存,要額外花費很多時間,即所謂的NUMA(Non-Uniform Memory Access,非一致性內存訪問)。雖然Zen的CCD上有足夠多的IFOP,讓4個CCD之間能組成全連接(full-mesh),無需經其他CCD跳轉(類似於CCX內4個核芯之間的狀況),但I/O路徑畢竟變長了;如果要訪問其他CPU(插槽)連接的內存,還要經過IFIS,時延會進一步上升。
CCD里的兩個CCX也通過Infinity Fabric連接,同樣會增加跨CCX的Cache訪問時延
根據AMD提供的數據,不同內存訪問的時延水平大致如下:
隨著訪問路徑變長和復雜,時延以大約一半的比例增加,這個幅度還是很明顯的。
同一個CCD里的內存訪問沒有明顯差異,而跨CCD的內存訪問,時延增加就很明顯了
然後是PCIe,前面已經有圖說明,Zen用於CPU之間互連的IFIS與PCIe通道是復用的,即單路(單CPU)的情況下全都用於PCIe通道,共有128個;雙路(雙CPU)的情況下每個CPU都要拿出一半來作為(兩者之間的)IFIS,所以(對外的)PCIe通道數量仍然是128個,沒有隨著CPU數量的增加而增長。
簡單歸納一下,Zen架構的問題是:核數越多,內存訪問的一致性越差;CPU數量增加,外部I/O的擴展能力不變——NUMA引發的跨CPU訪問時延增長問題還更嚴重。
單CPU就能提供128個PCIe 3.0通道原本是第一代EPYC處理器的一大優勢,但雙CPU仍然是這么多,就略顯尷尬了
核數進一步增加的困難很大,不論是增加每個CCD的核數,還是增加CCD的數量,都要面臨互連的復雜度問題,也會進一步惡化一致性。
說得更直白一些,就是Zen架構的擴展能力比較有限,難以支持更大的規模。
既然雙路配置有利有弊,AMD又是時隔多年重返伺服器市場,單路一度被認為是EPYC的突破口,譬如戴爾(Dell)在2018年初推出三款基於第一代EPYC的PowerEdge伺服器,其中就有兩款是單路。
1U的R6415和2U的R7415都是單路伺服器
類似的情況在通常用不到那麼多核及I/O擴展能力的PC市場體現得更為明顯,在只需要一到兩個CCD即可的情況下,消費者更多感受到的是低成本帶來的高性價比,所以「AMD Yes!」的鼓噪主要來自個人用戶,伺服器市場在等待EPYC的進一步成熟。
只有1個die的Ryzen將Zen架構的缺點最小化,獲得個人用戶的喜愛也就不足為奇了
Chiplet:異構混合模塊化的是與非
時隔兩年之後,AMD推出基於Zen 2架構的第二代EPYC處理器,通過架構與製程一體優化,達到最高64核、256 MiB L3 Cache,分別是第一代EPYC的2倍和4倍,內存訪問一致性和雙路的擴展性也有不同程度的改善,終於獲得了一眾雲服務提供商(CSP)的青睞。
Zen 2的整體設計思維是Zen的延續,但做了很多明顯的改進,配合製程(部分)升級到7nm,突破了Zen和Zen+在規模擴展上的限制。
首先,Zen2架構延續了Zen/Zen+架構每個CCD有2個CCX、每個CCX有4個核芯共享L3 Cache的布局,但是每個核芯的L3 Cache增大一倍,來到4MiB,每個CCX有16 MiB L3 Cache,是Zen/Zen+架構的兩倍。
CCD層面的主要變化是把DDR內存、對外的Infinity Fabric(IFOP/IFIS)和PCIe控制器等I/O器件剝離,以便於升級到7nm製程。AMD表示,第一代EPYC中,上述I/O器件佔CCD晶元面積的比例達到44%,從製程提高到7nm中獲益很小;而第二代EPYC的7nm CCD中,CPU和L3 Cache這些核心計算、存儲器件的佔比,高達86%,具有很好的經濟性。
被從CCD中拿出來的DDR內存控制器、Infinity Fabric和PCIe控制器等I/O器件,組成了一個單獨的I/O晶元,即I/O Die,簡稱IOD,仍然採用成熟的14nm工藝。
自左至右,分別是傳統單片式、第一代EPYC的MCM、第二代EPYC的Chiplet三種架構的示意圖
一個IOD居中,最多8個CCD圍繞著它,AMD把這種做法稱為Chiplet(小晶元)。
如果繼續拿數據中心的模塊化來強行類比,相當於把整個園區內的變電站、柴發、冷站、辦公和接待區域都整合到一個建築里,位於園區中央,周圍是構造完全相同的一座座機房樓……你說,這樣一個所有機房樓都離不開的建築,該有多重要?
僅從布局看,和第二代EPYC處理器有點像的數據中心,但變電站在園區外,製冷也是分布式的(與4個機房模塊在一起),中間的建築並沒有上面設想的那麼重要
第一代EPYC處理器(Naples)與第二代EPYC處理器(Rome)的片上布局對比,後者是1個IOD + 8個CCD,共9個小晶元組成的混合多die設計
因為CCD的數量增加一倍,所以Rome的核數可以達到Naples的兩倍;因為每個CCX/CPU核芯的L3 Cache容量也增加了一倍,所以Rome的L3 Cache總容量可以達到Naples的四倍。
14nm IOD + 7nm CCD的組合——因為不是全部升級到7nm,所以我更願意稱之為製程的「優化」——體現了更高的擴展性和靈活性,使第二代EPYC能夠以較低的製造成本提供更豐富的產品組合,提高了市場競爭力。但是,事情並沒有看起來這么簡單,要了解產品的具體構成和預期的性能表現,您還需要繼續往下看。
2019年8月,第二代EPYC正式發布後不久,AMD在Hot Chips大會上介紹了Zen 2產品的Chiplet設計。可能是之前有Zen+架構採用12nm製程的緣故吧,IOD的製程被寫成了12nm,其他場合的官方材料都是14nm,所以我們還是以後者為准
今年2月IEEE的ISSCC(International Solid-State Circuits Conference,國際固態電路峰會)2020上,AMD更詳細的介紹了Zen 2這一代產品的設計。結合前一幅圖可以看到,第二代EPYC的IOD具有83.4億晶體管,數量與同樣採用14nm製程的英特爾Skylake/Cascade Lake相當——雖然兩者的晶體管類型構成有很大差別,但可以作為一個參照,說明這個IOD自身的規模和復雜度。
從紅框中的選項來看,EPYC 7302 CPU有4個CCD,每個CCX有2個核芯,可以選擇各啟用1個
IOD集中所有I/O器件的一個好處是,CPU能提供的內存通道數量與CCD的數量無關。E企實驗室前一陣測試了基於第二代EPYC處理器的Dell PowerEdge R7525伺服器,送測配置包括2個AMD EPYC 7302處理器,從PowerEdge R7525的BIOS設置中可以看到,這款16核的CPU有4個CCD(而不是8個),應該對應下圖中右二的情形:
上方柱狀圖是AMD列出7+14nm Chiplet方案與假設的單片7nm方案相比,成本優勢可以達到一半以上(64核沒有假設,可能是指單片式很難製造);下方從左至右依次是8、6、4、2個CCD的布局,原則是盡可能的對稱
雖然7302在EPYC 7002系列產品中定位偏低端,只有16個核芯,用4個CCX就能滿足,但是它擁有128MiB的L3 Cache,這又需要8個CCX才可以。因此,7302的每個CCX只有2個核芯,享受原本屬於4個核芯的16 MiB L3 Cache。
從EPYC 7002系列的配置表中可以看出,7302下面72開頭的產品才是真正的低端,譬如同樣是16核的7282,不僅L3 Cache容量只有7302的一半(倒是符合每核4 MiB的「標配」),而且僅支持4個內存通道,也是7302等產品的一半——說明其CCD數量是2個,就像前一幅圖右下方所示的情況——4個內存通道配置的運行頻率也低,只有DDR4-2667,與標準的8通道DDR4-3200相比,理論內存帶寬僅為40%多
Dell PowerEdge R7525用戶手冊里對內存條的安裝位置有很詳細的說明,畢竟插滿8個內存通道和只用4個內存通道,性能差距太大
IOD集中所有I/O對性能也有好處,因為內存控制器集中在一個晶元上,有助於降低內存訪問的局部性(NUMA)。不過,AMD在很多場合放出的示意圖很有誤導性,容易讓人以為,對Rome(下圖右側)來說,同一個CPU上的內存訪問是不存在NUMA的。
從上面的數據來看,第二代EPYC處理器的「本地」內存訪問時延有所增長,畢竟內存控制器和CCX不在一個die上了;收益是跨CPU內存訪問的時延有所下降,總體更為平均
好在,稍微詳細一點的架構示意圖表明,一個EPYC 7002系列CPU內部的內存訪問仍然會有「遠近」之分:
Dell PowerEdge R7525的BIOS配置中,可以在L3 Cache的NUMA設置為Enabled之後,看到每個CPU內部其實還是可以像EPYC 7001系列一樣,分成4個不同的NUMA區域
這時學術性會議的價值就體現出來。AMD在ISSCC 2020上的演講表明,完整版的Server IOD要承載的功能太多,已經有太多的晶體管,中間都被Infinity Fabric和PCIe相關的I/O所佔據,內存控制器只能兩兩一組布置在IOD的四角,每2個CCD就近共享2個內存控制器。由於中間已經沒有走線空間,只能構成一個沒有對角線連接的2D-mesh拓撲——僅從拓撲角度而論,還不如EPYC 7001系列4個CCD的full-mesh連接方式。所以,臨近的訪問有長短邊造成的延遲差異,對角線的內存訪問因為要走過一長一短兩條邊,沒有捷徑可走,自然要更慢一些。
注意放大看IOD布局示意圖和右側1~4的不同等級時延註解,可以理解為每個CPU內部仍然分為4個NUMA區域:本地、短邊、長邊、(拐個彎才能抵達的)對角線
Hot Chips大會上的這張示意圖突出了不同功能的Infinity Fabric導致的IOD中部擁擠,和DDR內存控制器都被擠到邊角上的感覺。結合前一張圖,不難理解,像EPYC 7282這樣只有2個CCD對角線布置的低端SKU,另一條對角線上的4個DDR內存控制器主要起增加內存容量的作用,不如只保留CCD就近的4個內存通道
總之,不管是EPYC 7001系列的MCM,還是EPYC 7002系列的Chiplet,隨著晶元數量的增長,性能肯定會受到越來越明顯的影響(而不是近乎線性的同步提升),只是好的架構會延緩總體性能增長的衰減速度。
這里我們可以回過頭來看看同樣基於Zen 2架構的第三代AMD Ryzen處理器,主流PC產品沒有那麼多核數要求,只用2個CCD即可滿足,所以其配套的Client IOD(cIOD)正好是Server IOD的四分之一,從前面圖中晶體管數量的對比(20.9億 vs. 83.4億)也可以看出來。
代號「Matisse」的第三代Ryzen,仍然可以看到兩個DDR4內存控制器偏居一隅的「遺存」,但對兩個CCD已經公平了很多,基本不存在NUMA問題。也就難怪「AMD真香」黨在消費類用戶中比例要大得多
盡管CCD升級到了7nm,但更多核芯、更大得多的L3 Cache,意味著整體功耗的上升,譬如同樣16核的7302和7282,前者Cache大一倍,頻率略有提高,默認TDP就來到了155W,Dell為送測的R7525配備了180W的散熱器——而EPYC 7282的TDP則「只有」120/150W。當然,CCD應用7nm的效果還是比較明顯的,同樣16核、L3 Cache只有7302四分之一,運行頻率還低500MHz的7301,TDP也有150/170W,基本與7302相當。
為了滿足雲計算、高性能計算(HPC)和虛擬化等場景的用戶需求,AMD又向EPYC 7002系列CPU中增加了大量多核大(L3) Cache以及核數雖少但頻率很高的型號(如今年初發布的7Fx2系列),導致全系列產品中TDP在200W以上的SKU佔比很高,也給伺服器的散熱設計帶來了更高的挑戰。
200W+的CPU將越來越常見
EPYC 7002系列的另一大改進是PCIe從3.0升級到4.0,單路仍然是128個通道,但雙路可以支持多達160個通道(譬如Dell PowerEdge R7525的特定配置)——在主板支持的情況下。第一代EPYC處理器推出時的一個賣點是,為其設計的主板也可以支持第二代EPYC處理器。沒有廣而告之的是,要支持PCIe 4.0,主板需要重新設計。用老主板可以更快的把第二代EPYC處理器推向市場,卻不能充分發揮新CPU的全部能力。
不過,PCIe 4.0本身就是一個很大的話題,留待以後(有機會的話)專文討論。