ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

Hyper-V で論理プロセッサの利用状況は環境やワークロードに左右される

概要

Hyper-V の仮想プロセッサ (VP) と論理プロセッサ (LP) の対応について、マニュアルの記述を引用します。

  • ルート パーティションの各仮想プロセッサ (VP) は、論理プロセッサ (LP) に 1:1 でマップされます。 ホストの VP は、常に同じ基盤の LP で実行されます。ルート パーティションの VP の移行は必要ありません。
  • 既定では、ホスト VP を実行する LP は、ゲスト VP も実行できます。
  • ゲスト VP を使用可能な任意の論理プロセッサ上で実行するようにハイパーバイザーがスケジュールする場合があります。 ゲスト VP をスケジュールする際、ハイパーバイザー スケジューラは、一次キャッシュの局所性、NUMA トポロジ、およびその他のさまざまな要因を考慮する必要があります。最終的には、VP はいずれのホスト LP でもスケジュールされる可能性があります。
Hyper-V Hypervisor のさまざまな種類のスケジューラを理解して使用する | Microsoft Learn

ルートパーティションは VP と LP が 1:1 で対応するとあります。一方、ゲストOS では VP と LP の対応が動的に変化することを示唆しています。

ゲスト OS での VP / LP の対応について、環境やワークロードを変えて検証してみました。その結果、環境やワークロードによって LP の利用状況の傾向に違いがみられました。

検証環境

検証環境 1

ホスト
プロセッサ Intel Core i5-6600 CPU @ 3.30GHz ※ 4 コアのCPUです
OS Windows 10 Pro バージョン 21H2
Hyper-V
構成バージョン 9.2
プロセッサ 4個の仮想プロセッサ
OS Red Hat Enterprise Linux release 9.1

検証環境 2

ホスト
プロセッサ AMD A10-5800K ※ 4 コアのCPUです
OS Windows 10 Pro バージョン 21H2
Hyper-V
構成バージョン 9.2
プロセッサ 4個の仮想プロセッサ
OS Red Hat Enterprise Linux release 9.1

検証内容

LP の使用率をパフォーマンスモニターで確認しました。
オブジェクト:Hyper-V Hypervisor Logical Processor
カウンター:% Total Run Time
インスタンス:Hv LP 0-3(計 4 個)

また、異なる検証環境で LP の利用状況の傾向に違いがあるかを確認しました。

ストレステストを単一 VP で実行

CPU 0 (VP に相当)に対してストレステストを実行します。

# taskset -c 0 stress-ng -c 1 -l 100

検証環境1でCPU0にストレステスト
<検証環境 1>

検証環境2でCPU0にストレステスト
<検証環境 2>

検証環境 1 で 07:58:58 頃から実行しました。全ての LP (LP 0-3) でまんべんなく使用率が上がっています。

検証環境 2 で 08:49:24 頃から実行しました。LP の 使用率が LP0, LP1 に偏って見えます。

いずれにせよ、ゲスト OS の VP が LP と 1:1 で対応していない、ということが分かります。

Apache HTTP Server と Apache Bench を単一 VP で実行

CPU 0 で Apache HTTP Server と Apache Bench を実行します。

# taskset -c 0 httpd -k start
# taskset -c 0 ab -c 1 -n 1000000 http://localhost/

検証環境1でCPU0にApacheとベンチマーク
<検証環境 1>

検証環境2でCPU0にApacheとベンチマーク
<検証環境 2>

検証環境 1 で 07:41:55 頃から実行しました。全ての LP (LP 0-3) で使用率がまんべんなく上がっています。

検証環境 2 で 08:16:27 頃から実行しました。LP の 使用率が LP0, LP1 に偏って見えます。

Apache HTTP Server と Apache Bench を異なる VP で実行

CPU 0 で Apache HTTP Server、CPU 1 で Apache Bench を実行します。

# taskset -c 0 httpd -k start
# taskset -c 1 ab -c 1 -n 1000000 http://localhost/

検証環境1でCPU0にApacheとCPU1にベンチマーク
<検証環境 1>

検証環境2でCPU0にApacheとCPU1にベンチマーク
<検証環境 2>

検証環境 1 で 07:49:07 頃から実行しました。2つの LP (LP0, LP1) で使用率が増加し、残りの LP (LP2, LP3) はあまり変化がありませんでした。

検証環境 2 で 08:06:58 頃から実行しました。2つの LP (LP0, LP3) で使用率が増加し、残りの LP (LP1, LP2) は使用率が多少上がった程度でした。

検証補足

例示した検証結果では検証環境 2 で LP の使用率に偏りが見られました。ですが、別日に測定すると偏りが減っていることもありました。よって、測定時点の状況によって傾向に違いが出る可能性もありそうです。

まとめ

Hyper-V のゲスト OS では VP / LP の対応が動的に決定することを検証からも裏付けました。

また、LP の利用状況は環境やワークロードによって左右されることが分かりました。これはマニュアルの『ゲスト VP をスケジュールする際、ハイパーバイザー スケジューラは、一次キャッシュの局所性、NUMA トポロジ、およびその他のさまざまな要因を考慮する必要があります。』という記述に対応した挙動と考えられます。