DAMON
基于访问模式的数据监控
DAMOS scheme
对命中的内存区域执行 action
DAMOS_COLLAPSE
热区折叠成 huge page
hot region 的页
collapse
huge page
TLB 覆盖范围扩大
TLB miss 下降
TLB 是许多系统的瓶颈
DAMOS_COLLAPSE
所有命中的热区都折叠
折叠量无法按比例调优
命中的热区
热区 #1
热区 #2
热区 #3
热区 #4
…
内存碎片化与浪费
裸机数据库 / 大数据负载长期运行
与 THP=always 的结局相同
THP 全局开关
无法按任务粒度控制 huge page
所有进程共用一个开关
多数运维指南因此建议禁用 THP
quota goal
metric + target_value
current_value
DAMON 每轮自测
score
esz
有效配额
DAMOS_COLLAPSE
折叠页数受 esz 约束
下一轮重新测量
闭环把 metric 推向 target
已有的同一模式 metric
active_mem_bp · inactive_mem_bp · node_eligible_mem_bp
分子 · 3 类 THP 页数
NR_ANON_THPS
anon
+
NR_SHMEM_THPS
shmem
+
NR_FILE_THPS
file
= thp
分母 · 已用内存
total_pages = totalram_pages()
free_pages = NR_FREE_PAGES
已用内存 = total_pages − free_pages
hugepage_mem_bp
thp
total_pages − free_pages
× 10000
= 0 – 10000
basis points(万分比)
target_value = 1000
→ 目标占比 10%
target_value = 2500
→ 目标占比 25%
total_pages <= free_pages
per-cpu vmstat 计数存在竞态
空闲页可能暂时不小于总内存
return 10000
即 100%:autotuning 把 quota 压到 0
collapse 暂停,直到统计刷新
DAMOS_QUOTA_HUGEPAGE_MEM_BP
damos_hugepage_mem_bp() 每轮算出 current_value
damos_set_quota_goal_current_value()
switch 新增 1 个 case,写回 goal->current_value
damos_sysfs_qgoal_metric_names[]
新增 hugepage_mem_bp 映射,sysfs 可见
score 计算与 quota 调整完全复用
既有 autotuning 逻辑不动
arm64 物理机 · 4 NUMA node · 1 TB RAM
mariaDB 10.5.29 + sysbench · 20 表 × 300 万行
DB 与 benchmark 分别 pin 到不同 NUMA node · 无网络流量
动作 DAMOS_COLLAPSE · quota goal = hugepage_mem_bp
quota target
goal tuner
收敛后 huge page 占比
判定
1000(10%)
temporal
10.26%
达标
1000(10%)
consistent
20.58%
超目标
2500(25%)
temporal
25.68%
达标
1000(10%)
consistent
45.11%
超目标
temporal:达标后把配额归零,collapse 停步
consistent:不归零封顶,collapse 继续,越过目标
观测
hugepage_mem_bp
THP 页数 / 已用内存
决策
quota autotuning
score → esz
执行
DAMOS_COLLAPSE
按配额决定折叠量
10.26%
目标 10% · temporal tuner
占比可按目标调,不再一刀切
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x