Implement Linux memory policy Add support for Linux memory policy
set_mempolicy(2)
$ man 2 set_mempolicy↗long set_mempolicy(int mode, const unsigned long *nodemask, unsigned long maxnode);プロセスのメモリをどのノードに割り当てるかを制御する。
NUMA
+-------------------------------------------------------------+
| Multi-Socket Server |
+-----------------------------+-------------------------------+
| Node 0 | Node 1 |
| +---------+ +---------+ | +---------+ +---------+ |
| | CPU 0 | | CPU 1 | | | CPU 2 | | CPU 3 | |
| +----+----+ +----+----+ | +----+----+ +----+----+ |
| | | | | | |
| +------+-----+ | +------+-----+ |
| | | | |
| +------+------+ | +------+------+ |
| | Memory 0 |<------+------->| Memory 1 | |
| | (local) | slow | | (local) | |
| +-------------+ | +-------------+ |
+-----------------------------+-------------------------------+Modes
| モード | 動作 |
|---|---|
| MPOL_DEFAULT | システムデフォルト。ローカル優先 |
| MPOL_LOCAL | 現在のCPUのローカルノードに割当 |
| MPOL_PREFERRED | 指定ノード優先、失敗時は他ノード |
| MPOL_BIND | 指定ノードのみ使用 |
| MPOL_INTERLEAVE | 指定ノード間で交互に割当 |
| MPOL_PREFERRED_MANY | 複数ノードを優先 |
| MPOL_WEIGHTED_INTERLEAVE | 重み付きで交互に割当 |
MPOL_BIND
{
"memoryPolicy": {
"mode": "MPOL_BIND",
"nodes": "0,1"
}
}メモリ割当の挙動:
- Node 0: 使用可能
- Node 1: 使用可能
- Node 2: 使用禁止 → メモリ不足ならOOM
MPOL_INTERLEAVE
{
"memoryPolicy": {
"mode": "MPOL_INTERLEAVE",
"nodes": "0,1"
}
}メモリ割当の挙動:
- ページ1 → Node 0
- ページ2 → Node 1
- ページ3 → Node 0
- ページ4 → Node 1
- ...(交互に配置)
用途: 大量データを複数ノードに分散させ、帯域を稼ぐ
MPOL_PREFERRED
{
"memoryPolicy": {
"mode": "MPOL_PREFERRED",
"nodes": "0"
}
}メモリ割当の挙動:
- まず Node 0 に割当を試みる
- Node 0 が満杯 → Node 1 にフォールバック
- BINDと違いエラーにならない
Flags
| フラグ | 効果 |
|---|---|
| MPOL_F_STATIC_NODES | cpuset変更時もノード番号を維持 |
| MPOL_F_RELATIVE_NODES | ノード番号をcpuset内の相対位置で解釈 |
| MPOL_F_NUMA_BALANCING | BIND のみ有効。カーネルがアクセスパターンを監視して自動的にページを移動 |
Validation
検証が結構大変 :P
フラグ関連
MPOL_F_NUMA_BALANCINGはMPOL_BINDでのみ使用可MPOL_F_STATIC_NODESとMPOL_F_RELATIVE_NODESは同時使用不可
モード関連
DEFAULT: nodes が空であること、flags が空であることLOCAL: nodes が空であること、flags が空であることPREFERRED+ 空nodes:STATIC/RELATIVEフラグ禁止BIND: nodes が1つ以上あることINTERLEAVE: nodes が1つ以上あることPREFERRED_MANY: nodes が1つ以上あることWEIGHTED_INTERLEAVE: nodes が1つ以上あること