free page reporting 的基本路径
guest 空闲页
buddy 中的空闲页
delayed work
周期性上报 host
host unmap
取消这些页的映射
归还 host
给其他任务使用
旧实现:报告间隔写死
硬编码 2 * HZ(约 2 秒)
delayed work 按固定节奏运行,管理员无法按 workload 调整
PAGE_REPORTING_DELAY
本轮主角:page_reporting_delay_ms
把固定延迟暴露为 uint 模块参数,单位毫秒,默认 2000,原有行为不变
稳定 workload
固定 2 秒合理:归还够快,也不至于太频繁
spiky 分配/释放(churn)
固定 2 秒过于激进,报告节奏与重用节奏互相打架
churn 下反复发生的循环
报告空闲页
guest → host
host unmap
取消页映射
guest 重分配
又需要这些页
nested page fault
host 重建映射
报告越勤,unmap 与 re-fault 越频繁
缺少在“尽快归还”与“低开销”之间取舍的旋钮
把硬编码间隔暴露出来
page_reporting_delay_ms
uint 模块参数 · 单位毫秒 · 默认 2000
module_param()
以 uint 类型导出
默认 2000 ms
精确等于原来的 2 * HZ,默认行为完全不变
sysfs 路径与内核变量同名
/sys/module/page_reporting/parameters/page_reporting_delay_ms
module_param 导出后可直接读写
调度间隔改为动态换算
PAGE_REPORTING_DELAY
msecs_to_jiffies(page_reporting_delay_ms)
两处调度点都改成动态换算
__page_reporting_request()
调度点一:请求上报
page_reporting_process()
调度点二:处理完成
同时登记为引导参数
kernel-parameters.txt
page_reporting.page_reporting_delay_ms=
只改调度间隔
报告与回收逻辑不动
默认行为不变
2000 ms 等于原来的 2 * HZ
管理接口统一
sysfs 与引导参数同名
内存长期闲置
调小延迟
缩短报告周期
更快归还 host
空闲内存尽早复用
churn 剧烈
调大延迟
拉长报告窗口
批量吸收波动
减少反复 unmap
调小:归还快,报告更勤
适合长期闲置、希望尽快释放内存
调大:报告少,窗口更长
适合 churn,牺牲一点归还时延换低开销
没有单一最优值,按 workload 取舍
边界:参数不封顶,取 0 也安全
上报只由 high-order 页释放触发
取 0 不会凭空制造报告
进入 hypercall 前有 slot 容量水位检查
开销入口仍有一道闸门
churn 下减少 nested page fault
调大延迟,在更长窗口批量报告,减少 guest 重用已报告页
摊薄每次报告开销
报告频次下降,hypercall 与 host 侧 re-fault 被摊薄
默认 2000 ms
与原 2 * HZ 行为一致,无回归风险
无取值上限
管理员可按 workload 自由设定上报节奏
作者未提供性能数据 · 以上为基于代码逻辑的预期收益
改动前
硬编码 2 * HZ
约 2 秒,固定节奏
无法按 workload 调整
churn 下只能承受反复 unmap 与 nested page fault
改动后
page_reporting_delay_ms
默认 2000 ms,可调
一个旋钮覆盖两种极端
空闲调小、churn 调大,默认保持原行为
调小:尽快归还
内存长期闲置
调大:批量上报
churn 剧烈
默认:行为不变
2000 ms = 2 * HZ
同一段延迟,从硬编码变成按 workload 可调的旋钮
空格
播放/暂停
←
→
逐动作
R
重播
⚠
1x