本篇文章給大家?guī)砝瞝inux中numa架構介紹的相關知識,希望對大家有幫助。
以下案例基于 Ubuntu 16.04,同樣適用于其他的 Linux 系統(tǒng)。我使用的案例環(huán)境如下所示:
機器配置:32 CPU,64GB 內存
在NUMA中儲存層次的概念:
1)處理器層:單個物理核,稱為處理器層。2)本地節(jié)點層:對于某個節(jié)點中的所有處理器,此節(jié)點稱為本地節(jié)點。3)home節(jié)點層:與本地節(jié)點相鄰的節(jié)點稱為home節(jié)點。4)遠程節(jié)點層:非本地節(jié)點或鄰居節(jié)點的節(jié)點,稱為遠程節(jié)點。CPU訪問不同類型節(jié)點內存的速度是不相同的,訪問本地節(jié)點的速度最快,訪問遠端節(jié)點的速度最慢,即訪問速度與節(jié)點的距離有關,距離越遠訪問速度越慢,此距離稱作Node Distance。應用程序要盡量的減少不同CPU模塊之間的交互,如果應用程序能有方法固定在一個CPU模塊里,那么應用的性能將會有很大的提升。
**以鯤鵬920處理器講一下cpu芯片的的構成:**鯤鵬920處理器片上系統(tǒng)的每個超級內核集群包含6個內核集群、2個I/O集群和4個DDR控制器。每個超級內核集群封裝成一個CPU晶片。每個晶片上集成了4個72位(64位數(shù)據(jù)加8位ECC)、數(shù)據(jù)傳輸率最高為3200MT/s的高速DDR4通道,單晶片可支持最多512GB×4的DDR存儲空間。L3 Cache在物理上被分為兩部分:L3 Cache TAG和L3 Cache DATA。L3 Cache TAG集成在每個內核集群中,以降低監(jiān)聽延遲。L3 Cache DATA則直接連接片上總線。Hydra根代理(Hydra Home Agent,HHA)是處理多芯片系統(tǒng)Cache一致性協(xié)議的模塊。POE_ICL是系統(tǒng)配置的硬件加速器,一般可以用作分組順序整理器、消息隊列、消息分發(fā)或者實現(xiàn)某個處理器內核的特定任務等。此外,每個超級內核集群在物理上還配置了一個通用中斷控制器分發(fā)器(GICD)模塊,兼容ARM的GICv4規(guī)范。當單芯片或多芯片系統(tǒng)中有多個超級內核集群時,只有一個GICD對系統(tǒng)軟件可見。
numactl的使用
Linux提供了一個一個手工調優(yōu)的命令numactl(默認不安裝),在Ubuntu上的安裝命令如下:
sudo apt install numactl -y
首先你可以通過man numactl或者numactl –h了解參數(shù)的作用與輸出的內容。查看系統(tǒng)的numa狀態(tài):
numactl --hardware
運行得到如下的結果:
available: 4 nodes (0-3) node 0 cpus: 0 1 2 3 4 5 6 7 node 0 size: 16047 MB node 0 free: 3937 MB node 1 cpus: 8 9 10 11 12 13 14 15 node 1 size: 16126 MB node 1 free: 4554 MB node 2 cpus: 16 17 18 19 20 21 22 23 node 2 size: 16126 MB node 2 free: 8403 MB node 3 cpus: 24 25 26 27 28 29 30 31 node 3 size: 16126 MB node 3 free: 7774 MB node distances: node 0 1 2 3 0: 10 20 20 20 1: 20 10 20 20 2: 20 20 10 20 3: 20 20 20 10
根據(jù)這個圖與命令得到的結果,可以看到,此系統(tǒng)共有4個node,各領取8個CPU和16G內存。 這里還需要注意的就是CPU共享的L3 cache也是會自己領取相應的空間。通過numastat命令可以查看numa狀態(tài),返回值內容:
numa_hit:是打算在該節(jié)點上分配內存,最后從這個節(jié)點分配的次數(shù);
numa_miss:是打算在該節(jié)點分配內存,最后卻從其他節(jié)點分配的次數(shù);
numa_foreign:是打算在其他節(jié)點分配內存,最后卻從這個節(jié)點分配的次數(shù);
interleave_hit :采用interleave策略最后從本節(jié)點分配的次數(shù)
local_node:該節(jié)點上的進程在該節(jié)點上分配的次數(shù)
other_node:是其他節(jié)點進程在該節(jié)點上分配的次數(shù)
注:如果發(fā)現(xiàn) numa_miss 數(shù)值比較高時,說明需要對分配策略進行調整。例如將指定進程關聯(lián)綁定到指定的CPU上,從而提高內存命中率。
root@ubuntu:~# numastat node0 node1 node2 node3 numa_hit 19480355292 11164752760 12401311900 12980472384 numa_miss 5122680 122652623 88449951 7058 numa_foreign 122652643 88449935 7055 5122679 interleave_hit 12619 13942 14010 13924 local_node 19480308881 11164721296 12401264089 12980411641 other_node 5169091 122684087 88497762 67801
NUMA的內存分配策略
–localalloc或者-l:規(guī)定進程從本地節(jié)點上請求分配內存。–membind=nodes或者-m nodes:規(guī)定進程只能從指定的nodes上請求分配內存。–preferred=node:指定一個推薦的node來獲取內存,如果獲取失敗,則嘗試別的node。–interleave=nodes或者-i nodes:規(guī)定進程從指定的nodes上,以round robin算法交織地請求內存分配。
numactl --interleave=all mongod -f /etc/mongod.conf
因為NUMA默認的內存分配策略是優(yōu)先在進程所在CPU的本地內存中分配,會導致CPU節(jié)點之間內存分配不均衡,當開啟了swap,某個CPU節(jié)點的內存不足時,會導致swap產(chǎn)生,而不是從遠程節(jié)點分配內存。這就是所謂的swap insanity 現(xiàn)象?;驅е滦阅芗眲∠陆?。所以在運維層面,我們也需要關注NUMA架構下的內存使用情況(多個內存節(jié)點使用可能不均衡),并合理配置系統(tǒng)參數(shù)(內存回收策略/Swap使用傾向),盡量去避免使用到Swap。
Node->Socket->Core->Processor
隨著多核技術的發(fā)展,將多個CPU封裝在一起,這個封裝被稱為插槽Socket;Core是socket上獨立的硬件單元;通過intel的超線程HT技術進一步提升CPU的處理能力,OS看到的邏輯上的核Processor數(shù)量。
Socket = Node
Socket是物理概念,指的是主板上CPU插槽;Node是邏輯概念,對應于Socket。
Core = 物理CPU
Core是物理概念,一個獨立的硬件執(zhí)行單元,對應于物理CPU;
Thread = 邏輯CPU = Processor
Thread是邏輯CPU,也就是Processo
lscpu的使用
顯示格式:
-
Architecture:架構
-
CPU(s):邏輯cpu顆數(shù)
-
Thread(s) per core:每個核心線程,也就是指超線程
-
Core(s) per socket:每個cpu插槽核數(shù)/每顆物理cpu核數(shù)
-
CPU socket(s):cpu插槽數(shù)
-
L1d cache:級緩存(google了下,這具體表示表示cpu的L1數(shù)據(jù)緩存)
-
L1i cache:一級緩存(具體為L1指令緩存)
-
L2 cache:二級緩存
-
L3 cache:三級緩存
-
NUMA node0 CPU(s) :CPU上的邏輯核,也就是超線程
執(zhí)行l(wèi)scpu,結果部分如下:
root@ubuntu:~# lscpu Architecture: x86_64 CPU(s): 32 Thread(s) per core: 1 Core(s) per socket: 8 Socket(s): 4 L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 20480K NUMA node0 CPU(s): 0-7 NUMA node1 CPU(s): 8-15 NUMA node2 CPU(s): 16-23 NUMA node3 CPU(s): 24-31