トップ回答者
Hyper-V のパフォーマンスカウンターについて

質問
-
こんにちは。初心者で、変な質問かもしれません。パフォーマンスカウンターで取得される情報について、どなたか教えてください。
Hyper-V Hypervisor Logical Processor
Hyper-V Hypervisor Root Vitual Processor
Hyper-V Hypervisor Vitual Processor
で、Guest Run Time
Hypervisor Run Time
とありますが、ゲストコードで実行・ハイパーバイザーコードで実行といった説明しか見つけられず、理解できずにいます。Hypervisor Run Time分は、Hypervisorが使用している分で、非仮想環境では存在しない処理になるのでしょうか?仮想化した故のオーバーヘッド部分のようなイメージなのですが、仮想化しなければ、その分のリソースも使えたというようなものなのかと。適切に表現できていなくてすいません。
回答
-
こんにちは。
たままさんの投稿にある通り、Hypervisor Run Time分は、Hypervisorが使用している分で、非仮想環境では存在しない処理です。この辺りの資料が参考になります。
http://www.atmarkit.co.jp/fwin2k/win2ktips/1232hvcpu/hvcpu.html
http://blogs.msdn.com/b/tvoellm/archive/2009/04/23/monitoring-hyper-v-performance.aspx
- 回答としてマーク たまま 2010年5月28日 15:37
すべての返信
-
こんにちは。
たままさんの投稿にある通り、Hypervisor Run Time分は、Hypervisorが使用している分で、非仮想環境では存在しない処理です。この辺りの資料が参考になります。
http://www.atmarkit.co.jp/fwin2k/win2ktips/1232hvcpu/hvcpu.html
http://blogs.msdn.com/b/tvoellm/archive/2009/04/23/monitoring-hyper-v-performance.aspx
- 回答としてマーク たまま 2010年5月28日 15:37
-
本当に回答ありがとうございます。
非仮想環境であれば同じCPU数で、もっとアプリの処理できたんですね。性能が全てではなく、仮想化の便利な機能や省スペースなども実現されているので、やむなしですね。(気持ち以上にHypervisor Run Time%がCPU使うなーと複雑なのも本音ですが・・・。)
実は今、各ゲストOSでもProcessor%を非仮想環境の時と同じようにlogmanで取得しています。このゲストOSの結果ではアプリの1プロセス(1スレッド)が95%以上CPUを使用しているのに、ペアレントOSのHyper-V VP(該当ゲストOS)のProcessorのGuest Run Time%は95%までいきません。Hypervisor Run Time%があるためです。このように各ゲストOSで取得する性能データは、何の値の100とした%かがよくわかっていません。そもそもペアレントOSから取得すべきであって、各ゲストOS毎の性能データは数値としては取得しても意味がないものなのかと悩んでしまいます。
アドバイス頂けると非常に嬉しいです。
-
こんにちは。
各ゲストOSで取得する性能データは、各ゲストOSに割り当てられたリソースを100とした%です。CPUの場合は、Virtual Processorの使用率です。まず、物理的なCPUがあり、Host OS,Guest OS,Hypervisorがそれぞれ使用します。
大雑把に言うと、物理CPUをコンマ何秒単位でGuestOS-Aに使用させ、次にコンマ何秒単位でGuestOS-Bに使用させ、さらに次にGuestOS-Cに使用させ、といったサイクルを繰り返しています。この切り替え(Context Switch)を行うためのオーバーヘッドも発生します。
GuestOS-Aから見ると、自分に割り当てられた分のCPUが全てです。この中からGuestOS-Aで動作するアプリケーションにCPU(Virtual Processor)のリソースを振り分けていきます。
物理CPU全体の使用状況を確認する場合は、ペアレントOSのパフォーマンスカウンタから確認する必要があります。
GuestOS-Aの維持に必要な情報を集める場合も、ペアレントOSのパフォーマンスカウンタから確認する必要があります。
GuestOS-AがVirtual Processorをどのようにアプリケーションに配分しているのか、これはGuestOS-Aのパフォーマンスカウンタから確認する必要があります。
GuestOS-Aの中でCPUを使用しているアプリケーションを確認する場合も、GuestOS-Aのパフォーマンスカウンタが必要です。
パフォーマンスカウンタは、目的に応じて使い分けてください。ある時は意味の無いカウンタであっても、また別の時は意味のあるカウンタになります。
-
ありがとうございます!
各ゲストOSで取得できるCPUの性能データは、VPの使用率ということですが、
Hyper-V VP(GuestOS VP0) Total Run Time = Guest Run Time + Hypervisor Run Time
と同じような値を意味するのでしょうか。それとも、
Hyper-V VP(GuestOS VP0) Guest Run Time
だけと同じ値を意味するのでしょうか。Hypervisor Run TimeはHypervisorが使用する分なので、各ゲストOSのカウンタでは含まれないのかと思いましたので。
・・・Hypervisor Run Time分も、各ゲストOSのカウンタでは各プロセスで使用した分に含まれてしまって区別つかないので、Total Run Timeですかね。
うまく頭で整理できていなくて、すいません。各ゲストOSのCPU%の分母が、設定で割り当てた値(1コア 100%予約)で固定(非仮想1コア相当)なのか、それとも物理CPUを他ゲストOSやホストOSと取りあって動的に変動するものなのかもわかっていません。
(検証機が貸出期限が来て返却されてしまいました。・・・無念です。)
-
こんにちは。
まず、自分の中で整理できていない状況で質問されているせいか、何を質問されているのか良くわかりません。整理されたうえでの再質問をお勧めします。
書かれた文面から、"たぶん、これが答えではなかろうか"と思われるところを解説します。ただ、何を質問されているのか良くわからないので、解答になっているかは保障の限りではありません。----------
Hyper-V VP(GuestOS VP0) Total Run Time = Guest Run Time + Hypervisor Run Time
と同じような値を意味するのでしょうか。それとも、
Hyper-V VP(GuestOS VP0) Guest Run Time
だけと同じ値を意味するのでしょうか--------------
=> ここは、以前紹介したblogの解説がそのまま答えではないでしょうか。
"%Total Run Time – This is just a sum of %Guest Run Time + % Hypervisor Runtime on a per VP basis. If you sum the %Total Run Time across the Root Virtual Processor and Virtual Processor counter sets it will equal the sum of %Total Run Time from all the Logical Processor counters."
--------------
各ゲストOSのCPU%の分母が、設定で割り当てた値(1コア 100%予約)で固定(非仮想1コア相当)なのか、それとも物理CPUを他ゲストOSやホストOSと取りあって動的に変動するものなのかもわかっていません。
--------------=>以前の投稿で回答しているかと思います。これです。
"大雑把に言うと、物理CPUをコンマ何秒単位でGuestOS-Aに使用させ、次にコンマ何秒単位でGuestOS-Bに使用させ、さらに次にGuestOS-Cに使用させ、といったサイクルを繰り返しています。この切り替え(Context Switch)を行うためのオーバーヘッドも発生します。"
これは、何も目新しい話ではなく、従来のOSとアプリケーションの関係と同じ考え方です。"クォンタム"というやつです。
http://xfreak.com/mca/point/platform/index.cgi?mode=view&no=9
OSとアプリケーションでいうと、CPUを誰にどのように割り当てるのかをOSが決めています。仮想化環境では、どのOS(厳密に言うと、パーティションに割り当てられます)に割り当てるのかはHyper Visorが決めています。
例えば、1つのHostOSと2つのGuestOSがあります。(ここでは、Hyper-Vを解説します。)
大雑把にいうと、次のようにCPUが割りあたっていきます。1.HV(Hyper Virsor) : はい、CPUはHostOSに使わせてあげます。
2.一定時間(クォンタム)終了 =>HV(Hyper Virsor) : はい、CPUは今度はGuestOS-Aに使わせてあげます。
3.一定時間(クォンタム)終了 =>HV(Hyper Virsor) : はい、CPUは今度はGuestOS-Bに使わせてあげます。
4.一定時間(クォンタム)終了 =>HV(Hyper Virsor) : はい、CPUは今度はCPUはHostOSに使わせてあげます。
5.一定時間(クォンタム)終了 =>HV(Hyper Virsor) : はい、CPUは今度はGuestOS-Aに使わせてあげます。
6.一定時間(クォンタム)終了 =>HV(Hyper Virsor) : はい、CPUは今度はGuestOS-Bに使わせてあげます。
こんな感じで切り替わります。このクォンタムの重み付けは、Hyper-Vの管理画面から設定可能です。
GuestOS-AのCPUの分母は、上記で言うと2と5のタイミングだけです。その他については含まれません。また、各Stepの間には、CPU切り替えのためのオーバーヘッドがかかります。
例えば、GuestOS-Aが使用していたCPUのレジスタをそのままGuestOS-Bに使わせるわけにはいきません。
切り替えの際は、VMCS(VM Control Structure)にGuestOS-Aが使用していたCPUのレジスタ情報を退避させ、GuestOS-Bが使用していたCPUのレジスタをVMCSからリストアした上で、CPUをGuestOS-Bに割り当てます。Hyper visorによるオーバーヘッドには、このような処理が含まれます。VMCS(AMDの場合はVMCSではなくてVMCB:VM Control Block)など、仮想化については次の資料が解りやすいかと思います
download.intel.com/jp/business/japan/pdf/1421-1431.pdf