一、概述

主流的云平台都实现了对虚拟机资源使用率的监控,如网络流入流出带宽、CPU和内存利用率、磁盘利用率等。

在没有安装平台定制的vmtools情况下,很有可能出现平台监控数据与虚拟机内部数据不相符的情况,如云平台显示虚拟机CPU使用率长期接近100%,并产生相应资源使用率高的告警,但实际登陆到虚拟机内部,发现虚拟机CPU使用率才10%~20%,甚至更小。总的来说就是云平台检测到的数据并不准确!

二、影响云平台监控的参数

开门见山,当虚拟机内核配置了idle=poll时,会导致qemu采集数据不准确。在笔者接触的操作系统中,只有部分版本的麒麟系统默认配置了idle=poll,大部分系统如centos、redhat、欧拉等系统没有配置。

三、idle配置的作用

Linux内核的idle配置是用于管理系统空闲时的行为的。当系统处于空闲状态时,CPU可能会浪费很多资源,因此Linux内核提供了一些机制来最大化利用系统资源。

具体来说,Linux内核的idle配置可以控制以下行为:

- CPU调度:Linux内核的idle配置可以决定如何在CPU上进行调度。当系统空闲时,内核可以选择将CPU的时间片分配给其他进程,或者将CPU放入睡眠状态,以降低功耗并延长电池寿命。

- 节能:通过让CPU进入低功耗模式,Linux内核的idle配置可以显著降低系统的能耗。当CPU处于空闲状态时,内核会降低CPU的频率,减少电压并关闭一些不必要的组件,从而节省能源。

- 热管理:通过让CPU进入空闲状态,Linux内核的idle配置可以帮助管理CPU的温度。当CPU处于高负载状态时,它会产生大量热量,因此将CPU放入空闲状态可以使其冷却并降低温度。

总之,Linux内核的idle配置可以优化系统的性能和能效,减少能耗和热量,并最大化利用系统资源。

开启idel=poll在虚拟化场景下,对监控影响的

原理如下:

虚拟化的场景下,Qemu缺省对GuestOS提供HLT指令作为idle的唯一机制,当虚拟机的CPU进入idle状态时,就会调用HLT该指令把该CPU挂起,此时会陷入VMM处理,VMM知道该VCPU目前不需要使用了,便将该VCPU所在线程挂起进入睡眠状态。当另一个VCPU需要唤醒该挂起的VCPU时,就在虚拟机内发起IPI中断(CPU间通信的机制),陷入到VMM中,随后便是执行kvm_vcpu_kick0和schedule0函数,最后注入IPI中断到目标VCPU。

如果一个虚拟机内任务频繁处于idle和有任务之间,就会存在大量的vmexit以及IPI中断,这会对虚拟化层带来一些开销。因此虚拟机使用idle=poll启动选项,能够完全避免VCPU执行HTL指令,因此,该VCPU在物理机上对应的线程将一直占用cpu(除非被中断或者抢占),那么该线不会睡眠。

从物理机角度来看,由于本该挂起进入睡眠的VCPU,现在不再睡眠,而是持续占有CPU。

四、优缺点

优点:CPU不再睡眠,IPI中断耗时明显减少,CPU性能有所提高。

缺点

1、从物理机角度来看,由于本该挂起进入睡眠的VCPU,现在不再睡眠,而是持续占有CPU。这对云主机可不是件好事情,因为这部分"空闲"CPU配额本该交给别的虚拟机来执行,现在却被禁止了HTL的虚拟机在空转,实在是在经济上不划算。

2、虚拟机中禁止HTL也不是所有情况下都有明显效果。假如虚拟机中的业务场景CPU负载很高,到了100%,该场景中自然不会调用HTL(VCPU没有空闲,自然不会进入idle状态)。因此,修改idle=poll启动选项就失去了作用。

为了在物理机经济效益和虚拟机性能最大化之间取得折中,目前内核的方案是提供了halt_poll_ns机制,即在VCPU HTL之前,先轮询下有没有虚拟中断要来,来的话就马上注入虚拟机,如果超过轮询上限都没有虚拟中断过来,才真正进入睡眠。

华为FusionSphere建议配置halt_poll_ns值为20000

我是运维少年,欢迎关注我同名的公众号~