Ubuntu 20.04下qemu-kvm虚拟机CPU使用率指标差异问题咨询
问题描述
在Ubuntu 20.04上通过qemu-kvm(libvirt)创建了一台配备8核CPU的虚拟机,虚拟机内部署node-exporter,宿主机(hv)部署libvirt-exporter后,出现CPU使用率指标不一致的情况:
- 虚拟机内node-exporter显示CPU使用率约50%(即8核中4核被占用),使用的PromQL指标:
(((count(count(node_cpu_seconds_total{node=~"iothub-1",job="node-exporter"}) by (cpu))) - avg(sum by (mode)(rate(node_cpu_seconds_total{mode='idle',node=~"iothub-1",job="node-exporter"}[$__rate_interval])))) * 100) / count(count(node_cpu_seconds_total{node=~"iothub-1",job="node-exporter"}) by (cpu))
- 宿主机上libvirt-exporter显示该虚拟机CPU使用率超过500%(相当于占用5个宿主机物理核),使用的PromQL指标:
rate(libvirt_domain_info_cpu_time_seconds_total{namespace="$namespace",host=~"$instance_name"}[1m])
同时执行virsh cpu-stats命令得到以下输出:
user@iot:~$ sudo virsh cpu-stats iothub-1 --total Total: cpu_time 1801252.025306000 seconds user_time 1278780.403019000 seconds system_time 522471.622286000 seconds
疑问:两处指标差异的原因是什么?应该以哪个指标为准?
核心差异与结论
- 指标计算逻辑的本质区别
- 虚拟机内的node-exporter指标:从虚拟机操作系统的视角统计,计算的是虚拟机内部感知到的CPU使用率。它以虚拟机分配的8核vCPU为基准,50%表示虚拟机内有4核vCPU处于活跃状态,反映的是虚拟机内部进程对自身分配vCPU资源的使用占比。
- 宿主机上的libvirt-exporter指标:
rate(libvirt_domain_info_cpu_time_seconds_total)统计的是虚拟机在宿主机物理CPU上消耗的总时间,输出值的单位是“核数”(比如500%对应消耗了5个宿主机物理核的时间)。这个值是虚拟机所有vCPU在宿主机物理CPU上实际占用的时间总和,和虚拟机自身分配的vCPU数量无关,直接反映虚拟机对宿主机物理资源的消耗情况。
- virsh cpu-stats的验证逻辑
virsh cpu-stats输出的cpu_time是虚拟机所有vCPU累计消耗的CPU时间总和,将该值除以虚拟机的运行时长,再除以宿主机的物理核数,得到的结果和libvirt-exporter的指标逻辑完全一致,可作为宿主机侧指标的辅助验证。 - 指标选择依据
- 若关注虚拟机内部业务的负载情况(比如应用是否跑满了分配的vCPU资源),以node-exporter的指标为准。
- 若关注虚拟机对宿主机物理资源的占用情况(比如宿主机资源是否被该虚拟机过度消耗),以libvirt-exporter的指标为准。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

