- PR -

Hyper-VのCPUリソース管理について

1
投稿者投稿内容
DragStar
常連さん
会議室デビュー日: 2008/08/31
投稿数: 40
投稿日時: 2008-09-06 17:30
windowsServer2008より標準搭載になったHyper-Vについて質問です。
Hyper-Vのような仮想化技術で必ず行き当たるのかリソース管理だと思うのですが、
そこで理解に苦しむ現象があって質問させていただきました。

ゲストOSそれぞれに対してCPUの割り振りの設定を行えるのですが、
ここで物理的に搭載しているCPU以上の割り当てをしても正常に動いてしまうのが
理解できません。

具体的にいうと、、、
<物理マシンスペック>
・クアッドコア×1
 (コア数:4)

<ゲストOS>
管理OS⇒4CPU ←割り当ての設定はないが、OS上の認識
ゲストOS1⇒4CPU(割り当て)
ゲストOS2⇒1CPU(割り当て)


ここで明らかに物理上のCPU以上に割り当てを行っているのに
正常に動作しているのはなぜなのでしょうか??
リソースの割り当はハイパバイザで行っているのはわかっているのですが、
内部的な動きは分からなくって。。。
メモリは物理メモリ以上の割り当てを行うと起動できないのになぜCPU割り当ては可能なのかが理解できません。

どなたか有識者の方、ご教授ください。
質問の意図が分かりにくい場合にはご指摘いただければと思います。
よろしくお願いします。
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2008-09-08 16:18
こんにちは。

引用:

<ゲストOS>
管理OS⇒4CPU ←割り当ての設定はないが、OS上の認識
ゲストOS1⇒4CPU(割り当て)
ゲストOS2⇒1CPU(割り当て)


この状況では、ゲスト OS に合計で5つの CPU を割り当てたことにはなりません。

・ゲストOS1⇒4CPU(割り当て)

・ゲストOS2⇒1CPU(割り当て)
は別モノとみなされるので、割り当てたコアは最大で4です。

とはいえ、仮想 OS が CPU の割り当てを待つ時間は勿体ないので、たとえば
・ゲストOS1⇒3CPU(割り当て)
・ゲストOS2⇒1CPU(割り当て)
とする方が良いと思います。
_________________
上本亮介 (ue) @ わんくま同盟
Microsoft MVP for VSTO (Jul 2008 - Jun 2009)
Hello Another World!
.NET 勉強会 / ヒーロー島
KYO
会議室デビュー日: 2005/10/31
投稿数: 19
投稿日時: 2008-09-11 17:19
ueさんの回答ですでに理解されているかも知れませんが、割り当てたCPUは占有するわけではないということですね。
物理CPUは論理CPUという形でHyper-Vが管理し、仮想サーバーごとに仮想CPUとして管理しているようです。

たとえば仮想サーバー3台でそれぞれCPU2つ割り当てている場合、Hyper-Vが適切にCPUを分配してくれるようです。
負荷を分散してくれるわけでなく、CPUを共有するサーバー数のバランスを取る感じと個人的に解釈しています(TechEd2008より)。

物理CPU
├─論理CPU01
├─論理CPU02
├─論理CPU03
└─論理CPU04

とあった場合の割り当ては↓のようになるかと。

物理CPU
├─論理CPU01
│ ├─仮想サーバー1用_仮想CPU01
│ └─仮想サーバー3用_仮想CPU01

├─論理CPU02
│ └─仮想サーバー1用_仮想CPU02

├─論理CPU03
│ ├─仮想サーバー2用_仮想CPU01
│ └─仮想サーバー3用_仮想CPU02

└─論理CPU04
  └─仮想サーバー2用_仮想CPU02

仮にもう1台仮想サーバーを増やしCPUを2つ割り当てたら、論理CPU02、04に仮想CPU01と02を割り当てるかと思います。
ksasaki
会議室デビュー日: 2008/10/23
投稿数: 2
投稿日時: 2008-10-23 02:10
マイクロソフトの佐々木と申します。こんばんは。

Tech Ed Yokohama 2008でHyper-Vのセッション(T1-407)を担当させていただいたものです。

仮想マシンへのCPU割り当てですが、KYOさんも書かれているとおり

「仮想マシンへは物理的なCPUコアを丸ごと割り当てているわけではない」

と考えるとわかりやすいかと思います。

ハイパーバイザは、プロセッサコアやハイパースレッディングのスレッドなど、論理的にCPUと扱えるものを「論理プロセッサ(LP)」として管理します。例えば、6コアのプロセッサが4ソケットあるサーバは、"24LPのマシン"と呼んだりします。

そして、このLPがそのまま仮想マシンにガチャンとくっつくわけではありません。仮想マシンについているプロセッサは、「仮想プロセッサ(VP)」というものなのです。VPは、LP上で実行されるプロセスみたいなものです。OSのカーネルがCPU時間をプロセスに割り当てるのと同じように、ハイパーバイザはLPの時間を細切れにしてVPに割り当てます。

ですから、例えば4LPの物理マシン上に、2VPの仮想マシンが4台、といったような「物理的なコア数を超える割り当て」というのも自然に行えます。この場合、1LPに対して2VPが割り当てられるわけです。LP:VP比が1:1を超えるこのような構成を"over subscription"と呼びます。

なお、管理OSのタスクマネージャを開くと、必ず物理マシンが持っているすべてのコアが見えるので、管理OSだけは物理マシンのCPUを直接使っているようにも見えますが、実は管理OSがみているCPUも、Root VPというVPです。Root VPは必ずすべてのLPに一つずつ作られます。そのため、例えば4コアのマシンであれば管理OSは必ず4コア見えるのです。

注意していただきたいのは、管理OSで見えているCPUも管理OS用のVPに過ぎず、LPではないため、「管理OSのタスクマネージャを眺めても、マシン全体としてのCPU負荷はわからない」という点です。

この辺もご覧ください。
http://blogs.msdn.com/tvoellm/archive/2008/05/09/hyper-v-performance-counters-part-three-of-many-hyper-v-logical-processors-counter-set.aspx


[ メッセージ編集済み 編集者: ksasaki 編集日時 2008-10-23 02:12 ]
Mr.KY
会議室デビュー日: 2008/10/25
投稿数: 2
投稿日時: 2008-10-25 19:36
一つ前の投稿内容の保守
------------------------------
マイクロソフトの佐々木と申します。こんばんは。

Tech Ed Yokohama 2008でHyper-Vのセッション(T1-407)を担当させていただいたものです。

仮想マシンへのCPU割り当てですが、KYOさんも書かれているとおり

「仮想マシンへは物理的なCPUコアを丸ごと割り当てているわけではない」

と考えるとわかりやすいかと思います。

ハイパーバイザは、プロセッサコアやハイパースレッディングのスレッドなど、論理的にCPUと扱えるものを「論理プロセッサ(LP)」として管理します。例えば、6コアのプロセッサが4ソケットあるサーバは、"24LPのマシン"と呼んだりします。

そして、このLPがそのまま仮想マシンにガチャンとくっつくわけではありません。仮想マシンについているプロセッサは、「仮想プロセッサ(VP)」というものなのです。VPは、LP上で実行されるプロセスみたいなものです。OSのカーネルがCPU時間をプロセスに割り当てるのと同じように、ハイパーバイザはLPの時間を細切れにしてVPに割り当てます。

ですから、例えば4LPの物理マシン上に、2VPの仮想マシンが4台、といったような「物理的なコア数を超える割り当て」というのも自然に行えます。この場合、1LPに対して2VPが割り当てられるわけです。LP:VP比が1:1を超えるこのような構成を"over subscription"と呼びます。

なお、管理OSのタスクマネージャを開くと、必ず物理マシンが持っているすべてのコアが見えるので、管理OSだけは物理マシンのCPUを直接使っているようにも見えますが、実は管理OSがみているCPUも、Root VPというVPです。Root VPは必ずすべてのLPに一つずつ作られます。そのため、例えば4コアのマシンであれば管理OSは必ず4コア見えるのです。

注意していただきたいのは、管理OSで見えているCPUも管理OS用のVPに過ぎず、LPではないため、「管理OSのタスクマネージャを眺めても、マシン全体としてのCPU負荷はわからない」という点です。

この辺もご覧ください。
http://blogs.msdn.com/tvoellm/archive/2008/05/09/hyper-v-performance-counters-part-three-of-many-hyper-v-logical-processors-counter-set.aspx
Mr.KY
会議室デビュー日: 2008/10/25
投稿数: 2
投稿日時: 2008-10-25 19:50
佐々木さん、こんばんは。

投稿内容に " 管理OSで見えているCPUも管理OS用のVPに過ぎず " と記載されていますが、システムモニタには " Hyper-V Virtual Processor" とは別に " Logical Processor" のカウンタがあるようです。
実際には、管理OSからはVPもLPも見えているのではないですか?

MSDNを見ても、LP用のHyperCallが用意されているようです。
HvGetLogicalProcessorRunTime
http://msdn.microsoft.com/en-us/library/bb969894.aspx

この説明を見る限り、カーネルはVPで動作するかもしれませんが、管理OSもゲストOSもHyperCallでLPの情報も取得できるのではないのですか?
よろしくお願いします。
ksasaki
会議室デビュー日: 2008/10/23
投稿数: 2
投稿日時: 2008-10-28 20:15
佐々木です。

引用:

この説明を見る限り、カーネルはVPで動作するかもしれませんが、管理OSもゲストOSもHyperCallでLPの情報も取得できるのではないのですか?
よろしくお願いします。



おっしゃるとおりです。もちろんHypercallを呼べば、LPの情報を取得できますし、Hyper-V Hypervisor Logical Processorオブジェクトを見ることでLPの稼働状況を把握できます。

私が以下のように書いたのは、
引用:

「管理OSのタスクマネージャを眺めても、マシン全体としてのCPU負荷はわからない」


文字通り、タスクマネージャを見てもマシン全体の負荷はわかりませんよ、という意味です。Virtual Serverの時は、ホストOSのタスクマネージャを見ればマシン全体のCPU使用率がわかりましたが、Hyper-Vではペアレントパーティションも一種の仮想マシンなので、こういう違いが出ています。
1

スキルアップ/キャリアアップ(JOB@IT)