Syneticon-dj, я написав щось для вас сьогодні вдень. Я подумав, що ця проблема цікава, тому цей простий скрипт дасть вам змогу читати та записувати IO статистику для кожного запущеного VM на хості Hyper-V. Як додатковий бонус, він пов’язує кожен VM з ідентифікатором процесу vmwp.exe.
Ви можете запустити це на своєму сервері Hyper-V, оскільки йому не потрібен графічний інтерфейс.
Мінус полягає в тому, що, працюючи над цим, я помітив, що лічильники продуктивності працювали чудово протягом певного часу, а потім без жодної помітної причини вирішили все залишитися на нулі. Ну, можливо, це не помилка, як каже Кріс С. ... але ці лічильники, на жаль, не можуть бути дуже корисними. Незалежно від цього, було б дуже легко змінити сценарій, щоб використовувати 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); }
}
}
}