英语

客户机暂停轮询

cpuidle_haltpoll 驱动程序与 haltpoll governor 允许客户机 vcpu 在暂停前轮询指定的时间量。

这为主机侧轮询提供了以下好处

  1. 轮询时会设置 POLL 标志,这允许远程 vCPU 在执行唤醒时避免发送 IPI(以及处理 IPI 的相关成本)。

  2. 可以避免 VM-exit 成本。

客户机侧轮询的缺点是,即使主机中有其他可运行的任务,也会执行轮询。

基本逻辑如下:用户配置一个全局值 guest_halt_poll_ns,指示允许轮询的最大时间量。此值是固定的。

每个 vcpu 都有一个可调整的 guest_halt_poll_ns(“每 CPU guest_halt_poll_ns”),它由算法根据事件进行调整(如下所述)。

模块参数

haltpoll governor 有 5 个可调模块参数

  1. guest_halt_poll_ns

在暂停前执行轮询的最大时间量,以纳秒为单位。

默认值:200000

  1. guest_halt_poll_shrink

当唤醒事件发生在全局 guest_halt_poll_ns 之后时,用于缩小每 CPU guest_halt_poll_ns 的除数。

默认值:2

  1. guest_halt_poll_grow

当事件发生在每 CPU guest_halt_poll_ns 之后但在全局 guest_halt_poll_ns 之前时,用于增大每 CPU guest_halt_poll_ns 的乘数。

默认值:2

  1. 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

  1. 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%,而该机器在其他情况下几乎完全处于空闲状态。