一、什么是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:開啟