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