Syneticon-dj、今日の午後に何か書いた。この問題はおもしろいと思ったので、この簡単なスクリプトは、Hyper-Vホスト上で実行されている各VMの読み取りおよび書き込みIO統計を提供します。追加のボーナスとして、各VMをvmwp.exeのプロセスIDに関連付けます。
GUIを必要としないため、Hyper-Vサーバーでこれを実行できます。
欠点は、これに取り組んでいる間、パフォーマンスカウンターがしばらくの間うまく機能していることに気づいたことです。おそらく、クリスSが言ったように、バグではないかもしれませんが、残念ながら、これらのカウンターは残念ながらあまり有用ではないかもしれません。とにかく、Virtを使用するようにスクリプトを変更するのは非常に簡単です。代わりにストレージデバイスカウンター。
出力は次のようになります。
PID VMName ReadBytesPerSec WriteBytesPerSec
--- ------ --------------- ----------------
5108 DC02 483.90 0
2796 DC01 0 0
3348 ECA01 4782668.27 0
#Requires -Version 3
function Get-VMPidAndIO
{
<#
.SYNOPSIS
Gets the Process ID and I/O statistics of each virtual machine running on the Hyper-V host.
.DESCRIPTION
Gets the Process ID and I/O statistics of each virtual machine running on the Hyper-V host.
Currently only works for VMs using virtual IDE controllers.
Requires Powershell 3 at a minimum.
.LINK
http://myotherpcisacloud.com
.NOTES
Written by Ryan Ries, June 2013.
ryan@myotherpcisacloud.com
#>
BEGIN
{
Try
{
$VMProcesses = Get-CimInstance -Query "Select ProcessId,CommandLine From Win32_Process Where Name ='vmwp.exe'" -ErrorAction Stop
}
Catch
{
Write-Error $_.Exception.Message
Return
}
}
PROCESS
{
}
END
{
Foreach($_ In $VMProcesses)
{
$VMName = $((Get-VM | Where Id -EQ $_.CommandLine.Split(' ')[-1]).Name)
[PSCustomObject]@{PID=$_.ProcessId;
VMName=$VMName;
ReadBytesPerSec=[Math]::Round($(Get-Counter "\Hyper-V Virtual IDE Controller (Emulated)($VMName`:Ide Controller)\Read Bytes/sec").CounterSamples.CookedValue, 2);
WriteBytesPerSec=[Math]::Round($(Get-Counter "\Hyper-V Virtual IDE Controller (Emulated)($VMName`:Ide Controller)\Write Bytes/sec").CounterSamples.CookedValue, 2); }
}
}
}