Hyper-V Hypervisor のさまざまな種類のスケジューラを管理する

適用対象: Windows Server 2022、Windows Server 2019、Windows Server 2016、Windows Server バージョン 1803、Windows Server バージョン 1709、Windows 10

この記事では、Windows Server 2016 で導入された仮想プロセッサ スケジューリング ロジックの新しいモードについて説明します。 これらのモードまたはスケジューラの種類によって、Hyper-V Hypervisor がゲスト仮想プロセッサ間での作業の割り当てと管理を行う方法が決まります。 Hyper-V ホスト管理者は、以下の作業を実行できます。

  • ゲスト仮想マシン (VM) に最適なハイパーバイザー スケジューラの種類を選択する。
  • スケジュール ロジックを利用するように VM を構成します。

前提条件

この記事で後述するハイパーバイザー スケジューラ機能を使用するには、次の更新プログラムをインストールする必要があります。 これらの更新プログラムには、ホストの構成に必要な新しい hypervisorschedulertype BCD オプションをサポートするための変更が含まれています。

バージョン リリース 更新が必要 サポート技術情報の記事
Windows Server 2016 1607 2018.07 C KB4338822
Windows Server 2016 1703 2018.07 C KB4338827
Windows Server 2016 1709 2018.07 C KB4338817
Windows Server 2019 1804 None None

背景

Hyper-V 仮想プロセッサ スケジューリングの背後にあるロジックと制御について説明する前に、同時マルチスレッドや Hyper-V によるプロセッサの仮想化方法などの特定の概念を理解しておくことが重要です。

SMT について

同時マルチスレッディング (SMT) とは、最新プロセッサの設計に採用されている、別個の独立した実行スレッド間でプロセッサのリソースを共有できるようにする手法です。 通常、SMT は、ほとんどのワークロードに対して適度なパフォーマンス向上を提供します。 SMT では、可能な場合に計算を並列化することで命令のスループットを高めます。 ただし、スレッドが共有プロセッサ リソースに対して互いに競合する場合は、パフォーマンスが著しく向上しない場合や、わずかな損失が発生する場合もあります。

Windows Server で SMT を使用するには、互換性のあるプロセッサが必要です。 たとえば、Intel Hyper-Threading テクノロジまたは Advanced Micro Devices (AMD) マルチスレッド (SMT) を搭載したプロセッサなどです。

この記事における SMT の知識と Hyper-V での使われ方についての説明は、Intel システムと AMD システムの両方に対して同等に当てはまります。

Hyper-V におけるプロセッサ仮想化の方法を理解する

ハイパーバイザー スケジューラの種類を検討する前に、Hyper-V アーキテクチャについて理解しておく必要があります。 このアーキテクチャのしくみの詳細な概要については、「Hyper-V テクノロジの概要」を参照してください。現時点では、次の概念に留意する必要があります:

  • Hyper-V は、ハイパーバイザーの制御下で、VM パーティションを作成して管理し、それらの間でコンピューティング リソースを割り当てて共有します。 パーティションは、個々のゲスト VM 間や、ゲスト VM とルート パーティションとの間に、それぞれを分離する強力な境界を提供します。

  • ルート パーティションもそれ自体が VM パーティションの一種ですが、ゲスト VM にない特有のプロパティと特権を持っています。 ルート パーティションには以下の特徴があります。

    • すべてのゲスト VM を制御する管理サービスを提供します。
    • 仮想デバイスのサポートをゲストに提供します。
    • ゲスト VM のすべてのデバイスの入力と出力を管理します。

    ルート パーティションでは、アプリケーション ワークロードを一切実行しないことをお勧めします。

  • ルート パーティションの各仮想プロセッサ (VP) は、基になる論理プロセッサ (LP) に 1 対 1 でマップされます。 ホスト VP は、常に同じ LP 上で実行されます。 ルート パーティションの VP は移行できません。

  • 既定では、ルート パーティションの VM をホストする LP もゲスト VM を実行できます。

  • ハイパーバイザーがゲスト VP の実行をスケジュールする際には、使用可能な任意の論理プロセッサを割り当てる可能性があります。 ハイパーバイザー スケジューラは、キャッシュの一時的な局所性、Non-Uniform Memory Access (NUMA) トポロジ、その他さまざまな要因を考慮してゲスト VP をスケジュールしようとしますが、最終的には、どのホスト LP も VP のスケジューリングに使用される可能性があります。

ハイパーバイザー スケジューラの種類

Windows Server 2016 の Hyper-V Hypervisor は数種類のスケジューラ ロジック モードをサポートしています。ハイパーバイザーが基盤となる論理プロセッサをどのように使用して仮想プロセッサをスケジュールするかは、そのモードによって異なります。 これらのスケジューラの種類は次のとおりです。

クラシック スケジューラ

従来のスケジューラは、Windows Server 2016 Hyper-V を含め、Windows Hyper-V Hypervisor の発表以降のすべてのバージョンの既定となっています。 クラシック スケジューラは、公平なシェアのプリエンプティブなラウンド ロビン スケジューリング モデルをゲスト仮想プロセッサに提供します。

この種類は、以前からある Hyper-V の用途 (プライベート クラウド、ホスティング プロバイダーなど) のほとんどに最適です。 クラシック スケジューラの種類のパフォーマンス特性は、次のようなさまざまな仮想化シナリオをサポートするために適切に最適化されています:

  • LP に対する VP の過剰割り当て。
  • 多数の異種 VM とワークロードを同時に実行する。
  • 大規模なハイ パフォーマンス VM の実行。
  • Hyper-V の全機能セットを制限なしでサポートする用途や、その他のシナリオ。

コア スケジューラ

ハイパーバイザーのコア スケジューラは、Windows Server 2016 および Windows 10 バージョン1607 で導入された従来のスケジューラ ロジックに代わる手段です。 コア スケジューラは、ゲスト ワークロードの分離のための強力なセキュリティ境界を提供します。 また、SMT 対応の仮想化ホストで実行されている VM 内のワークロードのパフォーマンスの変動も軽減されます。 コア スケジューラでは、SMT 対応の 1 つの仮想化ホスト上で SMT VM と非 SMT VM の両方を同時に実行できます。

コア スケジューラには以下の特徴があります。

  • 仮想化ホストの SMT トポロジを使用します。
  • オプションで、SMT ペアをゲスト VM に公開できます。
  • 1 つの VM に属するゲスト仮想プロセッサのグループを、SMT 論理プロセッサの複数のグループ上でスケジュールできます。

この機能は対称的に働きます。 LP が 2 つのグループに分かれている場合、VP は 2 つのグループに分けてスケジュールされ、1 つのコアが複数の VM で共用されることはありません。 SMT 対応でない VM の VP をスケジュールすると、実行時、その VP は使用するコア全体を消費します。 コア スケジューラの全体的な結果は次のとおりとなります。

  • 強力なセキュリティ境界によるゲスト ワークロードの分離が作成されます。 ゲスト VP には、基盤となる物理コア ペア上でのみ実行できます。このため、サイド チャネル スヌーピング攻撃を受ける脆弱性が軽減されます。
  • これにより、スループットの変動性が低下します。
  • パフォーマンスが低下する可能性があります。 グループ内の VP が 1 つしか実行できない場合、コア内の命令ストリームのうち 1 つだけが起動し、もう 1 つはアイドル状態になります。
  • ゲスト VM で動作する OS とアプリケーションでは、SMT の動作とプログラミング インターフェイス (API) を使用し、物理マシンの場合と同じく複数の SMT スレッドで作業の制御や分散を行うことができます。

Windows Server 2019 の時点では、Hyper-V は既定でコア スケジューラを使用します。 Windows Server 2016 などの以前のバージョンでは、スケジューラは省略可能であり、クラシック スケジューラが既定のオプションです。

ホストの SMT が無効になっているコア スケジューラの動作

場合によっては、ハイパーバイザーの構成でコア スケジューラが選択されたにもかかわらず、SMT 機能がオフになっていることや、仮想化ホスト上に機能が存在しないことがあります。 そのような場合、ハイパーバイザー スケジューラの種類の設定に関係なくクラシック スケジューラの動作が適用されます。

ルート スケジューラ

ルート スケジューラは、Windows 10 バージョン 1803 に到着しました。 ルート スケジューラの種類を有効にすると、ハイパーバイザーによって作業スケジュールのルート パーティション制御が提供されます。 ルート パーティションの OS インスタンスの NT スケジューラが、システム LP に対する実行スケジュール機能のすべての側面を管理します。

ルート スケジューラは、ユーティリティ パーティションをサポートし、Windows Defender Application Guard (WDAG) で使用されるような強力なワークロード分離を提供するという独自の要件に対応しています。 このシナリオでは、スケジュールの責任をルート OS に任せることにいくつかのメリットがあります:

  • コンテナー シナリオに応じた CPU リソース制御とユーティリティ パーティションを組み合わせると、管理と展開をシンプルに行えるようになります。
  • ルート OS スケジューラは、コンテナー内におけるワークロードの CPU 使用率に関するメトリックをいつでも収集できる立場にあります。 このデータは、システム内にある他のすべてのワークロードに適用可能な同じスケジューリング ポリシーへの入力として使用できます。
  • また、同じそれらのメトリックを、アプリケーション コンテナーで実行される作業とホスト システムとの関連付けに役立てることもできます。 ただし、従来の VM ワークロードに関してそれらのメトリックを追跡することは、より困難です。実行中のすべての VM で発生する作業の一部がルート パーティションで実行されるためです。

クライアント システムでのルート スケジューラの使用

Windows 10、バージョン 1803 から、ルート スケジューラはデフォルトでクライアント システムでのみ使用されるようになりました:

  • ハイパーバイザーを有効にして、仮想化ベースのセキュリティと WDAG ワークロードの分離をサポートできます。
  • 異種コア アーキテクチャを使用して将来のシステムを適切に運用することが重要です。

この構成は、クライアント システムでサポートされる唯一のハイパーバイザー スケジューラの構成です。 管理者は、Windows クライアント システムの既定のハイパーバイザー スケジューラの種類をオーバーライドしないでください。

仮想マシンの CPU リソース コントロールとルート スケジューラ

ハイパーバイザー ルート スケジューラを有効にすると、Hyper-V で提供される VM プロセッサ リソース制御はサポートされません。 ルート オペレーティング システムのスケジューラ ロジックは、ホスト リソースをグローバルに管理し、単一の VM のゲスト リソースを管理していません。 Hyper-V の VM ごとのプロセッサリソース制御 (上限、ウェイト、リザーブなど) は、クラシックやコア スケジューラの種類など、ハイパーバイザーが VP スケジューリングを直接制御する場合にのみ適用できます。

サーバー システムでのルート スケジューラの使用

現時点では、サーバー上でルート スケジューラと Hyper-V を併用することはおすすめしません。 多くのサーバー仮想化デプロイメントで一般的に使用される多種多様なワークロードへの対応に関しては、ルート スケジューラのパフォーマンス特性の把握と調整がまだ十分に進んでいません。

ゲスト VM で SMT を有効にする

コア スケジューラを使用するように仮想化ホストのハイパーバイザーを構成したら、ゲスト VM で SMT を使用するための構成が可能になります。 VP がハイパースレッド化されている事実をゲスト VM に公開すると、ゲスト オペレーティング システムのスケジューラと、VM で実行されているワークロードが、それら自身の作業スケジューリングの中で SMT トポロジを検出して使用できるようになります。

  • Windows Server 2016 の場合、ゲスト SMT は既定の構成では有効になりません。 Hyper-V ホスト管理者が明示的に有効にする必要があります。
  • Windows Server 2019 以降では、ホスト上に作成された新しい仮想マシンは、既定でホストの SMT トポロジを継承します。 たとえば、1 コアあたり 2 つの SMT スレッドを持つホスト上に作成したバージョン 9.0 の VM は、1 コアあたり 2 つの SMT スレッドも持つことになります。

ゲスト VM の SMT を有効にするには、PowerShell を使用する必要があります。 Hyper-V マネージャーには対応するユーザー インターフェイスが用意されていません。 ゲスト VM で SMT を有効にするには:

  1. Hyper-V Administrators グループのメンバーまたは同等のアカウントを使用して、PowerShell ウィンドウを開きます。
  2. Set-VMProcessor -VMName <VMName> -HwThreadCountPerCore <n> を実行します。なお、<n> はゲスト VM から見たコアあたりの SMT スレッド数です。 <n> = 0 は、ホストの 1 コアあたり SMT スレッド数と一致するように HwThreadCountPerCore 値を設定しています。

注意

Windows Server 2019 以降では、ホスト SMT スレッド数と一致する代わりに HwThreadCountPerCore = 0 を設定できます。

次のスクリーンショットは、VM 内で動作するゲスト オペレーティング システムで検出されたシステム情報を示しています。 仮想プロセッサが 2 個あり、SMT が有効になっています。 同じ 1 つのコアに属する 2 つの論理プロセッサがゲスト オペレーティング システムで検出されています。

Screenshot that shows msinfo32 in a guest VM with SMT enabled.

Windows Server 2016 Hyper-V でハイパーバイザー スケジューラの種類を構成する

Windows Server 2016 Hyper-V では、従来のハイパーバイザー スケジューラのモデルが既定で使用されます。 必要な場合、コア スケジューラを使用するようハイパーバイザーを構成できます。 コア スケジューラを使用すると、ゲスト VM には対応する物理 SMT ペア上で動作するという制限が適用され、セキュリティが向上します。 この構成では、SMT スケジューリングの VM をゲスト VP で使用することがサポートされます。

注意

Windows Server 2016 Hyper-V を実行するすべてのお客様には、悪意があるかもしれないゲスト VM から最適な形で仮想化ホストを保護するために、コア スケジューラを選択することをお勧めします。

Windows Server 2019 Hyper-V の規定をコア スケジューラ使用にする

展開する Hyper-V ホストに確実に最適なセキュリティ構成が適用されるよう、Windows Server 2019 Hyper-V では、既定でコア ハイパーバイザー スケジューラ モデルが使用されるようになりました。 ホスト管理者は、必要な場合、従来のクラシック スケジューラを使用するようにホストを構成することもできます。 管理者が既定の設定をオーバーライドする場合は、それぞれの種類のスケジューラが仮想化ホストのセキュリティとパフォーマンスにどのような影響を及ぼすかについて、あらかじめ説明をよく読み、十分理解したうえで慎重に検討してください。 詳細については、「Hyper-V ハイパーバイザー スケジューラの種類の選択について」を参照してください。

Windows Server でハイパーバイザー スケジューラの種類を選択する

ハイパーバイザー スケジューラの構成は、hypervisorschedulertype BCD エントリによって制御されます。

スケジューラの種類を選択するには:

  1. 管理者特権でコマンド プロンプトを開きます。
  2. bcdedit /set hypervisorschedulertype type を入力します。なお、type には次のいずれかのオプションを入力します:
  • Classic
  • Core
  • Root

ハイパーバイザー スケジューラの種類に対して行った変更を有効にするには、システムを再起動する必要があります。

注意

現在、ハイパーバイザー ルート スケジューラは Windows Server Hyper-V 上ではサポートされていません。 Hyper-V 管理者は、サーバー仮想化シナリオにおいてルート スケジューラを使用する構成を試すこともしないでください。

現在のスケジューラの種類を確認する

イベント ビューアー システム ログを調べることで、Hyper-V が現在使用しているハイパーバイザー スケジューラの種類を確認できます。 最新のハイパーバイザー起動イベント ID 2 を見ると、ハイパーバイザーの起動時に構成されたハイパーバイザー スケジューラの種類が報告されています。 ハイパーバイザー起動イベントについては、Windows イベント ビューアーまたは PowerShell で情報を取得できます。

ハイパーバイザー起動イベント ID 2 は、次のとおりのハイパーバイザー スケジューラの種類の情報を提供します。

  • 1 = 従来のスケジューラ、SMT は無効化
  • 2 = 従来のスケジューラ
  • 3 = コア スケジューラ
  • 4 = ルート スケジューラ

A screenshot of the hypervisor launch event ID 2 properties window. The user has selected the General tab, showing that the hypervisor scheduler type is 0x2.

A screenshot of the Event Viewer window. The user has selected Hyper-V Hypervisor launch event ID 2 from the list of events, highlighting it in dark blue.

Hyper-V ハイパーバイザー スケジューラの種類を示す起動イベントを PowerShell で照会する

PowerShell を使用してハイパーバイザーのイベント ID 2 を照会するには、PowerShell プロンプトから次のコマンドを入力します:

Get-WinEvent -FilterHashTable @{ProviderName="Microsoft-Windows-Hyper-V-Hypervisor"; ID=2} -MaxEvents 1

A screenshot of a query for hypervisor launch event ID 2. The results say hypervisor scheduler type is 0x2.