首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

KVM halt-polling机制分析(2)

KVM halt-polling机制分析(2)

模块参数说明
Module Parameter     Description     default Value
halt_poll_ns     The global max polling interval which defines the ceiling value which defines the ceiling value which defines the ceiling value of the polling interval for each vcpu.     KVM_HALT_POLL_NS_DEFAULT (per arch value)
halt_poll_ns_grow     The value by which the halt polling interval is multiplied polling interval is multiplied polling interval is multiplied in the grow_halt_poll_ns() function.     2
halt_poll_ns_shrink     The value by which the halt polling interval is divided in the shrink_halt_poll_ns() function.     0

kvm用这3个参数来动态调整最大halt polling时长。debugfs下/sys/module/kvm/parameters/存放着这3个模块参数的默认值。X86架构下,KVM_HALT_POLL_NS_DEFAULT默认值为400000。 grow一次,值乘以halt_poll_ns_grow:

static void grow_halt_poll_ns(struct kvm_vcpu *vcpu){
    unsigned int old, val, grow;

    old = val = vcpu->halt_poll_ns;
    grow = READ_ONCE(halt_poll_ns_grow);    /* 10us base */
    if (val == 0 && grow)
        val = 10000;    else
        val *= grow;    if (val > halt_poll_ns)
        val = halt_poll_ns;

    vcpu->halt_poll_ns = val;
    trace_kvm_halt_poll_ns_grow(vcpu->vcpu_id, val, old);
}

shrink一次,值除以halt_poll_ns_shrink,当前系统该参数为0,说明在设定的polling时长下虚拟机未被唤醒,那么下一次polling时长降到基准值10us:

static void shrink_halt_poll_ns(struct kvm_vcpu *vcpu){
    unsigned int old, val, shrink;

    old = val = vcpu->halt_poll_ns;
    shrink = READ_ONCE(halt_poll_ns_shrink);    if (shrink == 0)
        val = 0;    else
        val /= shrink;

    vcpu->halt_poll_ns = val;
    trace_kvm_halt_poll_ns_shrink(vcpu->vcpu_id, val, old);
}

值得注意几点

    该机制有可能导致物理CPU实际空闲的情况下占用率表现为100%。因为如果guest上业务模型是隔一段时间被唤醒一次来处理很少量的流量,并且这个时间间隔比kvm halt_poll_ns短,那么host将poll整个虚拟机的block时间,cpu占用率也会冲上100%。

    halt polling是电源能耗和业务时延的一个权衡。为了减少进入guest的时延,idle cpu时间转换为host kernel时间。

    该机制只有在CPU上没有其他running任务的情况得以应用,不然polling动作被立马终止,唤醒调度器,调度其他进程。

延伸阅读

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

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

    阿里提出guest里面提供halt polling机制,即在VM退出前先等会儿,这样可以减少VM退出次数。 --- 优点:性能较社区halt polling机制好;缺点:需要修改guest内核;状态:社区尚未接收  

    AWS及腾讯考虑guest HLT指令不退出。 --- 优点:性能较阿里好;缺点:只适用于vcpu独占物理核场景;状态:社区讨论中,比较大可能被接受。

    idle等于mwait及mwait不退出。 --- 需要高版本kvm及高版本guest内核支持。

总结

如何高效地处理虚拟机idle是提升虚拟化性能的研究点。针对不同的业务模型,采用不同的机制最大化业务性能。后续将在考拉及其他业务上逐个验证这些方案。
返回列表