web-dev-qa-db-ja.com

「cpu_time」は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使用率をパーセンテージで計算したいと考えています。

ありがとう

19
JoeM

これは驚くほど答えるのが難しい質問でした!ここで何が起こっているのかを理解している間、カーネルコードをしばらく注いだ後、何が起こっているのかを学ぶのは非常に素晴らしいことです。

通常、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

20
DanielB

マスターが2018-07-10を https://github.com/libvirt/libvirt/ からプルしたように、QEMU/KVMに関する限り、次のようになります。

  • cpu.time = cpuacct.usagecgroupメトリック
  • cpu.{user,system} = cpuacct.statcgroupメトリック

遭遇する可能性のある問題は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メトリックを収集するために異なるロジックを使用します。これは不一致(?)を説明するかもしれません。

0
Cédric Dufour