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使用率をパーセンテージで計算したいと考えています。
ありがとう
これは驚くほど答えるのが難しい質問でした!ここで何が起こっているのかを理解している間、カーネルコードをしばらく注いだ後、何が起こっているのかを学ぶのは非常に素晴らしいことです。
通常、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)
はゲストOSの実際の時間を与えるものと考えることができますCPUを実行していました。
CPU使用率を計算するには、N秒ごとに_cpu_time
_を記録し、2つのサンプル間のデルタを計算するだけです。例:usage % = 100 * (cpu_time 2 - cpu_time 1) / N
マスターが2018-07-10を https://github.com/libvirt/libvirt/ からプルしたように、QEMU/KVMに関する限り、次のようになります。
cpu.time
= cpuacct.usage
cgroupメトリックcpu.{user,system}
= cpuacct.stat
cgroupメトリック遭遇する可能性のある問題はguest load = time load - system load - user load
時々、負の値(?!?)になります。たとえば、Debian 9ストックカーネル(4.9)で実行中のQEMU/KVMゲスト(値は秒)の例です。
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 ?!?)
カーネルのバグ? (少なくとも1人が似たような実験をします: https://lkml.org/lkml/2017/11/1/101 )
確かなことが1つあります:cpuacct.usage
およびcpuacct.stat
メトリックを収集するために異なるロジックを使用します。これは不一致(?)を説明するかもしれません。