ぱと隊長日誌

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

Hyper-V の仮想マシンで perf の "not supported" な項目を出力できるようにする

Hyper-V仮想マシンで perf の一部項目を出力できませんでした。これを構成バージョンの見直しとパフォーマンス監視コンポーネントを有効にすることで解決できました。解決までの流れを説明します。

プロセッサ Intel(R) Core(TM) i5-6600 CPU @ 3.30GHz
ホスト OS Windows 10 Pro 21H2
ゲスト OS Red Hat Enterprise Linux release 8.5

本記事での仮想マシン名と Hyper-V の構成バージョンの対応は以下の通りです。

仮想マシン 構成バージョン
MyOldVMName 9.0
MyNewVMName 9.2

コマンドの実行結果は一部省略しています。

構成バージョン:9.0 の仮想マシンで perf コマンドを実行しました。

# perf stat ls

 Performance counter stats for 'ls':

              1.00 msec task-clock                #    0.602 CPUs utilized
                 0      context-switches          #    0.000 K/sec
                 0      cpu-migrations            #    0.000 K/sec
               108      page-faults               #    0.108 M/sec
   <not supported>      cycles
   <not supported>      instructions
   <not supported>      branches
   <not supported>      branch-misses

       0.001657788 seconds time elapsed

       0.000804000 seconds user
       0.000835000 seconds sys

一部の項目が "not supported" になっています。これを解決できないかと調べを進めた結果、下記の記事にたどり着きました。
Intel のパフォーマンス監視ハードウェアを Hyper-V 仮想マシンで有効にする | Microsoft Docs

記事には「仮想マシンでパフォーマンス監視コンポーネントを有効にする」という節があり、これを適用することで改善する可能性がありそうです。

管理者権限で PowerShell を起動し、記事に記載のあったコマンドを実行しました。

PS> Set-VMProcessor MyOldVMName -Perfmon @("ipt", "pmu", "lbr", "pebs")
Set-VMProcessor : デバイス 'Processor' を変更できませんでした。
プロセッサの設定を変更できません。
'MyOldVMName' は、デバイス 'Processor' を変更できませんでした。(仮想マシン ID ~)
先に仮想マシンのバージョンをアップグレードしないと、プロセッサの設定 'EnablePerfmonIpt' を変更できません。(現在のバージョン: 9.0。必要なバージョン: 9.1)。

先の記事にもパフォーマンス監視コンポーネントを有効にするためのバージョン要件の記載がありました。

仮想マシンの世代は 9.1 以降でなければなりません。

Intel のパフォーマンス監視ハードウェアを Hyper-V 仮想マシンで有効にする | Microsoft Docs

ホストがサポートしている構成バージョンを確認します。

PS> Get-VMHostSupportedVersion

Name                                                  Version IsDefault
----                                                  ------- ---------
Microsoft Windows 10 Anniversary Update/Server 2016   8.0     False
Microsoft Windows 10 Creators Update                  8.1     False
Microsoft Windows 10 Fall Creators Update/Server 1709 8.2     False
Microsoft Windows 10 April 2018 Update/Server 1803    8.3     False
Microsoft Windows 10 October 2018 Update/Server 2019  9.0     True
Microsoft Windows 10 May 2019 Update/Server 1903      9.1     False
Microsoft Windows 10 May 2020 Update/Server 2003      9.2     False

構成バージョンとして 9.2 も利用可能と分かったため、構成バージョンのアップデートを試してみます。

PS> update-VMVersion MyOldVMName

警告: 仮想マシン "MyOldVMName" の構成バージョンが、既にこのサーバーでサポートされている最大レベルになっているため、更新は行われませんでした。クラスター化されたサーバーでは、サポートされる最大構成バージョンが、クラスター機能レベルによって制限される場合があります。

ですが、なぜかアップデートは失敗しました。

そこで、新規仮想マシンを構成バージョン 9.2 に指定して作成してみます。

PS> New-VM -Name "MyNewVMName" -Version 9.2 -Path "<path>" -Generation 2 -MemoryStartupBytes 8GB -NewVHDPath "<path>" -NewVHDSizeBytes 127GB

Name        State CPUUsage(%) MemoryAssigned(M) Uptime   Status     Version
----        ----- ----------- ----------------- ------   ------     -------
MyNewVMName Off   0           0                 00:00:00 正常稼働中 9.2

ホストのプロセッサである Intel Core i5-6600 はマイクロアーキテクチャが Skylake でした。
参考:インテル® Core™ i5-6600 プロセッサー

Skylake は PMU, PEBS, LBR をサポートしていることが下記の記事からわかります。
Configuring a Hyper-V* Virtual Machine for Hardware-Based Hotspots...

ホストの物理プロセッサでサポートされていないコンポーネントを有効にすると、仮想マシンの起動が失敗します。

Intel のパフォーマンス監視ハードウェアを Hyper-V 仮想マシンで有効にする | Microsoft Docs

記事にはこのような記載がありましたが、全部を有効にしてもこの後の仮想マシン起動は成功しました。

PS> Set-VMProcessor MyNewVMName -Perfmon @("ipt", "pmu", "lbr", "pebs")

新しい仮想マシンのセッティングを終えて perf を実行すると、先ほどは "not supported" と出力された項目も値が出力されるようになりました。

# perf stat ls

 Performance counter stats for 'ls':

              1.27 msec task-clock                #    0.392 CPUs utilized
                 1      context-switches          #    0.789 K/sec
                 0      cpu-migrations            #    0.000 K/sec
               106      page-faults               #    0.084 M/sec
         3,815,440      cycles                    #    3.009 GHz
         2,509,016      instructions              #    0.66  insn per cycle
           505,808      branches                  #  398.841 M/sec
            20,232      branch-misses             #    4.00% of all branches

       0.003231176 seconds time elapsed

       0.000941000 seconds user
       0.001247000 seconds sys