本文转载自:KVM halt-polling机制分析

简介

在实际业务中,guest执行HLT指令是导致虚拟化overhead的一个重要原因。如[1]。

KVM halt polling特性就是为了解决这一个问题被引入的,它在Linux 4.3-rc1被合入主干内核,其基本原理是当guest idle发生vm-exit时,host 继续polling一段时间,用于减少guest的业务时延。进一步讲,在vcpu进入idle之后,guest内核默认处理是执行HLT指令,就会发生vm-exit,host kernel并不马上让出物理核给调度器,而是poll一段时间,若guest在这段时间内被唤醒,便可以马上调度回该vcpu线程继续运行。

polling机制带来时延上的降低,至少是一个线程调度周期,通常是几微妙,但最终的性能提升是跟guest内业务模型相关的。如果在host kernel polling期间,没有唤醒事件发生或是运行队列里面其他任务变成runnable状态,那么调度器就会被唤醒去干其他任务的事。因此,halt polling机制对于那些在很短时间间隔就会被唤醒一次的业务特别有效。

注意事项

  1. 该机制有可能导致物理CPU实际空闲的情况下占用率表现为100%。因为如果guest上业务模型是隔一段时间被唤醒一次来处理很少量的流量,并且这个时间间隔比kvm halt_poll_ns短,那么host将poll整个虚拟机的block时间,cpu占用率也会冲上100%。
  2. halt polling是电源能耗和业务时延的一个权衡。为了减少进入guest的时延,idle cpu时间转换为host kernel时间。
  3. 该机制只有在CPU上没有其他running任务的情况得以应用,不然polling动作被立马终止,唤醒调度器,调度其他进程。

延伸阅读

业界针对虚拟机idle这个课题有比较多的研究,因为它带来了比较大的overhead。主要可以归结为以下几种:

  1. idle=poll,即把虚拟机idle时一直polling,空转,不退出。这样不利于物理CPU超线程的发挥。

  2. 阿里提出guest里面提供halt polling机制,即在VM退出前先等会儿,这样可以减少VM退出次数。 优点:性能较kvm halt polling机制好;缺点:需要修改guest内核;状态:社区未接收 x86/idle: add halt poll support 值得注意的是, 类似idea的工作guest halt polling社区已接受

  3. 腾讯考虑guest HLT指令不退出。优点:性能较阿里好;缺点:只适用于vcpu独占物理核场景;状态:社区已接受。KVM: X86: Add per-VM no-HLT-exiting capability

源码实现建议参考kvm performance optimization technologies, part two“Host/Guest halt poll”一节。


参考资料:

  1. KVM vs. Message Passing Throughput
  2. Message Passing Workloads in KVM
  3. KVM performance tuning
  4. The KVM halt polling system