Page 69 - 《软件学报》2025年第9期
P. 69
3980 软件学报 2025 年第 36 卷第 9 期
473.astar 在具有 H-extension 扩展的 RISC-V 架构下进行测试. 所选取的典型应用都是内存密集型程序. 而由于
hypervisor 在模拟器上运行, 程序的运行时间指标无法展示实际的性能情况, 因此对于每个测试, 我们使用 TLB 缺
失数量或 VM-exit 数量来进行对比.
为了评估懒惰影子页表模型的有效性, 我们研究了以下几个问题:
● 在 RISC-V 基础架构下懒惰影子页表模型较传统影子页表模型的表现.
● 在 H-extension 扩展下懒惰影子页表较传统影子页表模型和嵌套页表模型的表现.
4.2 基础架构下的性能分析
在 RISC-V 基础架构下, hypervisor 通过陷入-模拟的方式运行功能受限的虚拟机. 因此, 我们在此实现下运行
微基准测试. 为了测试懒惰影子页表模型对页表同步操作的性能提升效率, 虚拟机将对 1 024 个页面进行顺序操
作, 共计 10 万次. 对这些页面的操作分为直接访存和修改对应页表项, 我们在不同的操作占比下观察懒惰影子页
表模型相较于传统影子页表模型所产生的访存相关的 VM-exit 数量变化.
如图 5 所示, 随着页表修改操作占比的增加, 传统影子页表模型与修改操作的数量呈线性相关, 当全部操作都
是页表修改时, 传统影子页表模型会产生 20 万次的 VM-exit, 包括写保护和 TLB 刷新操作导致的 VM-exit. 而懒
惰影子页表模型将页表同步操作与 TLB 刷新操作绑定, 并且将页表同步的软件开销推迟到首次访问时产生, 因此
当页表操作占比远大于页面访问操作时, 懒惰影子页表模型避免了对未被访问页面的页表同步操作, 最高能降低
50% 的 VM-exit 数量.
200 传统影子页表
175 懒惰影子页表
VM-exit 数量 (千次) 125
150
100
75
50
25
0
0 20 40 60 80 100
页表修改操作占比 (%)
图 5 不同页表修改操作占比下的 VM-exit 对比
我们还模拟了真实场景下虚拟机操作系统周期性地对页表项进行修改的行为. 虚拟机操作系统将对 1 024 个
页面对应的页表项中的访问位和脏位进行周期性地写零, 同时还会对这些页面进行满足二八分布 (即 80% 的时间
访问 20% 的页面) 的访问. 我们调整周期性全局写页表项的时间窗口大小, 比较懒惰影子页表模型相较于传统影
子页表模型所产生的 VM-exit 数量变化. 时间窗口大小代表着数倍于页面数量的访存次数 (例如时间窗口为 2 表
示经过 1024×2 次访存后全局写一次页表项), 统计 10 个时间窗口内产生的结果.
如后文图 6 所示, 传统影子页表模型始终会产生 2 万次的 VM-exit 数量, 这是因为每个时间窗口周期后的每
次页表项修改都将产生 2 次 VM-exit. 而懒惰影子页表模型与访问的页面数量有关. 在时间窗口较小时, 懒惰影子
页表模型能够降低近 32% 的 VM-exit 数量.
4.3 虚拟化扩展架构下的性能分析
在具有虚拟化扩展的架构下, 我们实现的 hypervisor 更加完备, 能够直接运行 Linux 内核. 因此, 我们直接运
行 SPEC2006 测试集中的典型的内存密集型程序: 403.gcc, 429.mcf, 433.milc, 473.astar, 对比懒惰影子页表模型、
传统影子页表模型和嵌套页表模型的表现. 由于测试环境是在 x86 架构下进行模拟的, 因此程序的运行时间没有
参考性. 我们仅对比关键的访存指标: TLB 缺失数量和访存相关的 VM-exit 数量.

