理解 NUMA 架構(gòu)
最近在研究 kubernetes 下 NUMA 架構(gòu)的支持, 看到一篇關(guān)于NUMA的博文,就嘗試翻譯成了中文, 原文地址: https://linuxhint.com/understanding_numa_architecture/
設(shè)計(jì)電腦總是一種妥協(xié)。計(jì)算機(jī)的四個(gè)基本部件——中央處理單元(CPU)或處理器、內(nèi)存、存儲(chǔ)器和連接部件的電路板(I/O總線系統(tǒng))——被盡可能巧妙地組合在一起,以創(chuàng)造出一臺(tái)既劃算又強(qiáng)大的機(jī)器。設(shè)計(jì)過(guò)程主要涉及處理器(協(xié)處理器、多核設(shè)置)、內(nèi)存類型和數(shù)量、存儲(chǔ)(磁盤(pán)、文件系統(tǒng))以及價(jià)格的優(yōu)化。協(xié)同處理器和多核架構(gòu)背后的理念是,在盡可能小的空間中,將操作分配到盡可能多的單個(gè)計(jì)算單元,并使并行執(zhí)行計(jì)算指令更容易獲得和負(fù)擔(dān)得起。就內(nèi)存而言,這是一個(gè)可以由單個(gè)計(jì)算單元處理的數(shù)量或大小的問(wèn)題,以及哪種內(nèi)存類型具有盡可能低的延遲。存儲(chǔ)屬于外部?jī)?nèi)存,其性能取決于磁盤(pán)類型、正在使用的文件系統(tǒng)、線程、傳輸協(xié)議、通信結(jié)構(gòu)和附加的內(nèi)存設(shè)備的數(shù)量。
I/O總線的設(shè)計(jì)代表了計(jì)算機(jī)的主干,并顯著地決定了上面列出的單個(gè)組件之間可以交換多少數(shù)據(jù)和多快的數(shù)據(jù)。排名第一的是用于高性能計(jì)算(HPC)領(lǐng)域的組件。截至2020年年中,高性能計(jì)算的當(dāng)代代表產(chǎn)品有英偉達(dá)特斯拉和DGX、Radeon Instinct和英特爾Xeon Phi gpu加速器產(chǎn)品(產(chǎn)品對(duì)比見(jiàn)[引用1,2])。
理解NUMA
非統(tǒng)一內(nèi)存訪問(wèn)(NUMA)描述了當(dāng)代多處理系統(tǒng)中使用的共享內(nèi)存架構(gòu)。NUMA是一個(gè)由多個(gè)節(jié)點(diǎn)組成的計(jì)算系統(tǒng),所有節(jié)點(diǎn)共享聚合的內(nèi)存:每個(gè)CPU被分配自己的本地內(nèi)存,并且可以從系統(tǒng)中的其他CPU訪問(wèn)內(nèi)存,見(jiàn)[引用12,7]。
NUMA是一個(gè)巧妙的系統(tǒng),用于將多個(gè)中央處理單元(CPU)連接到計(jì)算機(jī)上任何數(shù)量的可用內(nèi)存。單個(gè)NUMA節(jié)點(diǎn)通過(guò)可伸縮網(wǎng)絡(luò)(I/O總線)連接,這樣CPU就可以系統(tǒng)地訪問(wèn)與其他NUMA節(jié)點(diǎn)關(guān)聯(lián)的內(nèi)存。
本地內(nèi)存是CPU在特定NUMA節(jié)點(diǎn)中使用的內(nèi)存。外部或遠(yuǎn)程內(nèi)存是CPU從另一個(gè)NUMA節(jié)點(diǎn)獲取的內(nèi)存。術(shù)語(yǔ)NUMA比率描述了訪問(wèn)外部?jī)?nèi)存成本與訪問(wèn)本地內(nèi)存成本的比率。比例越大,成本就越大,因此訪問(wèn)內(nèi)存所需的時(shí)間就越長(zhǎng)。
但是,它所花費(fèi)的時(shí)間比CPU訪問(wèn)它自己的本地內(nèi)存要長(zhǎng)。本地內(nèi)存訪問(wèn)是一個(gè)主要的優(yōu)勢(shì),因?yàn)樗Y(jié)合了低延遲和高帶寬。相比之下,訪問(wèn)屬于任何其他CPU的內(nèi)存具有更高的延遲和更低的帶寬性能。

回顧:共享內(nèi)存多處理器的發(fā)展
Frank Dennemann[引用8]指出,現(xiàn)代系統(tǒng)架構(gòu)不允許真正的統(tǒng)一內(nèi)存訪問(wèn)(UMA),即使這些系統(tǒng)是專門(mén)為此目的而設(shè)計(jì)的。簡(jiǎn)單地說(shuō),并行計(jì)算的思想是讓一組處理器協(xié)同計(jì)算給定的任務(wù),從而加快傳統(tǒng)的順序計(jì)算。
正如Frank Dennemann[引用8]所解釋的那樣,在20世紀(jì)70年代早期,隨著關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)的引入,“對(duì)能夠服務(wù)多個(gè)并發(fā)用戶操作和過(guò)多數(shù)據(jù)生成的系統(tǒng)的需求成為主流”。“盡管單處理器的性能令人印象深刻,但多處理器系統(tǒng)能夠更好地處理這種工作負(fù)載。為了提供性價(jià)比高的系統(tǒng),共享內(nèi)存地址空間成為研究的重點(diǎn)。早期,使用交叉開(kāi)關(guān)的系統(tǒng)被提倡,然而隨著這種設(shè)計(jì)的復(fù)雜性隨著處理器的增加而增加,這使得基于總線的系統(tǒng)更有吸引力??偩€系統(tǒng)中的處理器(可以)通過(guò)在總線上發(fā)送請(qǐng)求來(lái)訪問(wèn)整個(gè)內(nèi)存空間,這是一種盡可能優(yōu)化地使用可用內(nèi)存的非常劃算的方式。”
然而,基于總線的計(jì)算機(jī)系統(tǒng)有一個(gè)瓶頸——有限的帶寬會(huì)導(dǎo)致可伸縮性問(wèn)題。系統(tǒng)中添加的cpu越多,每個(gè)節(jié)點(diǎn)可用的帶寬就越少。此外,添加的cpu越多,總線就越長(zhǎng),因此延遲就越高。
大多數(shù)cpu都是在二維平面上構(gòu)建的。cpu還必須添加集成內(nèi)存控制器。對(duì)于每個(gè)CPU核心,有四個(gè)內(nèi)存總線(上、下、左、右)的簡(jiǎn)單解決方案允許完全可用的帶寬,但僅此而已。cpu在很長(zhǎng)一段時(shí)間內(nèi)都停滯在4核狀態(tài)。當(dāng)芯片變成3D時(shí),在上面和下面添加痕跡允許直接總線穿過(guò)對(duì)角線相反的cpu。在卡上放置一個(gè)四核CPU,然后連接到總線,這是合乎邏輯的下一步。
如今,每個(gè)處理器都包含許多核心,這些核心都有一個(gè)共享的片上緩存和片外內(nèi)存,并且在服務(wù)器內(nèi)不同內(nèi)存部分的內(nèi)存訪問(wèn)成本是可變的。
提高數(shù)據(jù)訪問(wèn)效率是當(dāng)前CPU設(shè)計(jì)的主要目標(biāo)之一。每個(gè)CPU核都被賦予了一個(gè)較小的一級(jí)緩存(32 KB)和一個(gè)較大的二級(jí)緩存(256 KB)。各個(gè)核心隨后共享幾個(gè)MB的3級(jí)緩存,其大小隨著時(shí)間的推移而大幅增長(zhǎng)。
為了避免緩存丟失(請(qǐng)求不在緩存中的數(shù)據(jù)),需要花費(fèi)大量的研究時(shí)間來(lái)尋找合適的CPU緩存數(shù)量、緩存結(jié)構(gòu)和相應(yīng)的算法。關(guān)于緩存snoop協(xié)議[引用4]和緩存一致性[引用3,5]的更詳細(xì)的解釋,以及NUMA背后的設(shè)計(jì)思想,請(qǐng)參見(jiàn)[引用8]。
NUMA的軟件支持
有兩種軟件優(yōu)化措施可以提高支持NUMA架構(gòu)的系統(tǒng)的性能—處理器關(guān)聯(lián)性和數(shù)據(jù)放置。正如[引用19]中解釋的那樣,“處理器關(guān)聯(lián)[…]允許將進(jìn)程或線程綁定到單個(gè)CPU或一系列CPU,以便進(jìn)程或線程只在指定的CPU或CPU上執(zhí)行,而不是在任何CPU上執(zhí)行?!毙g(shù)語(yǔ)“數(shù)據(jù)放置”是指將代碼和數(shù)據(jù)盡可能地保存在內(nèi)存中的軟件修改。
不同的UNIX和UNIX相關(guān)操作系統(tǒng)通過(guò)以下方式支持NUMA(以下列表來(lái)自[引用14]):
Silicon Graphics IRIX支持ccNUMA架構(gòu)超過(guò)1240 CPU與Origin服務(wù)器系列。 Microsoft Windows 7和Windows Server 2008 R2增加了對(duì)64個(gè)邏輯核上NUMA架構(gòu)的支持。 Linux內(nèi)核的2.5版本已經(jīng)包含了基本的NUMA支持,在后續(xù)的內(nèi)核版本中得到了進(jìn)一步的改進(jìn)。Linux內(nèi)核的3.8版帶來(lái)了新的NUMA基礎(chǔ),允許在以后的內(nèi)核版本[引用13]中開(kāi)發(fā)更有效的NUMA策略。Linux內(nèi)核的3.13版本帶來(lái)了大量的策略,旨在將進(jìn)程放在靠近其內(nèi)存的位置,以及對(duì)各種情況的處理,例如在進(jìn)程之間共享內(nèi)存頁(yè),或使用透明的巨大頁(yè);新的系統(tǒng)控制設(shè)置允許啟用或禁用NUMA平衡,以及配置各種NUMA內(nèi)存平衡參數(shù)[引用15]。 Oracle和OpenSolaris都采用了引入邏輯組的NUMA架構(gòu)。 FreeBSD在11.0版本中添加了初始NUMA親和性和策略配置。
蔡寧在《Computer Science and Technology, Proceedings of the International Conference (CST2016)》一書(shū)中提出NUMA架構(gòu)的研究主要集中在高端計(jì)算環(huán)境,提出了NUMA-aware Radix Partitioning (NaRP),優(yōu)化NUMA節(jié)點(diǎn)中的共享緩存的性能,以加速商業(yè)智能應(yīng)用程序。因此,NUMA代表共享內(nèi)存(SMP)系統(tǒng)與幾個(gè)處理器[引用6]之間的中間地帶。

NUMA和Linux
如上所述,Linux內(nèi)核從版本2.5開(kāi)始就支持NUMA了。Debian GNU/Linux和Ubuntu都提供numactl[引用16]和numad[引用17]兩個(gè)軟件包對(duì)進(jìn)程優(yōu)化的NUMA支持。在numactl命令的幫助下,您可以列出系統(tǒng)[引用18]中可用NUMA節(jié)點(diǎn)的清單:
# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
node 0 size: 8157 MB
node 0 free: 88 MB
node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
node 1 size: 8191 MB
node 1 free: 5176 MB
node distances:
node 0 1
0: 10 20
1: 20 10
NumaTop是Intel開(kāi)發(fā)的一個(gè)有用的工具,用于監(jiān)視運(yùn)行時(shí)內(nèi)存位置和分析NUMA系統(tǒng)中的進(jìn)程[引用10,11]。該工具可以識(shí)別潛在的NUMA相關(guān)性能瓶頸,從而幫助重新平衡內(nèi)存/CPU分配,以最大限度地發(fā)揮NUMA系統(tǒng)的潛力。有關(guān)更詳細(xì)的描述,請(qǐng)參閱[引用9]。

使用場(chǎng)景
支持NUMA技術(shù)的計(jì)算機(jī)允許所有cpu直接訪問(wèn)整個(gè)內(nèi)存——cpu將其視為一個(gè)單一的線性地址空間。這可以更有效地使用64位尋址方案,從而更快地移動(dòng)數(shù)據(jù)、更少地復(fù)制數(shù)據(jù)、更容易地進(jìn)行編程。
NUMA系統(tǒng)對(duì)于服務(wù)器端應(yīng)用程序非常有吸引力,比如數(shù)據(jù)挖掘和決策支持系統(tǒng)。此外,有了這種架構(gòu),為游戲和高性能軟件編寫(xiě)應(yīng)用程序變得更加容易。
結(jié)論
總之,NUMA架構(gòu)解決了可伸縮性問(wèn)題,這是它的主要優(yōu)點(diǎn)之一。在NUMA CPU中,一個(gè)節(jié)點(diǎn)將擁有更高的帶寬或更低的延遲來(lái)訪問(wèn)同一節(jié)點(diǎn)上的內(nèi)存(例如,本地CPU在遠(yuǎn)程訪問(wèn)的同時(shí)請(qǐng)求內(nèi)存訪問(wèn);優(yōu)先級(jí)在本地CPU上)。如果將數(shù)據(jù)本地化到特定的進(jìn)程(以及處理器),這將顯著提高內(nèi)存吞吐量。缺點(diǎn)是將數(shù)據(jù)從一個(gè)處理器移動(dòng)到另一個(gè)處理器的成本較高。只要這種情況不經(jīng)常發(fā)生,NUMA系統(tǒng)將優(yōu)于具有更傳統(tǒng)架構(gòu)的系統(tǒng)
引用
Compare NVIDIA Tesla vs. Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-tesla_vs_radeon-instinct Compare NVIDIA DGX-1 vs. Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-dgx-1_vs_radeon-instinct Cache coherence, Wikipedia, https://en.wikipedia.org/wiki/Cache_coherence Bus snooping, Wikipedia, https://en.wikipedia.org/wiki/Bus_snooping Cache coherence protocols in multiprocessor systems, Geeks for geeks, https://www.geeksforgeeks.org/cache-coherence-protocols-in-multiprocessor-system/ Computer science and technology – Proceedings of the International Conference (CST2016), Ning Cai (Ed.), World Scientific Publishing Co Pte Ltd, ISBN: 9789813146419 Daniel P. Bovet and Marco Cesati: Understanding NUMA architecture in Understanding the Linux Kernel, 3rd edition, O’Reilly, https://www.oreilly.com/library/view/understanding-the-linux/0596005652/ Frank Dennemann: NUMA Deep Dive Part 1: From UMA to NUMA, https://frankdenneman.nl/2016/07/07/numa-deep-dive-part-1-uma-numa/ Colin Ian King: NumaTop: A NUMA system monitoring tool, http://smackerelofopinion.blogspot.com/2015/09/numatop-numa-system-monitoring-tool.html Numatop, https://github.com/intel/numatop Package numatop for Debian GNU/Linux, https://packages.debian.org/buster/numatop Jonathan Kehayias: Understanding Non-Uniform Memory Access/Architectures (NUMA), https://www.sqlskills.com/blogs/jonathan/understanding-non-uniform-memory-accessarchitectures-numa/ Linux Kernel News for Kernel 3.8, https://kernelnewbies.org/Linux_3.8 Non-uniform memory access (NUMA), Wikipedia, https://en.wikipedia.org/wiki/Non-uniform_memory_access Linux Memory Management Documentation, NUMA, https://www.kernel.org/doc/html/latest/vm/numa.html Package numactl for Debian GNU/Linux, https://packages.debian.org/sid/admin/numactl Package numad for Debian GNU/Linux, https://packages.debian.org/buster/numad How to find if NUMA configuration is enabled or disabled?, https://www.thegeekdiary.com/centos-rhel-how-to-find-if-numa-configuration-is-enabled-or-disabled/ Processor affinity, Wikipedia, https://en.wikipedia.org/wiki/Processor_affinity
感謝
作者要感謝Gerold Rupprecht在準(zhǔn)備本文時(shí)的支持。
關(guān)于作者
普萊克斯·內(nèi)翰達(dá)(Plaxedes Nehanda)是一位多才多藝、自我驅(qū)動(dòng)的多面手,他身兼多種職務(wù),其中包括活動(dòng)策劃、虛擬助理、轉(zhuǎn)錄員以及熱心的研究員,現(xiàn)居南非約翰內(nèi)斯堡。 Prince K. Nehanda是位于津巴布韋哈拉雷的paflow Metering公司的儀器和控制(計(jì)量)工程師。 弗蘭克·霍夫曼(Frank Hofmann)在路上工作——最好是來(lái)自德國(guó)柏林、瑞士日內(nèi)瓦和南非開(kāi)普敦——他是Linux- user和Linux Magazine等雜志的開(kāi)發(fā)者、培訓(xùn)師和作者,他也是Debian包管理書(shū)籍的合著者。
翻譯地址:https://izsk.me/2022/06/02/System-Understanding-NUMA-Architecture/
