numa节点_极致性能(1):以NUMA为起点
(1)
一個[合格的]Oracle DBA在安裝數據庫的時候,通常都會按要求關閉NUMA(MOS:Disable NUMA At OS Level (Doc ID 2193586.1)),因為啟用NUMA會導致CPU彪高,性能很差(MOS:High CPU Usage when NUMA enabled (Doc ID 953733.1))。也許是這類問題太多,從Oracle 11gR2開始,默認就關閉了NUMA特性,因為NUMA的使用比較苛刻,要結合硬件、操作系統和Oracle版本(MOS:Oracle NUMA Usage Recommendation (Doc ID 759565.1))以及應用程序。稍有不對,努力白費,所以乖乖的關掉NUMA,是比較正確的事情。
同時還搞了個隱含參數來應對想用NUMA的人(還有幾個類似的NUMA隱含參數,謹慎對待):
_enable_NUMA_support=TRUE
還特意加了強調:
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記實在是被NUMA搞怕了(Doc ID 759565.1):
如何檢驗NUMA特性被禁用了:
?# numactl -H
?available: 1 nodes (0)
?node 0 size: 4195 MB
?node 0 free: 3304 MB
?node distances:
?node 0
??0: 10
不然可能至少有2個node。
(2)
那NUMA到底是啥玩意呢?
要搞清楚其實不太容易,要花點時間。
從硬件的角度來看,NUMA(non-uniform memory access,非一致性內存訪問)是一個計算機平臺,它包含多個組件/集成片,每個組件/集成片包含多個CPU、本地內存和I/O總線。為簡潔起見,并從軟件抽象中消除對這些物理組件/集成片的硬件視圖的歧義,后續給了這些組件/集成片一個統一的名字,稱為socket。
每個socket都可以看作是SMP對稱多處理器的子集——獨立SMP系統所需的某些組件可能不會放到socket上。NUMA系統的socket通過某種系統互連連接在一起,例如,交叉或點對點鏈路是NUMA系統互連的常見類型。這兩種類型的互連可以聚合在一起,以創建與其他socket具有多個距離的socket的NUMA平臺(這句話有點繞,在啟用NUMA的OS里,你用numactl -H命令看到輸出的distances部分,就大概明白這句話的意思了)。
這是一個4-way的物理的服務器主板圖。看到右側4個黃色標簽的東東了么,這就是一個socket了,離它最近的那4根內存條就是它的了。通常我們一般就還有一個socket,帶4根內存條,那就是傳統的SMP架構。
上2張邏輯抽象圖片,可能更清晰一些。第一章圖例有顯示node0的CPU可能會去訪問node2的memory,這就會造成某些業務的性能影響或者是抖動。
分別是2-way 8cores CPU的NUMA架構和4-way 24cores 的NUMA架構。所謂的非一致內存訪問NUMA,就是指這里的local access和remote access了,它們的路徑長短不一樣,成不不一樣,所以是非一致的。
需要注意的是,上面圖中的node,事實上是Linux系統中的一個邏輯概念,跟硬件層面的socket對應,也可以混用。
對于Linux系統,感興趣的是NUMA平臺所謂的Cache Coherent NUMA或ccNUMA系統。在ccNUMA系統中,所有的內存對連接到任何socket的任何cpu都是可見的和可訪問的,并且高速緩存的一致性由處理器高速緩存和系統互連在硬件中處理。
內存訪問時間和有效內存帶寬取決于包含CPU/IO總線的socket到包含目標memory的socket之間的距離。例如,通過連接到同一個socket的CPU訪問內存將比訪問其他遠程socket上的內存更快,帶寬更高。
NUMA硬件提供商并不構建NUMA系統。這種架構是一種提供可伸縮內存帶寬的方法。然而,為了實現可伸縮的內存帶寬,系統和應用軟件必須將大部分內存使用安排為“本地”內存(即則為同一socket上的內存)或與內存最接近的socket。
因此,Linux系統將NUMA的硬件資源劃分為多個稱為node的軟件抽象。Linux將node映射到硬件平臺的物理socket上,為這個體系架構抽象出一些細節。跟物理socket一樣,軟件node可以包含0個或多個CPU、內存和I/O總線。訪問“更近”node上的內存(即映射到更近的socket的node)通常比訪問更遠的socket會得到更快的訪問時間和更高的有效帶寬。
對于某些體系結構(如x86),Linux會“隱藏”表示附加內存的socket上的node,并將附加到該socket的任何CPU重新分配給表示具有內存的socet(node)。因此,在這些體系結構中,不能假定linux與給定node關聯的所有cpu都將看到相同的本地內存訪問時間和帶寬。
另外,對于某些體系結構(如x86),linux支持模擬其他node。對于NUMA仿真,Linux將把現有的node(或者非NUMA平臺的系統內存)分割成多個node。每個模擬node將管理底層socket的一小部分物理內存。NUMA emluation對于在非numa平臺上測試NUMA內核和應用程序特性以及與cpusets一起使用時作為一種內存資源管理機制非常有用。
每個有內存的node,Linux構建了一個獨立的內存管理子系統,包括自己的空閑頁面列表、正在使用的頁面列表、使用統計信息和鎖,以斡旋(mediate)訪問。此外,Linux為每個內存區域(dma、dma32、normal、high_memory、movable中的一個或多個)構造一個有序的“zonelist”。當選定的區域/node無法滿足分配請求時,Zonelist會指定某個區域/node供訪問。當區域沒有可用內存來滿足請求時,這種情況稱為“overflow”或“fallback”。這個過程,其實就是一個斡旋的過程。
系統管理員和應用程序設計人員可以使用各種CPU關聯命令行接口(如taskset和numactl)以及程序接口(如sched_setaffinity)限制任務的遷移,以改進NUMA局部性,讓特定業務獲得更好性能。還可以使用Linux NUMA內存策略修改內核的默認本地分配行為。
系統管理員可以使用控制組和CPUset 限制非特權用戶在調度函數時使用指定的CPU和node內存。
(借用一張圖)
在本圖中,node0/node1的內存大小都是32GB,每個node上有10顆CPU。這里的CPU,如果你用cat /etc/interrupts看的話,會顯示為Core.
在《NUMA Best Practices for Dell PowerEdge 12th Generation Servers》(P13,2012)一書中,有這么一張圖,這里的一個socket上有2個node,它是AMD處理器。
(3)來看看
HPE Proliant系列的NUMA情況。
Linux Kernel從2.6開始支持ccNUMA系統,目前最新的已經是Kernel 5了,雖然RHEL 7.x還用的是3.10。
我們可以看到,因為采用了交叉互聯架構,所以除了訪問本地內存之外,其他node上的內存的距離是一樣的。
但就算是距離一樣,其實跨節點的內存訪問的帶寬并非是一樣的,而且各個型號都不一樣。DL580服務器( DL580 G7 with 2.40 GHz ten core Xeon E7 4870)各node間內存訪問的帶寬:
DL560、DL585的NUMA架構跟DL580又不太一樣,各node間內存訪問帶寬又會有差別。這里的0.52/0.34,是指帶寬相當于本地帶寬的52%。DL580 Gen10比DL560會好一些,是0.47/0.44。
可以用語句numactl實測訪問不同node的內存的帶寬,下面是個示例:
#?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
雖然差距不是很大,還是要盡量避免跨節點訪問內存。
那么怎么避免node0的內存溢出導致node外分配呢?
如前面在第(2)節所描述的,當策略選擇的node無法滿足請求時,除綁定模式(membind)外,所有Linux內存策略模式都允許分配溢出(overlow)或退回(fallback)到其他節點,通過SLIT(系統局部信息表)斡旋。
Linux 使用內核參數vm.zone_reclaim_mode來控制node溢出。
當vm.zone_reclaim_mode被禁用或為零時,內核將溢出到目標node區域列表中的下一個node。
啟用vm.zone_reclaim_模式時,內核在離開目標node進行分配之前嘗試從目標node的內存中釋放或回收頁面。相當于是多一次機會。
當所有異地node的距離都是20時,默認是disable的。啟用還是不啟用呢?通過應用實際測試后再定。
(4) HPE Proliant Gen10的設置
首先是BIOS中,“NUMA Group Size Optimization”,默認是“clustered”,但如果應用設計的時候沒有考慮到使用跨多組處理器的使用,那么就建議選擇“flat”。
Linux將每個NUMA node包含的內存視為一個單獨的可用內存池。每個池都有自己的可用頁列表、用于管理在用的LRU列表、統計信息和其他管理結構(包括序列化對列表的訪問的鎖)。內核將這些數據結構分配到由這些數據結構管理的node的內存中。Linux通過使本地CPU對node的內存請求有利于該node的頁面池,從而最大化自己的內存訪問和請求內存的任務的本地性。
隨著新版本內核對Linux NUMA支持的改進,如Red Hat Enterprise Linux 5、6和7,節點交錯(node interleaving)式不具優勢,特別是在更大的系統配置上。在某些情況下,節點交錯會導致顯著的性能下降。當在系統firmware中啟用節點交錯時,內核不知道內存頁相對于系統實際NUMA拓撲的位置。。結果,數據結構可以被分配到距離它們被大量使用的地方最遠的頁面上,從而導致次優的內核和應用程序性能。所以HPE不建議啟用節點交錯(node interleaving)。
怎么做?
當你進去BIOS之后,你還會看到一個option,Channel interleaving,要不要改呢?根據表Workload Profiles General Power Efficient Compute—Low Latency的列式,所有模式都應該是Enabled。千萬不能改錯了。
那什么是memory interleaving/channel interleaving呢?
好多文章被墻了,這里有一篇講了high order/lower order,基本就是我們通常講的little endian.:http://fourier.eng.hmc.edu/e85_old/lectures/memory/node2.html
一般來說,CPU更可能需要訪問存儲器以獲得一組連續的字(程序中的連續指令段或數據結構的組件,例如數組),?Lower Order arrangement的情況下memory interleaved會更優的,因為連續的字在不同的模塊中可以同時提取。所以就不需要更改了。
文章內容可能有錯,如果發現,歡迎指出。
參考內容:
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)
總結
以上是生活随笔為你收集整理的numa节点_极致性能(1):以NUMA为起点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oppoa9和a9x有什么区别(OPPO
- 下一篇: 命令方块召唤him指令是什么