一起聊聊linux上numa架構(圖文詳解)

2022-03-03 07:00:06
本篇文章給大家帶來啦linux中numa架構介紹的相關知識,希望對大家有幫助。

以下案例基於 Ubuntu 16.04,同樣適用於其他的 Linux 系統。我使用的案例環境如下所示:

機器設定:32 CPU,64GB 記憶體

在NUMA中儲存層次的概念:

02.png

1)處理器層:單個物理核,稱為處理器層。2)本地節點層:對於某個節點中的所有處理器,此節點稱為本地節點。3)home節點層:與本地節點相鄰的節點稱為home節點。4)遠端節點層:非本地節點或鄰居節點的節點,稱為遠端節點。CPU存取不同型別節點記憶體的速度是不相同的,存取本地節點的速度最快,存取遠端節點的速度最慢,即存取速度與節點的距離有關,距離越遠存取速度越慢,此距離稱作Node Distance。應用程式要儘量的減少不同CPU模組之間的互動,如果應用程式能有方法固定在一個CPU模組裡,那麼應用的效能將會有很大的提升。

**以鯤鵬920處理器講一下cpu晶片的的構成:**鯤鵬920處理器片上系統的每個超級核心叢集包含6個核心叢集、2個I/O叢集和4個DDR控制器。每個超級核心叢集封裝成一個CPU晶片。每個晶片上整合了4個72位(64位元資料加8位元ECC)、資料傳輸率最高為3200MT/s的高速DDR4通道,單晶片可支援最多512GB×4的DDR儲存空間。L3 Cache在物理上被分為兩部分:L3 Cache TAG和L3 Cache DATA。L3 Cache TAG整合在每個核心叢集中,以降低監聽延遲。L3 Cache DATA則直接連線片上匯流排。Hydra根代理(Hydra Home Agent,HHA)是處理多晶片系統Cache一致性協定的模組。POE_ICL是系統設定的硬體加速器,一般可以用作分組順序整理器、訊息佇列、訊息分發或者實現某個處理器核心的特定任務等。此外,每個超級核心叢集在物理上還設定了一個通用中斷控制器分發器(GICD)模組,相容ARM的GICv4規範。當單晶片或多晶片系統中有多個超級核心叢集時,只有一個GICD對系統軟體可見。

03.png

numactl的使用

Linux提供了一個一個手工調優的命令numactl(預設不安裝),在Ubuntu上的安裝命令如下:

sudo apt install numactl -y

首先你可以通過man numactl或者numactl --h瞭解引數的作用與輸出的內容。檢視系統的numa狀態:

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

04.png

根據這個圖與命令得到的結果,可以看到,此係統共有4個node,各領取8個CPU和16G記憶體。 這裡還需要注意的就是CPU共用的L3 cache也是會自己領取相應的空間。通過numastat命令可以檢視numa狀態,返回值內容:

numa_hit:是打算在該節點上分配記憶體,最後從這個節點分配的次數;

numa_miss:是打算在該節點分配記憶體,最後卻從其他節點分配的次數;

numa_foreign:是打算在其他節點分配記憶體,最後卻從這個節點分配的次數;

interleave_hit :採用interleave策略最後從本節點分配的次數

local_node:該節點上的程序在該節點上分配的次數

other_node:是其他節點程序在該節點上分配的次數

注:如果發現 numa_miss 數值比較高時,說明需要對分配策略進行調整。例如將指定程序關聯絡結到指定的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:規定程序從本地節點上請求分配記憶體。--membind=nodes或者-m nodes:規定程序只能從指定的nodes上請求分配記憶體。--preferred=node:指定一個推薦的node來獲取記憶體,如果獲取失敗,則嘗試別的node。--interleave=nodes或者-i nodes:規定程序從指定的nodes上,以round robin演演算法交織地請求記憶體分配。

 numactl --interleave=all mongod -f /etc/mongod.conf

因為NUMA預設的記憶體分配策略是優先在程序所在CPU的本地記憶體中分配,會導致CPU節點之間記憶體分配不均衡,當開啟了swap,某個CPU節點的記憶體不足時,會導致swap產生,而不是從遠端節點分配記憶體。這就是所謂的swap insanity 現象。或導致效能急劇下降。所以在運維層面,我們也需要關注NUMA架構下的記憶體使用情況(多個記憶體節點使用可能不均衡),併合理設定系統引數(記憶體回收策略/Swap使用傾向),儘量去避免使用到Swap。

Node->Socket->Core->Processor

隨著多核技術的發展,將多個CPU封裝在一起,這個封裝被稱為插槽Socket;Core是socket上獨立的硬體單元;通過intel的超執行緒HT技術進一步提升CPU的處理能力,OS看到的邏輯上的核Processor數量。

Socket = Node

Socket是物理概念,指的是主機板上CPU插槽;Node是邏輯概念,對應於Socket。

Core = 物理CPU

Core是物理概念,一個獨立的硬體執行單元,對應於物理CPU;

Thread = 邏輯CPU = Processor

Thread是邏輯CPU,也就是Processo

lscpu的使用

顯示格式:

  • Architecture:架構

  • CPU(s):邏輯cpu顆數

  • Thread(s) per core:每個核心執行緒,也就是指超執行緒

  • Core(s) per socket:每個cpu插槽核數/每顆物理cpu核數

  • CPU socket(s):cpu插槽數

  • L1d cache:級快取(google了下,這具體表示表示cpu的L1資料快取)

  • L1i cache:一級快取(具體為L1指令快取)

  • L2 cache:二級快取

  • L3 cache:三級快取

  • NUMA node0 CPU(s) :CPU上的邏輯核,也就是超執行緒

執行lscpu,結果部分如下:

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

相關推薦:《Linux視訊教學

以上就是一起聊聊linux上numa架構(圖文詳解)的詳細內容,更多請關注TW511.COM其它相關文章!