Implement Linux memory policy youki-dev/youki #3230by n4mlz Add support for Linux memory policy opencontainers/runtime-spec #1282by askervin

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_NODEScpuset変更時もノード番号を維持
MPOL_F_RELATIVE_NODESノード番号をcpuset内の相対位置で解釈
MPOL_F_NUMA_BALANCINGBIND のみ有効。カーネルがアクセスパターンを監視して自動的にページを移動

Validation

検証が結構大変 :P

フラグ関連

  • MPOL_F_NUMA_BALANCINGMPOL_BIND でのみ使用可
  • MPOL_F_STATIC_NODESMPOL_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つ以上あること