每个调节周期自动跑一遍
采样 current_value
目标指标此刻的值
与 target_value 比较
算出差多少、往哪边调
按差距增减 quota
限制单位时间的 action 总量
scheme 施加 action
reclaim / 页迁移,指标随之变化
指标被改变,下个周期再采样
这张图里唯一能拧的旋钮,是 quota
指标方向错了,回路就会朝反方向使劲
正例 · node_mem_used_bp
指标
quota
利用率随 quota 同向上升
反馈方向正确,回路能收敛
反例 · demotion 拿 利用率 当指标
指标
quota
利用率随 quota 反向下降
目标要空闲比例变高,指标却在往下走
quota
利用率
目标:空闲比例 ↑
差距更大 → 再加 quota
回路越推离目标越远
补值才能把方向掰回来
补值 = 总量 10000 − 原值
bp 类指标:总量固定为 10000
原值
补值
0
10000
同一条尺子上,原值拿走一段,补值就是剩下的
quota ↑
原值 ↓
补值 ↑
target 达成
原值随 quota 反比,补值随之正比
反馈方向被掰回来,回路重新收敛
bp 指标
总量固定 10000
原值 < 10000
补值 = 10000 − 原值
否则
原值 ≥ 10000 → 0
无符号减法不下溢
some_mem_psi_us
总量 = reset_interval × 1000 µs
原值 < 总量
补值 = 总量 − 原值
否则
原值 ≥ 总量 → 0
首次采样 last_psi_total 未初始化
这一轮不更新取值,也不换算
user_input
语义由用户自己定义
总量 ? 内核无从得知
不换算
用户自己写补值
置位后 current_value 由用户写入
内核在这条路径上直接 return,不猜总量
三类只在总量怎么来上有别,补值最后都写进 goal->current_value
damos_set_quota_goal_current_value()
complement ?
否
直接用原值
未置位:与旧逻辑完全一致
是
metric ==
USER_INPUT ?
是
用户已写补值
DAMOS_QUOTA_USER_INPUT:内核不换算,直接返回
否
metric ==
SOME_MEM_PSI_US ?
是
采样时已换算
DAMOS_QUOTA_SOME_MEM_PSI_US:采样时已算完
否
current_value = 10000 − current_value
upper tier 利用率
node_mem_used_bp
promotion scheme
热页 → upper tier
用原值:利用率越高越好
demotion scheme
冷页 → lower tier
置 complement:取补值 = 空闲比例
利用率
空闲比例 = 补值
同一份 upper tier,两个 scheme 看到的是互补的两面
过去:两个方向各一个 metric
现在:一个 metric 加一个标志
node_mem_used_bp
node_mem_free_bp
少一个
node_mem_used_bp
complement
active_mem_bp 置位后亦等效 inactive_mem_bp
hugepage_mem_bp 这类指标不必再加补值版本
damos_new_quota_goal(..., bool complement)
struct damos_quota_goal 新增 bool complement 字段
新增参数
reclaim
complement = false
lru_sort
complement = false
现有调用方全部传 false
行为照旧,配置与之前一致
goal/
metric
target_value
current_value
complement
写 Y 置位 / N 清零
commit 时随 metric 与 target_value 同步进生效配置
complement = 0
原值,旧逻辑不变
complement = 1
总量 − 原值,参与调节
未置位:现有配置不受影响
置位:metric 数量不再膨胀
双向共享同一指标
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x