英语

访客暂停轮询

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

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

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

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

guest 端轮询的缺点是,即使主机中存在其他可运行的任务,也会执行轮询。

基本逻辑如下:用户配置一个全局值 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

允许缩小的 Bool 参数。 设置为 N 以避免它(一旦达到全局 guest_halt_poll_ns 值,每个 CPU 的 guest_halt_poll_ns 将保持较高)。

默认值:Y

模块参数可以从以下 sysfs 文件中设置

/sys/module/haltpoll/parameters/

补充说明

  • 设置 guest_halt_poll_ns 参数时应小心,因为较大的值可能会将 CPU 使用率驱动到 100%,否则机器几乎完全空闲。