You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:34:53