清 accessed bit
每个采样间隔开始
下一个间隔读回
重新置位即被访问
访问信号
这期间被访问过
虚拟化宿主机
guest 内存通常由 hugetlbfs 的 hugetlb 页支撑
作者生产宿主机:约 95% 的 RAM 是 1 GiB hugetlb 页
访问检查从 damon_get_folio() 开始
拒收非 LRU folio
hugetlb folio 本就不上 LRU
全部报成从未访问
清 access bit 不带 TLB flush
1 GiB 映射下 TLB 几乎不 refill
观察值钉死在 TLB-refill 率
饱和 guest 与空闲 guest 无法区分
1 TiB 主机实测
guest 内 842 GiB 随机访问一小时
空闲 guest
不施加访问负载
随机访问一小时
842 GiB 全量随机访问
统计上不可区分
观察到的访问率几乎一样
原先
page_vma_mapped_walk() 返回 huge PTE
walker 原按普通 PTE 粒度读写与通知
现在
按整页大小 aging
清 young bit 走 set_huge_pte_at()
mmu_notifier 通知覆盖整页
guest 访问记录挂在 secondary MMU(KVM/EPT)的 accessed bit 上
访问位浮出
hugetlb 内存不再被报成从未访问
damon_get_monitor_folio()
paddr 的 mkold 与 young 检查改用它,额外接纳 hugetlb folio
空闲 hugetlb pool
引用计数为零,照旧被拒
DAMOS action
reclaim / LRU 调整 / 迁移仍用 damon_get_folio()
监控粒度变为整页
1 GiB 页里一个字节被碰,整页报 accessed
Intel EPT 宿主机 · 944 GiB guest · 842 GiB masim 负载
配置
空闲 → 负载访问率
分离度
未打补丁
0.08 → 0.21 GB/s
无(guest 内存不可见)
本系列(可见性修复)
1.70 → 1.96 GB/s
1.2 倍
信号真实度一层不在本系列
带 TLB flush 的 aging_flush 待量化数据补齐后另发
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x