我可以从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利用率百分比。
由于
答案 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.usage
和cpuacct.stat
确实使用不同的逻辑来收集其指标;这可能解释了差异(?)。
答案 2 :(得分:0)
不幸的是,对于KVM来宾,上述答案在CPUACCT控制器中不正确:
cpu_time == user_time + system_time + guest_time (<-- wrong)
如果在VM中运行CPU密集型基准测试而不是I / O基准或网络密集型基准测试,则会发现“访客时间”与公式不匹配。
来宾时间(根据/ proc /
每个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约束的工作负载下,这都是完全不正确的。