PauseFilter Detect PAUSE指令在 Linux内核等代码中广泛被用于自旋锁的 SPIN 循环中,用于标识一个CPU 的代码处于自旋锁等待状态。 在虚拟化环境中存在一个问题是,我们并不希望一个虚拟机的 CPU 太长时间处于自旋锁等待状态,因为在主机上有其他的虚拟机或计算任务可以利用该CPU 的计算资源。 解决该问题的一个比较好的思想是计算某虚拟 CPU 连续调用 PAUSE 指令的次数,当超过了规定的值,就截取该虚拟 CPU,调度其他 VMM 上的进程,或想法加快持有自旋锁的 VCPU 线程的调度执行。 为了实现这一思想,较近的 AMD-V 处理器的 VMCB.CONTROL 中增加了一 PAUSE_FILTER_COUNT 字段及一个 INTERCEPT_PAUSE 控制位,用于设定对 PAUSE 的截取,即当 INTERCEPT_PAUSE 为 1 时,用 PAUSE_FILTER_COUNT 初始化 CPU 内某寄存器,每次 PAUSE 执行时,该寄存器的值减 1,当减到 0 时产生截取。 PAUSE_FILTER_COUNT完全按 PAUSE的次数控制是否截取 PAUSE 指令,没有考虑不同 PAUSE指令之间的执行间隔,如俩个 PAUSE 指令属于不同代码或PAUSE 指令间有中断的情况,这些情况不应该被误判为自旋锁 SPIN 循环的存在。为弥补 PAUSE_FILTER_COUNT 机制的不足,更新的 AMD-V 处理器在 VMCB.CONTROL 中增加了一个 PAUSE_FILTER_THRESHOLD 字段,新的字段用来规定一个 CPU Cycles 的长度,当最近一次 PAUSE 过去的 CPU Cycles 超过了该字段规定的值时,PAUSE_FILTER_COUNT 对应的 CPU 内部计数器会重新设置为 PAUSE_FILTER_COUNT;如果过去的CPU Cycles 没超过 PAUSE_FILTER_THRESHOLD 字段规定的值,则内部计数器按正常的方式递减,直到其值为 0,产生截取。 目前 RHEL6.2 上 KVM 的实现已经支持 PAUSE_FILTER_COUNT,但尚不支持 PAUSE_FILTER_THRESHOLD。详细:http://www.51rhca.com/archives/595
|