访客暂停轮询¶
cpuidle_haltpoll 驱动程序与 haltpoll governor 允许 guest vcpu 在暂停之前轮询指定的时间量。
这为主机端轮询提供了以下好处
在执行轮询时,会设置 POLL 标志,这允许远程 vCPU 在执行唤醒时避免发送 IPI(以及处理 IPI 的相关成本)。
可以避免 VM-exit 的成本。
guest 端轮询的缺点是,即使主机中存在其他可运行的任务,也会执行轮询。
基本逻辑如下:用户配置一个全局值 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
允许缩小的 Bool 参数。 设置为 N 以避免它(一旦达到全局 guest_halt_poll_ns 值,每个 CPU 的 guest_halt_poll_ns 将保持较高)。
默认值:Y
模块参数可以从以下 sysfs 文件中设置
/sys/module/haltpoll/parameters/
补充说明¶
设置 guest_halt_poll_ns 参数时应小心,因为较大的值可能会将 CPU 使用率驱动到 100%,否则机器几乎完全空闲。