背景

NUMA balancing 把页迁移到合适的 NUMA 节点,在 tiered memory 上就是把热数据放到高带宽 tier。它的 scanner(task_numa_work)对每个 VMA 检查 vma_policy_mof():只有策略带 MPOL_F_MOF(migrate-on-fault)的 VMA 才参与 NUMA scan。这个 gate 初衷合理:Oracle 用 mbind(MPOL_BIND) pin 共享段时,trap fault 既贵又无意义,不该 scan。

┌──────────────────────────────────────┐
│ NUMA balancing scanner 检查 VMA 是否 │
│ 可迁移                               │
└──────────────────┬───────────────────┘
                   ▼
┌──────────────────────────────────────┐
│   shmem 无共享策略被当明确 opt-out   │
└──────────────────┬───────────────────┘
                   ▼
┌──────────────────────────────────────┐
│ 默认策略 shmem VMA 被排除 NUMA scan  │  tiered memory 上 tmpfs 卡低带宽 tier
└──────────────────────────────────────┘

但对 shmem/tmpfs VMA 这个 gate 出了错。shmem 有 vm_ops->get_policy,vma_policy_mof 走它;而对"用户没设共享策略"的 shmem(常见情况),get_policy 返回 NULL。旧代码把 NULL 当作"用户明确 opt-out",直接返回 false 跳过 scan,而不是 fallback 到 task policy,task policy 默认带 MPOL_F_MOF。于是所有默认策略的 shmem VMA 都被排除在 NUMA balancing 之外。

问题

  • vma_policy_mof 对 shmem 的 NULL policy 当作"明确 opt-out"
  • 默认策略 shmem VMA 被错误排除 NUMA balancing scan
  • tiered memory 上整个 tmpfs workingset 卡在低带宽 tier
  • 生产报告:cachelib convergence 与 bandwidth 问题

方案

vma_policy_mof 改走统一的策略查询路径:当 VMA 没有专用共享策略(查询返回空)时,依次回退到 VMA 自身策略、再到任务策略,而任务策略默认带 MPOL_F_MOF。

查询共享策略的其它路径早已这样回退,唯独 NUMA scan 的这个判定入口是 outlier。

旧:NULL policy 当 opt-out
┌────────────────────────────────┐
│     shmem 查共享策略返回空     │
└───────────────┬────────────────┘
                ▼
┌────────────────────────────────┐
│ 空被当明确 opt-out 不 fallback │
└───────────────┬────────────────┘
                ▼
┌────────────────────────────────┐
│   shmem VMA 全跳过 NUMA scan   │
└────────────────────────────────┘

新:NULL fallback 到 task 策略
┌──────────────────────────────────────┐
│   VMA 策略查询统一走 fallback 路径   │
└──────────────────┬───────────────────┘
                   ▼
┌──────────────────────────────────────┐
│ 空策略 fallback 到 task 策略默认带迁 │
│ 移标志                               │
└──────────────────┬───────────────────┘
                   ▼
┌──────────────────────────────────────┐
│  默认策略 shmem VMA 恢复 NUMA scan   │
└──────────────────────────────────────┘

这保留了先前那次引入 NUMA balancing gate 的改动的原意:不 scan 用户明确 pin 的(如 mbind MPOL_BIND),但允许默认策略 VMA 参与 balancing。

收益

作者未提供量化 benchmark,以下为基于机制的预期收益:

  • shmem/tmpfs 默认策略 VMA 恢复 NUMA balancing scan 参与
  • tiered memory 上 tmpfs workingset 可从低带宽 tier 迁移到高带宽 tier
  • NUMA balancing convergence 恢复(cachelib 工作负载报告的 convergence/bandwidth 问题消除)
  • 与查询共享策略的其它路径行为一致,消除 outlier