客户机暂停轮询¶
cpuidle_haltpoll 驱动程序与 haltpoll governor 允许客户机 vcpu 在暂停前轮询指定的时间量。
这为主机侧轮询提供了以下好处
轮询时会设置 POLL 标志,这允许远程 vCPU 在执行唤醒时避免发送 IPI(以及处理 IPI 的相关成本)。
可以避免 VM-exit 成本。
客户机侧轮询的缺点是,即使主机中有其他可运行的任务,也会执行轮询。
基本逻辑如下:用户配置一个全局值 guest_halt_poll_ns,指示允许轮询的最大时间量。此值是固定的。
每个 vcpu 都有一个可调整的 guest_halt_poll_ns(“每 CPU guest_halt_poll_ns”),它由算法根据事件进行调整(如下所述)。
模块参数¶
haltpoll governor 有 5 个可调模块参数
guest_halt_poll_ns
在暂停前执行轮询的最大时间量,以纳秒为单位。
默认值:200000
guest_halt_poll_shrink
当唤醒事件发生在全局 guest_halt_poll_ns 之后时,用于缩小每 CPU guest_halt_poll_ns 的除数。
默认值:2
guest_halt_poll_grow
当事件发生在每 CPU guest_halt_poll_ns 之后但在全局 guest_halt_poll_ns 之前时,用于增大每 CPU guest_halt_poll_ns 的乘数。
默认值:2
guest_halt_poll_grow_start
在空闲系统的情况下,每 CPU guest_halt_poll_ns 最终会达到零。此值设置增长时的初始每 CPU guest_halt_poll_ns。可以从 10000 增加此值,以避免在初始增长阶段出现遗漏
10k、20k、40k、...(示例假设 guest_halt_poll_grow=2)。
默认值:50000
guest_halt_poll_allow_shrink
允许收缩的布尔参数。设置为 N 以避免收缩(每 CPU guest_halt_poll_ns 一旦达到全局 guest_halt_poll_ns 值将保持较高水平)。
默认值:Y
模块参数可以通过以下 sysfs 文件进行设置
/sys/module/haltpoll/parameters/
进一步说明¶
在设置 guest_halt_poll_ns 参数时应谨慎,因为较大的值有可能将 CPU 使用率驱动到 100%,而该机器在其他情况下几乎完全处于空闲状态。