共享內(nèi)存多處理器架構(gòu)在過去幾十年的演變
8 分鐘閱讀
非統(tǒng)一內(nèi)存訪問 (NUMA) 是當(dāng)今多處理系統(tǒng)中使用的共享內(nèi)存架構(gòu)畦木。每個 CPU 都分配有自己的本地內(nèi)存绞绒,并且可以從系統(tǒng)中的其他 CPU 訪問內(nèi)存。本地內(nèi)存訪問提供低延遲 - 高帶寬性能耕腾。而訪問另一個 CPU 擁有的內(nèi)存具有更高的延遲和更低的帶寬性能〖#現(xiàn)代應(yīng)用程序和操作系統(tǒng)(如 ESXi)默認(rèn)支持 NUMA,但要提供最佳性能扫俺,虛擬機配置應(yīng)在考慮 NUMA 架構(gòu)的情況下完成苍苞。如果設(shè)計不正確,則該特定虛擬機或在該 ESXi 主機上運行的所有 VM 的最壞情況下都會出現(xiàn)意外行為或整體性能下降狼纬。 本系列旨在深入介紹 CPU 架構(gòu)羹呵、內(nèi)存子系統(tǒng)以及 ESXi CPU 和內(nèi)存調(diào)度程序。允許您創(chuàng)建一個高性能平臺疗琉,為更高的服務(wù)和更高的整合率奠定基礎(chǔ)冈欢。在我們了解現(xiàn)代計算架構(gòu)之前,回顧一下共享內(nèi)存多處理器架構(gòu)的歷史有助于理解我們今天使用 NUMA 系統(tǒng)的原因没炒。
在設(shè)計一致的低延遲涛癌、高帶寬平臺時犯戏,似乎稱為統(tǒng)一內(nèi)存訪問的架構(gòu)更適合送火。然而,現(xiàn)代系統(tǒng)架構(gòu)將限制它真正統(tǒng)一先匪。要了解這背后的原因种吸,我們需要回顧歷史以確定并行計算的關(guān)鍵驅(qū)動因素。 隨著七十年代初期關(guān)系數(shù)據(jù)庫的引入呀非,對能夠為多個并發(fā)用戶操作和過多數(shù)據(jù)生成提供服務(wù)的系統(tǒng)的需求成為主流坚俗。盡管單處理器性能令人印象深刻,但多處理器系統(tǒng)能夠更好地處理這種工作負(fù)載岸裙。為了提供具有成本效益的系統(tǒng)猖败,共享內(nèi)存地址空間成為研究的重點。早期降允,提倡使用交叉開關(guān)的系統(tǒng)恩闻,但是隨著這種設(shè)計的復(fù)雜性隨著處理器的增加而增加,這使得基于總線的系統(tǒng)更具吸引力剧董。允許總線系統(tǒng)中的處理器通過在總線上發(fā)送請求來訪問整個內(nèi)存空間幢尚,這是一種盡可能最佳地使用可用內(nèi)存的非常經(jīng)濟有效的方式破停。
然而,基于總線的系統(tǒng)有其自身的可擴展性問題尉剩。主要問題是帶寬有限真慢,這限制了總線可以容納的處理器數(shù)量。將 CPU 添加到系統(tǒng)會引入兩個主要的關(guān)注領(lǐng)域:
- 每個節(jié)點的可用帶寬隨著每個 CPU 的增加而減少理茎。
- 添加更多處理器時黑界,總線長度會增加,從而增加延遲功蜓。
CPU 的性能增長园爷,特別是處理器和內(nèi)存性能之間的速度差距,過去是式撼,現(xiàn)在仍然是童社,對多處理器來說是毀滅性的。由于預(yù)計處理器和內(nèi)存之間的內(nèi)存差距會增加著隆,因此人們投入了大量精力來開發(fā)有效的策略來管理內(nèi)存系統(tǒng)扰楼。其中一項策略是添加內(nèi)存緩存,這帶來了許多挑戰(zhàn)美浦。解決這些挑戰(zhàn)仍然是當(dāng)今 CPU 設(shè)計團隊的主要關(guān)注點弦赖,對緩存結(jié)構(gòu)和復(fù)雜算法進行了大量研究以避免緩存未命中。
緩存監(jiān)聽協(xié)議介紹
為每個 CPU 附加一個緩存可以在很多方面提高性能浦辨。使內(nèi)存更靠近 CPU 可以減少平均內(nèi)存訪問時間蹬竖,同時減少內(nèi)存總線上的帶寬負(fù)載。在共享內(nèi)存架構(gòu)中為每個 CPU 添加緩存的挑戰(zhàn)在于它允許內(nèi)存塊的多個副本存在流酬。這稱為緩存一致性問題币厕。為了解決這個問題,發(fā)明了緩存?zhèn)陕爡f(xié)議芽腾,試圖創(chuàng)建一個模型來提供正確的數(shù)據(jù)旦装,同時又不會耗盡總線上的所有帶寬。最流行的協(xié)議 write invalidate 在寫入本地緩存之前擦除所有其他數(shù)據(jù)副本摊滔。其他處理器對該數(shù)據(jù)的任何后續(xù)讀取都將檢測到其本地緩存中的緩存未命中阴绢,并且將從包含最近修改的數(shù)據(jù)的另一個 CPU 的緩存中提供服務(wù)。這種模型節(jié)省了大量總線帶寬艰躺,并允許統(tǒng)一內(nèi)存訪問系統(tǒng)在 1990 年代初期出現(xiàn)呻袭。第 3 部分更詳細(xì)地介紹了現(xiàn)代緩存一致性協(xié)議。
統(tǒng)一內(nèi)存訪問架構(gòu)
對系統(tǒng)中任何內(nèi)存模塊的訪問時間相同(統(tǒng)一)的基于總線的多處理器的處理器通常稱為統(tǒng)一內(nèi)存訪問 (UMA) 系統(tǒng)或?qū)ΨQ多處理器 (SMP)腺兴。 對于 UMA 系統(tǒng)左电,CPU 通過系統(tǒng)總線(前端總線)連接到北橋。北橋包含內(nèi)存控制器,所有進出內(nèi)存的通信都必須通過北橋券腔。負(fù)責(zé)管理所有設(shè)備的 I/O 的 I/O 控制器連接到北橋伏穆。因此,每一個I/O都必須經(jīng)過北橋才能到達CPU纷纫。
多個總線和內(nèi)存通道用于使可用帶寬加倍并減少北橋的瓶頸枕扫。為了進一步增加內(nèi)存帶寬,一些系統(tǒng)將外部內(nèi)存控制器連接到北橋辱魁,從而提高帶寬并支持更多內(nèi)存烟瞧。然而,由于北橋的內(nèi)部帶寬和早期 snoopy 緩存協(xié)議的廣播性質(zhì)染簇,UMA 被認(rèn)為具有有限的可擴展性参滴。隨著當(dāng)今高速閃存設(shè)備的使用,每秒推動數(shù)十萬次 IO锻弓,他們完全正確地認(rèn)為這種架構(gòu)無法擴展以適應(yīng)未來的工作負(fù)載砾赔。
非統(tǒng)一內(nèi)存訪問架構(gòu)
為了提高可伸縮性和性能,對共享內(nèi)存多處理器架構(gòu)進行了三個關(guān)鍵更改青灼;
- 非統(tǒng)一內(nèi)存訪問組織
- 點對點互連拓?fù)?/li>
- 可擴展的緩存一致性解決方案
1:非統(tǒng)一內(nèi)存訪問組織
NUMA 擺脫了集中式內(nèi)存池并引入了拓?fù)鋵傩员┬摹Mㄟ^根據(jù)從處理器到內(nèi)存的信號路徑長度對內(nèi)存位置進行分類,可以避免延遲和帶寬瓶頸杂拨。這是通過重新設(shè)計處理器和芯片組的整個系統(tǒng)來完成的专普。NUMA 架構(gòu)在 90 年代末流行起來,當(dāng)時它被用于 SGI 超級計算機弹沽,例如Cray Origin 2000檀夹。NUMA 幫助識別內(nèi)存的位置,在這些系統(tǒng)的這種情況下策橘,他們不得不想知道哪個機箱中的哪個內(nèi)存區(qū)域保存內(nèi)存位炸渡。
在千禧年的上半葉,AMD 將 NUMA 帶入了 UMA 系統(tǒng)至高無上的企業(yè)環(huán)境役纹。2003 年推出了 AMD Opteron 系列偶摔,其特點是集成內(nèi)存控制器暇唾,每個 CPU 都擁有指定的內(nèi)存條促脉。每個 CPU 現(xiàn)在都有自己的內(nèi)存地址空間。NUMA 優(yōu)化操作系統(tǒng)(如 ESXi)允許工作負(fù)載從兩個內(nèi)存地址空間消耗內(nèi)存策州,同時優(yōu)化本地內(nèi)存訪問瘸味。讓我們使用雙 CPU 系統(tǒng)的示例來闡明單個系統(tǒng)中本地和遠程內(nèi)存訪問之間的區(qū)別。
連接到 CPU1 的內(nèi)存控制器的內(nèi)存被認(rèn)為是本地內(nèi)存够挂。連接到另一個 CPU 插槽 (CPU2) 的內(nèi)存對于 CPU1 來說被認(rèn)為是外部的或遠程的旁仿。遠程內(nèi)存訪問比本地內(nèi)存訪問有額外的延遲開銷,因為它必須遍歷互連(點對點鏈接)并連接到遠程內(nèi)存控制器。由于內(nèi)存位置不同枯冈,該系統(tǒng)會經(jīng)歷“不一致”的內(nèi)存訪問時間毅贮。
2:點對點互連
AMD 通過AMD Opteron 微架構(gòu)引入了點對點連接 HyperTransport 。英特爾于 2007 年通過在其 Nehalem 處理器系列設(shè)計中引入QuickPath 架構(gòu)而放棄了其雙獨立總線架構(gòu)尘奏。
Nehalem架構(gòu)是英特爾微體系結(jié)構(gòu)中的重大設(shè)計變更滩褥,被認(rèn)為是英特爾酷睿系列的第一代。當(dāng)前的 Broadwell 架構(gòu)是英特爾酷睿品牌的第 4 代(英特爾至強 E5 v4)炫加,最后一段包含了更多關(guān)于微架構(gòu)世代的信息瑰煎。在 QuickPath 架構(gòu)中,內(nèi)存控制器移至 CPU俗孝,并引入了 QuickPath 點對點互連 (QPI) 作為系統(tǒng)中 CPU 之間的數(shù)據(jù)鏈路酒甸。
Nehalem 微架構(gòu)不僅取代了傳統(tǒng)的前端總線,而且將整個子系統(tǒng)重組為服務(wù)器 CPU 的模塊化設(shè)計赋铝。這種模塊化設(shè)計被稱為“Uncore”插勤,并創(chuàng)建了一個用于緩存和互連速度的構(gòu)建塊庫。移除前端總線改善了帶寬可擴展性問題革骨,但在處理大量內(nèi)存容量和帶寬時必須解決處理器內(nèi)和處理器間通信饮六。集成內(nèi)存控制器和 QuickPath 互連都是 Uncore 的一部分,并且是模型特定寄存器 (MSR)苛蒲。它們連接到提供處理器內(nèi)和處理器間通信的 MSR卤橄。Uncore 的模塊化還允許英特爾提供不同的 QPI 速度,在編寫英特爾 Broadwell-EP 微架構(gòu)(2016)時提供 6臂外。每秒 4 千兆傳輸 (GT/s)窟扑、8.0 GT/s 和 9.6 GT/s。分別在CPU之間提供25.6 GB/s漏健、32 GB/s和38.4 GB/s的理論最大帶寬嚎货。從這個角度來看,最后使用的前端總線提供了 1.6 GT/s 或 12.8 GB/s 的平臺帶寬蔫浆。在引入 Sandy Bridge 時殖属,Intel 將 Uncore 重新命名為 System Agent,但當(dāng)前文檔中仍使用術(shù)語 Uncore瓦盛。您可以在第 2 部分中找到有關(guān) QuickPath 和 Uncore 的更多信息洗显。然而,術(shù)語 Uncore 仍在當(dāng)前文檔中使用原环。您可以在第 2 部分中找到有關(guān) QuickPath 和 Uncore 的更多信息挠唆。然而,術(shù)語 Uncore 仍在當(dāng)前文檔中使用嘱吗。您可以在第 2 部分中找到有關(guān) QuickPath 和 Uncore 的更多信息玄组。
3:可擴展的緩存一致性
每個核心都有一個通往 L3 緩存的專用路徑。每條路徑都由一千根電線組成,你可以想象俄讹,如果你想減少納米制造工藝哆致,同時增加要訪問緩存的內(nèi)核,這將無法很好地擴展患膛。為了能夠擴展沽瞭,Sandy Bridge Architecture 將 L3 緩存從 Uncore 中移出,并引入了可擴展的環(huán)形片上互連剩瓶。這允許 Intel 將 L3 高速緩存劃分和分布在相等的片中驹溃。這提供了更高的帶寬和關(guān)聯(lián)性。每個切片為 2.5 MB延曙,一個切片與每個核心相關(guān)聯(lián)豌鹤。該環(huán)還允許每個內(nèi)核訪問其他所有切片。下圖是 Broadwell 微架構(gòu) (v4) (2016) 的低核心數(shù) (LCC) Xeon CPU 的芯片配置枝缔。
這種緩存架構(gòu)需要一個監(jiān)聽協(xié)議布疙,該協(xié)議結(jié)合了分布式本地緩存和系統(tǒng)中的其他處理器,以確保緩存一致性愿卸。隨著系統(tǒng)中內(nèi)核的增加灵临,窺探流量會增加,因為每個內(nèi)核都有自己穩(wěn)定的緩存未命中流趴荸。這會影響 QPI 鏈接和末級緩存的消耗儒溉,需要不斷開發(fā)探聽一致性協(xié)議。第 3 部分將深入介紹 Uncore发钝、可擴展環(huán)形片上互連以及緩存?zhèn)陕爡f(xié)議對 NUMA 性能的重要性顿涣。
非交錯啟用 NUMA = SUMA
物理內(nèi)存分布在主板上,但是酝豪,系統(tǒng)可以通過在兩個 NUMA 節(jié)點之間交錯內(nèi)存來提供單個內(nèi)存地址空間涛碑。這稱為節(jié)點交錯(設(shè)置在第 2 部分中介紹)。啟用節(jié)點交錯后孵淘,系統(tǒng)將成為足夠統(tǒng)一的內(nèi)存架構(gòu) (SUMA)蒲障。系統(tǒng)不是將系統(tǒng)中處理器和內(nèi)存的拓?fù)湫畔⒑托再|(zhì)中繼到操作系統(tǒng),而是將整個內(nèi)存范圍分解為 4KB 可尋址區(qū)域瘫证,并以循環(huán)方式從每個節(jié)點映射它們揉阎。這提供了一種“交錯式”內(nèi)存結(jié)構(gòu),其中內(nèi)存地址空間分布在節(jié)點之間痛悯。
有趣的是余黎,SUMA 系統(tǒng)提供了統(tǒng)一的內(nèi)存訪問時間重窟。只是不是最佳的载萌,并且在很大程度上取決于 QPI 體系結(jié)構(gòu)中的競爭級別。Intel Memory Latency Checker用于演示同一系統(tǒng)上 NUMA 和 SUMA 配置之間的差異。
此測試測量系統(tǒng)中從每個套接字到另一個套接字的空閑延遲(以納秒為單位)扭仁。Socket 0 報告的內(nèi)存節(jié)點0 的延遲是本地內(nèi)存訪問垮衷,內(nèi)存節(jié)點1 的socket 0 的內(nèi)存訪問是配置為NUMA 的系統(tǒng)中的遠程內(nèi)存訪問。
正如預(yù)期的那樣乖坠,交織受到不斷遍歷 QPI 鏈接的影響搀突。空閑內(nèi)存測試是最好的情況熊泵,一個更有趣的測試是測量加載延遲仰迁。如果您的 ESXi 服務(wù)器處于空閑狀態(tài),那將是一項糟糕的投資顽分,因此您可以假設(shè) ESXi 系統(tǒng)正在處理數(shù)據(jù)徐许。測量負(fù)載延遲可以更好地了解系統(tǒng)在正常負(fù)載下的性能。在測試期間卒蘸,負(fù)載注入延遲每 2 秒自動更改一次雌隅,并且?guī)捄拖鄳?yīng)的延遲都是在該級別測量的。本次測試使用100%讀取流量缸沃。左側(cè)為NUMA測試結(jié)果恰起,右側(cè)為SUMA測試結(jié)果。
與配置為 NUMA 的系統(tǒng)相比趾牧,SUMA 系統(tǒng)報告的帶寬較低检盼,同時保持較高的延遲。因此翘单,重點應(yīng)該放在優(yōu)化 VM 大小上以利用系統(tǒng)的 NUMA 特性梯皿。
Nehalem & Core 微架構(gòu)概述
隨著 2008 年 Nehalem 微架構(gòu)的推出,英特爾放棄了 Netburst 架構(gòu)县恕。Nehalem 微架構(gòu)向英特爾客戶介紹了 NUMA东羹。多年來,英特爾根據(jù)其著名的 Tick-Tock 模型引入了新的微體系結(jié)構(gòu)和優(yōu)化忠烛。每一次 Tick 都會進行優(yōu)化属提,縮小工藝技術(shù),每一次 Tock 都會引入新的微體系結(jié)構(gòu)美尸。盡管 Intel 自 2012 年以來提供了一致的品牌模型冤议,但人們傾向于使用 Intel 架構(gòu)代號來討論 CPU tick 和 tock 世代。即使 EVC 基線也列出了這些內(nèi)部英特爾代號师坎,品牌名稱和架構(gòu)代號將在本系列中使用:
接下來恕酸,第 2 部分:系統(tǒng)架構(gòu)
NUMA 深度剖析系列:
- 第 0 部分: 介紹 NUMA 深度剖析系列
- 第 1 部分:從 UMA 到 NUMA
- 第 2 部分:系統(tǒng)架構(gòu)
- 第 3 部分:緩存一致性
- 第 4 部分:本地內(nèi)存優(yōu)化
- 第 5 部分:ESXi VMkernel NUMA 構(gòu)造