numa节点_极致性能(1):以NUMA为起点
(1)
一個(gè)[合格的]Oracle DBA在安裝數(shù)據(jù)庫的時(shí)候,通常都會(huì)按要求關(guān)閉NUMA(MOS:Disable NUMA At OS Level (Doc ID 2193586.1)),因?yàn)閱⒂肗UMA會(huì)導(dǎo)致CPU彪高,性能很差(MOS:High CPU Usage when NUMA enabled (Doc ID 953733.1))。也許是這類問題太多,從Oracle 11gR2開始,默認(rèn)就關(guān)閉了NUMA特性,因?yàn)镹UMA的使用比較苛刻,要結(jié)合硬件、操作系統(tǒng)和Oracle版本(MOS:Oracle NUMA Usage Recommendation (Doc ID 759565.1))以及應(yīng)用程序。稍有不對(duì),努力白費(fèi),所以乖乖的關(guān)掉NUMA,是比較正確的事情。
同時(shí)還搞了個(gè)隱含參數(shù)來應(yīng)對(duì)想用NUMA的人(還有幾個(gè)類似的NUMA隱含參數(shù),謹(jǐn)慎對(duì)待):
_enable_NUMA_support=TRUE
還特意加了強(qiáng)調(diào):
Recommendation:
·?Customers who have tuned their Database specifically for NUMA can continue to run with NUMA enabled with Oracle Server Version 11.2.0.1.?
·?It is strongly recommended to customers who want to enable NUMA do sufficient testing before going into production.
這也沒轍,O記實(shí)在是被NUMA搞怕了(Doc ID 759565.1):
如何檢驗(yàn)NUMA特性被禁用了:
?# numactl -H
?available: 1 nodes (0)
?node 0 size: 4195 MB
?node 0 free: 3304 MB
?node distances:
?node 0
??0: 10
不然可能至少有2個(gè)node。
(2)
那NUMA到底是啥玩意呢?
要搞清楚其實(shí)不太容易,要花點(diǎn)時(shí)間。
從硬件的角度來看,NUMA(non-uniform memory access,非一致性內(nèi)存訪問)是一個(gè)計(jì)算機(jī)平臺(tái),它包含多個(gè)組件/集成片,每個(gè)組件/集成片包含多個(gè)CPU、本地內(nèi)存和I/O總線。為簡潔起見,并從軟件抽象中消除對(duì)這些物理組件/集成片的硬件視圖的歧義,后續(xù)給了這些組件/集成片一個(gè)統(tǒng)一的名字,稱為socket。
每個(gè)socket都可以看作是SMP對(duì)稱多處理器的子集——獨(dú)立SMP系統(tǒng)所需的某些組件可能不會(huì)放到socket上。NUMA系統(tǒng)的socket通過某種系統(tǒng)互連連接在一起,例如,交叉或點(diǎn)對(duì)點(diǎn)鏈路是NUMA系統(tǒng)互連的常見類型。這兩種類型的互連可以聚合在一起,以創(chuàng)建與其他socket具有多個(gè)距離的socket的NUMA平臺(tái)(這句話有點(diǎn)繞,在啟用NUMA的OS里,你用numactl -H命令看到輸出的distances部分,就大概明白這句話的意思了)。
這是一個(gè)4-way的物理的服務(wù)器主板圖。看到右側(cè)4個(gè)黃色標(biāo)簽的東東了么,這就是一個(gè)socket了,離它最近的那4根內(nèi)存條就是它的了。通常我們一般就還有一個(gè)socket,帶4根內(nèi)存條,那就是傳統(tǒng)的SMP架構(gòu)。
上2張邏輯抽象圖片,可能更清晰一些。第一章圖例有顯示node0的CPU可能會(huì)去訪問node2的memory,這就會(huì)造成某些業(yè)務(wù)的性能影響或者是抖動(dòng)。
分別是2-way 8cores CPU的NUMA架構(gòu)和4-way 24cores 的NUMA架構(gòu)。所謂的非一致內(nèi)存訪問NUMA,就是指這里的local access和remote access了,它們的路徑長短不一樣,成不不一樣,所以是非一致的。
需要注意的是,上面圖中的node,事實(shí)上是Linux系統(tǒng)中的一個(gè)邏輯概念,跟硬件層面的socket對(duì)應(yīng),也可以混用。
對(duì)于Linux系統(tǒng),感興趣的是NUMA平臺(tái)所謂的Cache Coherent NUMA或ccNUMA系統(tǒng)。在ccNUMA系統(tǒng)中,所有的內(nèi)存對(duì)連接到任何socket的任何cpu都是可見的和可訪問的,并且高速緩存的一致性由處理器高速緩存和系統(tǒng)互連在硬件中處理。
內(nèi)存訪問時(shí)間和有效內(nèi)存帶寬取決于包含CPU/IO總線的socket到包含目標(biāo)memory的socket之間的距離。例如,通過連接到同一個(gè)socket的CPU訪問內(nèi)存將比訪問其他遠(yuǎn)程socket上的內(nèi)存更快,帶寬更高。
NUMA硬件提供商并不構(gòu)建NUMA系統(tǒng)。這種架構(gòu)是一種提供可伸縮內(nèi)存帶寬的方法。然而,為了實(shí)現(xiàn)可伸縮的內(nèi)存帶寬,系統(tǒng)和應(yīng)用軟件必須將大部分內(nèi)存使用安排為“本地”內(nèi)存(即則為同一socket上的內(nèi)存)或與內(nèi)存最接近的socket。
因此,Linux系統(tǒng)將NUMA的硬件資源劃分為多個(gè)稱為node的軟件抽象。Linux將node映射到硬件平臺(tái)的物理socket上,為這個(gè)體系架構(gòu)抽象出一些細(xì)節(jié)。跟物理socket一樣,軟件node可以包含0個(gè)或多個(gè)CPU、內(nèi)存和I/O總線。訪問“更近”node上的內(nèi)存(即映射到更近的socket的node)通常比訪問更遠(yuǎn)的socket會(huì)得到更快的訪問時(shí)間和更高的有效帶寬。
對(duì)于某些體系結(jié)構(gòu)(如x86),Linux會(huì)“隱藏”表示附加內(nèi)存的socket上的node,并將附加到該socket的任何CPU重新分配給表示具有內(nèi)存的socet(node)。因此,在這些體系結(jié)構(gòu)中,不能假定linux與給定node關(guān)聯(lián)的所有cpu都將看到相同的本地內(nèi)存訪問時(shí)間和帶寬。
另外,對(duì)于某些體系結(jié)構(gòu)(如x86),linux支持模擬其他node。對(duì)于NUMA仿真,Linux將把現(xiàn)有的node(或者非NUMA平臺(tái)的系統(tǒng)內(nèi)存)分割成多個(gè)node。每個(gè)模擬node將管理底層socket的一小部分物理內(nèi)存。NUMA emluation對(duì)于在非numa平臺(tái)上測(cè)試NUMA內(nèi)核和應(yīng)用程序特性以及與cpusets一起使用時(shí)作為一種內(nèi)存資源管理機(jī)制非常有用。
每個(gè)有內(nèi)存的node,Linux構(gòu)建了一個(gè)獨(dú)立的內(nèi)存管理子系統(tǒng),包括自己的空閑頁面列表、正在使用的頁面列表、使用統(tǒng)計(jì)信息和鎖,以斡旋(mediate)訪問。此外,Linux為每個(gè)內(nèi)存區(qū)域(dma、dma32、normal、high_memory、movable中的一個(gè)或多個(gè))構(gòu)造一個(gè)有序的“zonelist”。當(dāng)選定的區(qū)域/node無法滿足分配請(qǐng)求時(shí),Zonelist會(huì)指定某個(gè)區(qū)域/node供訪問。當(dāng)區(qū)域沒有可用內(nèi)存來滿足請(qǐng)求時(shí),這種情況稱為“overflow”或“fallback”。這個(gè)過程,其實(shí)就是一個(gè)斡旋的過程。
系統(tǒng)管理員和應(yīng)用程序設(shè)計(jì)人員可以使用各種CPU關(guān)聯(lián)命令行接口(如taskset和numactl)以及程序接口(如sched_setaffinity)限制任務(wù)的遷移,以改進(jìn)NUMA局部性,讓特定業(yè)務(wù)獲得更好性能。還可以使用Linux NUMA內(nèi)存策略修改內(nèi)核的默認(rèn)本地分配行為。
系統(tǒng)管理員可以使用控制組和CPUset 限制非特權(quán)用戶在調(diào)度函數(shù)時(shí)使用指定的CPU和node內(nèi)存。
(借用一張圖)
在本圖中,node0/node1的內(nèi)存大小都是32GB,每個(gè)node上有10顆CPU。這里的CPU,如果你用cat /etc/interrupts看的話,會(huì)顯示為Core.
在《NUMA Best Practices for Dell PowerEdge 12th Generation Servers》(P13,2012)一書中,有這么一張圖,這里的一個(gè)socket上有2個(gè)node,它是AMD處理器。
(3)來看看
HPE Proliant系列的NUMA情況。
Linux Kernel從2.6開始支持ccNUMA系統(tǒng),目前最新的已經(jīng)是Kernel 5了,雖然RHEL 7.x還用的是3.10。
我們可以看到,因?yàn)椴捎昧私徊婊ヂ?lián)架構(gòu),所以除了訪問本地內(nèi)存之外,其他node上的內(nèi)存的距離是一樣的。
但就算是距離一樣,其實(shí)跨節(jié)點(diǎn)的內(nèi)存訪問的帶寬并非是一樣的,而且各個(gè)型號(hào)都不一樣。DL580服務(wù)器( DL580 G7 with 2.40 GHz ten core Xeon E7 4870)各node間內(nèi)存訪問的帶寬:
DL560、DL585的NUMA架構(gòu)跟DL580又不太一樣,各node間內(nèi)存訪問帶寬又會(huì)有差別。這里的0.52/0.34,是指帶寬相當(dāng)于本地帶寬的52%。DL580 Gen10比DL560會(huì)好一些,是0.47/0.44。
可以用語句numactl實(shí)測(cè)訪問不同node的內(nèi)存的帶寬,下面是個(gè)示例:
#?numactl --cpubind=0 --membind=0 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.823497 s, 1.3 GB/s
# numactl --cpubind=0 --membind=1 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.936182 s, 1.1 GB/s
雖然差距不是很大,還是要盡量避免跨節(jié)點(diǎn)訪問內(nèi)存。
那么怎么避免node0的內(nèi)存溢出導(dǎo)致node外分配呢?
如前面在第(2)節(jié)所描述的,當(dāng)策略選擇的node無法滿足請(qǐng)求時(shí),除綁定模式(membind)外,所有Linux內(nèi)存策略模式都允許分配溢出(overlow)或退回(fallback)到其他節(jié)點(diǎn),通過SLIT(系統(tǒng)局部信息表)斡旋。
Linux 使用內(nèi)核參數(shù)vm.zone_reclaim_mode來控制node溢出。
當(dāng)vm.zone_reclaim_mode被禁用或?yàn)榱銜r(shí),內(nèi)核將溢出到目標(biāo)node區(qū)域列表中的下一個(gè)node。
啟用vm.zone_reclaim_模式時(shí),內(nèi)核在離開目標(biāo)node進(jìn)行分配之前嘗試從目標(biāo)node的內(nèi)存中釋放或回收頁面。相當(dāng)于是多一次機(jī)會(huì)。
當(dāng)所有異地node的距離都是20時(shí),默認(rèn)是disable的。啟用還是不啟用呢?通過應(yīng)用實(shí)際測(cè)試后再定。
(4) HPE Proliant Gen10的設(shè)置
首先是BIOS中,“NUMA Group Size Optimization”,默認(rèn)是“clustered”,但如果應(yīng)用設(shè)計(jì)的時(shí)候沒有考慮到使用跨多組處理器的使用,那么就建議選擇“flat”。
Linux將每個(gè)NUMA node包含的內(nèi)存視為一個(gè)單獨(dú)的可用內(nèi)存池。每個(gè)池都有自己的可用頁列表、用于管理在用的LRU列表、統(tǒng)計(jì)信息和其他管理結(jié)構(gòu)(包括序列化對(duì)列表的訪問的鎖)。內(nèi)核將這些數(shù)據(jù)結(jié)構(gòu)分配到由這些數(shù)據(jù)結(jié)構(gòu)管理的node的內(nèi)存中。Linux通過使本地CPU對(duì)node的內(nèi)存請(qǐng)求有利于該node的頁面池,從而最大化自己的內(nèi)存訪問和請(qǐng)求內(nèi)存的任務(wù)的本地性。
隨著新版本內(nèi)核對(duì)Linux NUMA支持的改進(jìn),如Red Hat Enterprise Linux 5、6和7,節(jié)點(diǎn)交錯(cuò)(node interleaving)式不具優(yōu)勢(shì),特別是在更大的系統(tǒng)配置上。在某些情況下,節(jié)點(diǎn)交錯(cuò)會(huì)導(dǎo)致顯著的性能下降。當(dāng)在系統(tǒng)firmware中啟用節(jié)點(diǎn)交錯(cuò)時(shí),內(nèi)核不知道內(nèi)存頁相對(duì)于系統(tǒng)實(shí)際NUMA拓?fù)涞奈恢谩!=Y(jié)果,數(shù)據(jù)結(jié)構(gòu)可以被分配到距離它們被大量使用的地方最遠(yuǎn)的頁面上,從而導(dǎo)致次優(yōu)的內(nèi)核和應(yīng)用程序性能。所以HPE不建議啟用節(jié)點(diǎn)交錯(cuò)(node interleaving)。
怎么做?
當(dāng)你進(jìn)去BIOS之后,你還會(huì)看到一個(gè)option,Channel interleaving,要不要改呢?根據(jù)表Workload Profiles General Power Efficient Compute—Low Latency的列式,所有模式都應(yīng)該是Enabled。千萬不能改錯(cuò)了。
那什么是memory interleaving/channel interleaving呢?
好多文章被墻了,這里有一篇講了high order/lower order,基本就是我們通常講的little endian.:http://fourier.eng.hmc.edu/e85_old/lectures/memory/node2.html
一般來說,CPU更可能需要訪問存儲(chǔ)器以獲得一組連續(xù)的字(程序中的連續(xù)指令段或數(shù)據(jù)結(jié)構(gòu)的組件,例如數(shù)組),?Lower Order arrangement的情況下memory interleaved會(huì)更優(yōu)的,因?yàn)檫B續(xù)的字在不同的模塊中可以同時(shí)提取。所以就不需要更改了。
文章內(nèi)容可能有錯(cuò),如果發(fā)現(xiàn),歡迎指出。
參考內(nèi)容:
1.https://www.kernel.org/doc/html/latest/vm/numa.html
2.Red Hat Linux NUMA Support for HP ProLiant Servers(https://support.hpe.com/hpsc/doc/public/display?docId=emr_na-c03261871)
3.Red Hat Enterprise Linux NUMA support for HPE ProLiant servers(https://h50146.www5.hpe.com/products/software/oe/linux/mainstream/support/whitepaper/pdfs/a00039147enw.pdf)
4.UEFI System Utilities User Guide for HPE ProLiant Gen10 Servers and HPE Synergy(https://support.hpe.com/hpsc/doc/public/display?docId=emr_na-a00016407ja_jp)
5.Linux NUMA support for HP ProLiant servers(https://h50146.www5.hpe.com/products/software/oe/linux/mainstream/support/whitepaper/pdfs/c03261871_2012.pdf)
6.https://blog.csdn.net/shaoyunzhe/article/details/53606584
7.UEFI System Utilities User Guide for HPE ProLiant Gen10 Servers and HPE Synergy(https://techlibrary.hpe.com/docs/iss/proliant_uefi/UEFI_Gen9_121417/s_enable_node_interleaving.html)
總結(jié)
以上是生活随笔為你收集整理的numa节点_极致性能(1):以NUMA为起点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oppoa9和a9x有什么区别(OPPO
- 下一篇: 带有下标的赋值维度不匹配_KDD 201