Linux NUMA memory policy(內存分配策略)

參考內核文檔:Document/vm/numa_memory_policy

memory policy是決定在NUMA系統上從哪個節點分配內存的策略,它是一類提供給能更好利用NUMA系統進行內存分配的應用程序使用的編程接口,

請不要將它和cpusets混淆,後者是一種限定哪些process可以從該節點進行內存分配的管理機制,當一個task同時存在兩種機制時,cpuset優先。


Linux分四種類型policy,分別是:

System Default Policy,它是在沒用應用下面其他policy時的默認policy,具體行爲是:系統啓動過程中,採用interleave策略分配內存,

即在所有可滿足需求的節點上交叉分配,防止啓動時在某個節點上負載過重;在系統啓動後,採用local allocation,即在task運行的cpu所在的node上進行內存分配。
Task/Process Policy,它是task用來制定其內存分配時的策略,如果沒有定義,將fall back到system default policy。
VMA Policy,它是制定在某段VMA進行內存分配時策略,如果沒有定義,將fall back到Task/Process Policy,如果Task/Process Policy沒有定義,遞歸fall back到system default policy。

Shared Policy,它是制定在分配某個內存對象時的policy,這個內存對象可能被多個task共享,而VMA policy只限定某個task的某段VMA。


Linux 內存分配方法包含三部分:mode,optional mode flags,an optional set of nodes。

mode決定policy的具體行爲,the optional mode flags決定mode的行爲,an optional set of nodes可以看做是以上行爲的參數。


mode有四種:

Default Mode--MPOL_DEFAULT,

MPOL_BIND,它指定在哪幾個節點上進行內存分配。

MPOL_PREFERRED,它指定首先在preferred的節點上進行內存分配,如果失敗再搜索其他節點。

MPOL_INTERLEAVED,它指定在an optional set of nodes幾個節點上,以頁爲單位,交叉分配內存。


optional mode flags:

    MPOL_F_STATIC_NODES:  該標誌指定,在policy定義後,如果task或VMA設置的可分配nodes發生了改變,用戶傳遞過來的nodemask不應被remap。

    MPOL_F_RELATIVE_NODES:  和上個flag相反,該情況時,用戶傳遞過來的nodemask應被remap。


Linux爲內存分配策略提供了三個APIs:

設置內存分配策略
    long set_mempolicy(int mode, const unsigned long *nmask, unsigned long maxnode);
Get內存分配策略及相關信息,flags決定mode的行爲是get哪些信息
    long get_mempolicy(int *mode, const unsigned long *nmask, unsigned long maxnode, void *addr, int flags);

安裝內存分配策略

    long mbind(void *start, unsigned long len, int mode, const unsigned long *nmask, unsigned long maxnode,
     unsigned flags);


命令行工具:

+ set the task policy for a specified program via set_mempolicy(2), fork(2) and exec(2)
+ set the shared policy for a shared memory segment via mbind(2)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章