Linux內存-NUMA


一、什么是numa?
NUMA(Non-Uniform Memory Access),非一致性內存訪問,是一種計算機內存的設計方式,這種設計模式將內存分為本地內存和遠程內存
由於CPU訪問本地內存比訪問遠程內存的路徑短,導致訪問本地內存的延遲會小於訪問遠程內存

 

 

通過numactl可以查看numa的節點信息

# numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
node 0 size: 130713 MB
node 0 free: 9043 MB
node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
node 1 size: 131072 MB
node 1 free: 17986 MB
node distances:
node   0   1 
  0:  10  21 
  1:  21  10 
從上述輸出結果我們可以看出,該機器上包含兩個 NUMA 節點,每個節點上都包含 32個 CPU 以及 128GB 的內存,最后的節點距離(node distances)告訴我們兩個 NUMA 節點訪問內存的開銷,其中 NUMA 節點 0 和 NUMA 節點 1 互相訪問對方內存的延遲是各自節點訪問本地內存的 2.1 倍(21 / 10 = 2.1),所以如果 NUMA 節點 0 上的進程如果在節點 1 上分配內存,會增加進程的延遲。

二、常用命令
1、綁定cpu和選擇內存分配策略
我們可以通過numactl命令來指定cpu和內存的分配策略

numactl --cpunodebind=0 --membind=0 cmd param

內存分配策略
--localalloc:總是在當前節點上分配內存;
--preferred:傾向於在特定節點上分配內存,當指定節點的內存不足時,操作系統會在其他節點上分配;
--membind:只能在傳入的幾個節點上分配內存,當指定節點的內存不足時,內存的分配就會失敗;
--interleave:內存會在傳入的節點上依次分配(Round Robin),當指定節點的內存不足時,操作系統會在其他節點上分配;


CPU分配策略
--cpunodebind:將進程綁定到某幾個 NUMA 節點上;
--physcpubind:將進程綁定到某幾個物理 CPU 上;
2、numastat

# numastat -c mysqld

Per-node process memory usage (in MBs)
PID              Node 0 Node 1 Total
---------------  ------ ------ -----
84691 (mysqld_sa      1      1     2
86312 (mysqld)    16504  19543 36047
---------------  ------ ------ -----
Total             16505  19544 36049
# numastat 
                           node0           node1
numa_hit             65307931014     44941987932   # 使用本節點內存次數
numa_miss                1129162     35124348722   # 計划使用本節點內存而被調度到其他節點次數
numa_foreign         35124348722         1129162   # 計划使用其他節點內存而使用本地內存次數
interleave_hit             58498           58740   # 交叉分配使用的內存中使用本節點的內存次數
local_node           65306428842     45048694869   # 在本節點運行的程序使用本節點內存次數
other_node               2631334     35017641785   # 在其他節點運行的程序使用本節點內存次數
三、相關內核參數
1、vm.zone_reclaim_mode
調整當一個zone的內存不足時的內存回收策略,
  • 0:意味着關閉zone_reclaim模式,可以從其他zone或NUMA節點回收內存。
  • 1:表示打開zone_reclaim模式,這樣內存回收只會發生在本地節點內。
  • 2:在本地回收內存時,可以將cache中的臟數據寫回硬盤,以回收內存。
  • 4:可以用swap方式回收內存。
 
2、kernel.numa_balancing
通常,應用程式在其程序的線程訪問 NUMA 節點上的內存、且此節點位置與線程排程時的位置相同的時候,性能最佳。自動化 NUMA 平衡會把任務(任務可能是線程或進程)移到與它們需要訪問的內存更近的地方,同時也會移動內存應用程序數據,使其更靠近參考這一數據的任務。
  • 0:關閉
  • 1:開啟

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM