THP:512 个连续的 4 KiB 小页
512 × 4 KiB 基页
1 个 2 MiB
PMD 大页
TLB 记录 512 → 1
页表遍历开销也随之下降
shmem 的大页策略另有独立开关
tmpfs 挂载选项
huge=
顶层开关
shmem_enabled
mTHP 每尺寸开关
hugepages-<size>kB/shmem_enabled
默认只有 PMD 档是 inherit,其余尺寸一律 never
这三层开关叠加,资格判定要先读懂它们
MADV_COLLAPSE
用户主动发起的同步 collapse
不需要 VMA 标记 MADV_HUGEPAGE
范围由调用者明确指定
文档承诺
忽略全部 THP 与 mTHP sysfs 配置
即使所有开关都设为 never,也照常 collapse
这是用户「我说了算」的那条路
典型场景:memfd、SysV shm
这类匿名 shmem 在 mmap 时已解除链接
collapse 做的事
把调用者指定的范围就地合并成 PMD 级大页
同步完成,不必等后台的 khugepaged
madvise_collapse()
用户指定的 collapse 范围
collapse_possible()
确认 VMA 允许 PMD 级 order
shmem_allowable_huge_orders()
shmem 文件在这里判资格
按映射类型分流
tmpfs 映射
提前返回全局判定结果
完全不碰每尺寸 sysfs
匿名 shmem
继续合成每尺寸 sysfs 掩码
v6.11 接入 mTHP 每尺寸判定后如此
问题就出在红色这条分支:强制 collapse 也走了进来
管理员把 PMD 档改成 never
hugepages-2048kB/shmem_enabled
每尺寸掩码里没有 PMD 级 order
资格判定返回 0
强制 collapse 直接失败
-EINVAL
2 MiB collapse
静默失效
应用依赖的 2 MiB 大页没有出现
最终表现是用户可见的性能回退
文档说:MADV_COLLAPSE 忽略全部 THP / mTHP 配置
实际:一层每尺寸 sysfs 就把它否掉了
分水岭:shmem_huge_force
只有 MADV_COLLAPSE 路径把它置真
即 TVA_FORCED_COLLAPSE;缺页等常规路径一律为假
把标志并入提前返回条件
if (!vma || !vma_is_anon_shmem(vma) || shmem_huge_force)
return global_orders;
强制 collapse 与 tmpfs 一样,直接返回全局判定结果
全局判定给什么
shmem_huge_global_enabled()
强制 collapse 时直接给 PMD 级 order
与 tmpfs 挂载选项无关
与顶层 shmem_enabled 取值无关
与每尺寸 shmem_enabled 无关
→ 与文档承诺一致
这条捷径只在强制路径上开
其余路径的判定条件一个字没动
缺页分配与 khugepaged 行为不变
改动的全部内容,就是这个提前返回条件
tmpfs 映射 · 强制 collapse
直接返回全局判定的 PMD 级 order
不看 tmpfs 挂载选项
不看顶层 / 每尺寸 shmem_enabled
→ 文档承诺兑现
匿名 shmem 常规分配
仍按每尺寸 sysfs 合成掩码
缺页分配行为完全不变
khugepaged 的 collapse 策略不受影响
放行后,madvise_collapse() 按 2 MiB 对齐目标范围
2 MiB
2 MiB
2 MiB
2 MiB
每段 2 MiB,逐段完成 collapse
硬禁止:入口就拒绝
VMA 标记 MADV_NOHUGEPAGE
进程用 prctl 完全禁用 THP
资格判定在入口直接不通过
顶层 shmem_enabled = deny
全局判定直接返回 0
强制 collapse 也拿不到 order
除上述硬禁止外,即使所有策略开关都是 never
MADV_COLLAPSE 也照常拿到 PMD 级 order
与文档承诺一致
匿名 shmem 的强制 collapse
恢复稳定生效
不再被每尺寸 sysfs 配置静默否决
共享内存后端
memfd、SysV shm 重新可靠拿到 2 MiB 大页
tmpfs 与匿名 shmem 行为统一
shmem_huge_force 并入提前返回条件
强制 collapse 与 tmpfs 走同一条全局判定
策略配置被忽略,硬禁止仍然生效
改动只是提前返回条件里多一个标志,判定逻辑不变
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x