天天看點

多級NUMA:AMD EPYC互連速率、位寬與功耗的關系

下圖是動筆寫之前臨時加進來的,看完本文您應該會發現,我要讨論的内容與具體哪家伺服器的關系并不大。

很早就聽朋友說EPYC是MCM“膠水封裝”,AMD這款處理器使用了4個基于Ryzen的SoC/Die,具體點說就是每個Die都相當于SoC,都帶有記憶體和PCIe控制器。

Socket/Die/Channel:解讀三種NUMA設定

上圖示意出了4個Die(每Die最多8核)與記憶體通道、IO之間的對應關系,這裡的IO沒有區分用于PCIe還是CPU之間互連。

對伺服器BIOS裡NUMA設定熟悉的朋友,應該都見過Interleave(交錯)這個選項。按照傳統設計的CPU,“Node Interleave”就意味着關閉NUMA優化(玩資料庫的一些朋友熟悉這個吧),而到了AMD EPYC我們看到了3個不同的Interleave選項。

Socket Interleave——相當于Intel Xeon的Node Interleave,也就是NUMA徹底關閉。在單插槽AMD EPYC配置下該選項不可用,而在雙CPU時選擇這一項就意味着系統隻有1個NUMA節點。

Die Interleave——由于前面提到的設計,AMD EPYC片上多Die連接配接的記憶體有就近和局部通路優化的關系,是以就多出了一級NUMA設定。如果選擇這一項,就意味着(部分)啟用插槽間的NUMA優化,但在每顆CPU上的4個Die之間關閉NUMA。

Channel Interleave——這是隻在每個Die的2個記憶體通道間交錯存取,多個Die、插槽間全部啟用NUMA優化。此時對于單顆AMD EPYC相當于4個NUMA Node,兩顆CPU這個數字就是8。

Fabric互連速率、位寬與功耗之間的關系

上面這個表我一開始沒看太明白,後來才發現它講的是記憶體總線速度與Infinity Fabric Speed之間的對應關系,類似于固定的“倍頻”。那麼為什麼同一顆CPU上Die之間的互連速率,要比插槽間互連的的速率慢一倍呢?

上面寫的每條Die間互連42GB/s雙向帶寬(單個方向為一半),除以5.3GT/s不難算出MCM link的信道寬度是32bit。如此每個Die共有96對(192)引腳用于片上互連。

至于插槽間的互連,在每2個Die之間是38GB/s的雙向總帶寬,這裡似乎我拿9.6GT/s才能整除,可計算出該link的信道寬度是16bit。這樣4個Die總和64 lane正好等于從128 lane PCIe控制器“挪用”過來的一半。

那麼既然跨插槽能做到10.6GT/s,為什麼不把跨Die連接配接也設為這個速率來加快片上通信呢?我覺得是為了平衡功耗,跨插槽互連的能耗比為9pj/bit,而片上跨Die隻有2pj/bit。

我們不妨廣義地了解AMDEPYC的每個Die有4個32bit Fabric I/O接口,其中3個用于Die間互連;隻有一個用于PCIe,或者再分出一半給插槽間互連。Die間有相對充足的信道寬度,是以選擇了降低頻率以控制整個MCM封裝的功耗。

伺服器BIOS示例、PCIe插槽NUMA親和

上圖以Dell PowerEdgeR7425雙路伺服器為例,經過前面的介紹大家應該知道“Channel Interleaving”選項在這裡的含義,即最大(8 Node)NUMA優化。

注:當選擇在伺服器後側增加3.5英寸磁盤位,PCIe插槽的數量會受到影響。

上表是另外一款R7415單路伺服器PCIe插槽,與CPU Die/NUMA Node、記憶體插槽之間的對應關系。由于該機型最多支援24個U.2 NVMe SSD,是以AMDEPYC PCIe控制器中應該有一部分被預留給了驅動器背闆。

在軟體設計上,如果想要發揮NUMA最大的效率,比如Embedded LOM網卡直接連在CPU Die 2上,它通路同一NUMA Node所屬的記憶體插槽(A7,A8,A15,A16)延時就是最低的。

上圖是不帶後側熱插拔驅動器位的R7415,此時除了貼近主機闆的LOM網卡之外,還有2個全高PCIe和2個半高PCIe擴充槽位。

參考資料:《Directfrom Development – PowerEdge NUMA Configurations with AMD EPYC Processors》

http://en.community.dell.com/techcenter/extras/m/white_papers/20444763/