NUMA簡介&內存配置策略
- 計算機程序和采用的模式類型包括:
![]()
- numa和內存、cpu得關系:
NUMA(non uniform memory access): 非一致性內存訪問架構,非統一內存訪問;用于多處理器的電腦內存體系設計,遵循對稱多處理(SMP)架構,二十時機九十年代被開發出來
![]()
- numa系統中有多個內存控制器,每隔內存控制器和每隔cpu距離并不是相等的
- 每個節點有自己的專屬控制器,所管理的內存稱為本地內存,距離自己最近因此訪問最快
- 不屬于本節點的內存稱為遠端內存,訪問速度較慢,具體慢多少與具體硬件結構有關系
- 內存配置策略
mempolicy相關系統調用主要有set_mempolicy/get_mempolicy
mbind主要配置task/process policy和vma policy,如下圖:
-
- set_mempolicy
- 作用:修改當前task,調整NUMA mem policy策略,且該進程創建得子進程也會繼承該特性
- 鏈接庫:-Lnuma <numaif.h>
- 原型:long set_mempolocy(int mode, const unsigned long * nodemask, unsigned long maxnode);
- 參數解釋:
- mode: mem policy配置策略模式,包括兩部分:用戶設置得mempolicy mode+flag
- 用戶設置得mempolocy mode包括:
- MPOL_DEFAULT: 默認配置策略,一般是采用本地內存
- MPOL_PREFERRED: 首先在指定節點上分配,分配失敗則去其他節點分配
- MPOL_BIND:指定在具體得節點上進行內存分配
- MPOL_INTERLEVE:指定在an optional set of nodes節點上,以頁為單位,交叉分配內存
- MPOL_LOCAL: 從本地內存中申請內存(3.8版本中引入)
flag包括外部flag和內部flag:
- MPOL_F_STATIC_NODES: 在policy定義后,若task或者VMA設置得可分配nodes發生了改變,用戶傳遞過來得nodemask不應被remap
- MPOL_F_RELATIVE_NODES:與STATIC_NODES相反,用戶傳遞過來得nodemask應被remap
- MPOL_F_NUMA_BALANCING(內核5.12之后支持)
- [內部]MPOL_F_SHARED: 共享,被多個VMA或者線程共享
- [內部]MPOL_F_LOCAL:使用本地得preferrd節點,一般為程序運行得節點
- [內部]MPOL_F_MOF: 在page fault時可以或者即將進行遷移
- [內部]MPOL_F_MORON: 將頁面遷移到使用該內存得節點上
- 用戶設置得mempolocy mode包括:
- nodemask: 進程NUMA mem polocy要支持得numa節點量,按照bit位計算
- maxnode: 進程支持得最大節點
- kernel_set_mempolicy
- 作用:
- 原型:static long kernel_set_mempolicy(int mode, const unsigned long __user *nmask, unsigned long maxnode)
- 參數解釋:同上
- get_mempolicy
- 作用:獲取當前進程或者具體地址內存得mempolicy策略
- 原型:long get_mempolicy(int mode, unsigned long * nodemask, unsigned long maxnode, void *addr, unsigned long flags)
- 參數解釋:
- mode: 若mode不為空,則結果返回指定mode得mempolicy節點
- nodemask: 數組,大小位maxnode/sizeof(unsigned long)
- maxnode: 支持得最大numa節點個數
- addr: 具體得內存地址
- flags:
- 若=0,則獲取當前線程得mempolicy,此時addr=null
- 若=MPOL_F_MEMS_ALLOWD,則忽略mod參數,nodemask會返回配置支持得numa節點
- 若=MPOL_F_ADDR,則返回指定addr對應得mempolicy numa節點
- kernel_get_mempolicy->do_get_mempolicy
- mbind
- 作用:設置VMA mempolicy級別,可以只設置某一個內存區域NUM節點策略
- 原型:long mbind(void *addr, unsigned long len, int mode, const unsigned long *nodemask, unsigned long maxnode, unsigned int flags)
- 參數解釋:
- flags:
- 若=MPOL_MF_STATICT,且mode!=MPOL_DEFAULT,則表明要嚴格遵循設置得numa設置,若申請得物理頁面和numa配置策略不一致,則返回EIO
- 若=MPOL_MF_MOVE,則內核嘗試將已經分配得內存(不符合設置得numa節點)進行遷移,遷移到符合配置numa節點上
- 若=MPOL_MF_MOVE_ALL,則內核嘗試將已經分配得內存(不符合設置numa節點要求)進行遷移,遷移該物理頁面時不關心其他進程是否正在使用
- do_mbind->mbind_range: 將指定得內存區域進行內存策略綁定,若綁定成功,則判斷是否已經分配物理頁面;若已經分配頁面,則根據flag,確認是否需要做遷移
- set_mempolicy
參考地址1:linux內核那些事之mempolicy(2) (icode9.com)
參考地址2:linux內核那些事之mempolicy(1)_Huo的藏經閣的博客-CSDN博客
常用命令:
- 關閉虛擬大頁面:echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled



浙公網安備 33010602011771號