什么" cpu_time"完全代表libvirt?

时间:2016-11-07 15:05:39

标签: virtualization kvm libvirt

我可以从libvirt中提取以下CPU值:

virsh domstats vm1 --cpu-total
Domain: 'vm1'
  cpu.time=6173016809079111
  cpu.user=26714880000000
  cpu.system=248540680000000

virsh cpu-stats vm1 --total
Total:
    cpu_time       6173017.263233824 seconds
    user_time        26714.890000000 seconds
    system_time     248540.700000000 seconds

这里的cpu_time数字到底是什么意思?

我希望使用此数据计算CPU利用率百分比。

由于

3 个答案:

答案 0 :(得分:16)

这是一个非常难以回答的问题!在深入了解内核代码之后,我已经弄明白这里发生了什么,并且非常了解它的进展情况。

通常,对于Linux上的进程,总体CPU使用率只是用户空间花费的时间和内核空间花费的时间之和。如此天真,人们会期望user_time + system_time等于cpu_time。我发现的是Linux跟踪vCPU线程分别从用户空间或内核空间时间执行访客代码所花费的时间。

因此cpu_time == user_time + system_time + guest_time

因此,您可以将system_time + user_time视为在主机端提供QEMU / KVM的开销。并cpu_time - (user_time + system_time)给出客户操作系统运行其CPU的实际时间。

要计算CPU使用率,您可能只想每N秒记录cpu_time并计算两个样本之间的差值。例如usage % = 100 * (cpu_time 2 - cpu_time 1) / N

答案 1 :(得分:0)

按照大师从https://github.com/libvirt/libvirt/拉到2018年7月10日的数据,就QEMU / KVM而言,归结为:

  • cpu.time = cpuacct.usage cgroup指标
  • cpu.{user,system} = cpuacct.stat cgroup指标

一个人可能遇到的问题是guest load = time load - system load - user load有时会导致负值(?!?),例如对于运行中的QEMU / KVM guest虚拟机(值是秒),使用Debian 9股票内核(4.9)的示例:

time                   system    user     total
2018-07-10T13:19:20Z 62308.67 9278.59 107968.33
2018-07-10T13:20:20Z 62316.08 9279.73 107970.73
               delta     7.41    1.14      2.40 (2.40 < 7.41+1.14 ?!?)

内核错误? (至少一个人进行了类似的实验:https://lkml.org/lkml/2017/11/1/101
可以肯定的是:cpuacct.usagecpuacct.stat确实使用不同的逻辑来收集其指标;这可能解释了差异(?)。

答案 2 :(得分:0)

不幸的是,对于KVM来宾,上述答案在CPUACCT控制器中不正确:

cpu_time == user_time + system_time + guest_time (<-- wrong)

如果在VM中运行CPU密集型基准测试而不是I / O基准或网络密集型基准测试,则会发现“访客时间”与公式不匹配。

来宾时间(根据/ proc / / stat)仅表示VCPU运行来宾虚拟机(而不退出或处理I / O)所用的时间。

每个KVM / libvirt来宾的CPUACCT控制器的顶级父目录 包括在“仿真器”和“ vcpuX”子目录上花费的时间 >全部,包括在QEMU主进程中运行的vhost内核线程和非VCPU pthread,而不仅仅是访客时间或用户/系统时间。

这使以上公式错误。正确的公式为:

guest_time = sum(vcpuX)=>cpu.time - sum(vcpuX)=>(for each child: cpuacct.stat=>user + cpuacct.stat=>system)

您不能简单地使用顶级父文件来计算访客时间。在任何受I / O约束的工作负载下,这都是完全不正确的。