我如何找出哪个VM负责Hyper-V的大部分I / O?
情况:我确实有带有多个VM的Hyper-V主机(每个主机约30个),偶尔会看到长时间的高磁盘利用率。我想知道是哪个VM引起了这个问题。
我尝试使用Process Explorer,但是它报告了所有与Hyper-V相关的I / O都由“系统”进程处理,因此没有帮助:
按访问的文件进行分类已经很有帮助。Windows Server的完整GUI安装具有提供此信息的资源监视器。但是,Resmon在Core和Hyper-V安装中似乎不可用。
我如何找出哪个VM负责Hyper-V的大部分I / O?
情况:我确实有带有多个VM的Hyper-V主机(每个主机约30个),偶尔会看到长时间的高磁盘利用率。我想知道是哪个VM引起了这个问题。
我尝试使用Process Explorer,但是它报告了所有与Hyper-V相关的I / O都由“系统”进程处理,因此没有帮助:
按访问的文件进行分类已经很有帮助。Windows Server的完整GUI安装具有提供此信息的资源监视器。但是,Resmon在Core和Hyper-V安装中似乎不可用。
Answers:
在本地工作站上打开Performance Monitor(以Admin身份运行)。添加计数器,从hyper-v计算机,Hyper-V虚拟IDE控制器或Hyper-V虚拟存储设备中选择计数器,并根据需要选择计数器和实例(VM)。您可能需要四处钓鱼才能找到最适合您的柜台。
关于在监视Hyper-V性能中要寻找哪些计数器有一些很好的提示
Syneticon-dj,今天下午我为您写了一些东西。我认为这个问题很有趣,因此此简单脚本将为您提供Hyper-V主机上每个正在运行的VM上的读写IO统计信息。另外,它还将每个VM与其vmwp.exe的进程ID关联。
您可以在Hyper-V服务器上运行此程序,因为它不需要GUI。
不利的一面是,当我在进行此操作时,我注意到性能计数器在一段时间内运行良好,然后出于无可辩驳的原因,它们决定全部保持为零。好吧,也许不是像Chris 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); }
}
}
}
其他两个答案都很有用。但是我发现,通过打开“资源监视器”并查看“磁盘”选项卡,可以轻松地找到所需的内容(当VHD存储在本地或本地共享磁盘而不是文件服务器上时)。查看“磁盘活动”,然后按“总计(B /秒)”排序。您会看到按活动顺序列出的VHD。
显然,我的策略是对您本地登录的计算机进行宽松的近似处理,这使其在大型无头环境中的用处不大。
我编写了一个PowerShell GUI工具,以收集在选定的Hyper-V主机上找到的所有VM的来宾性能数据。数据收集和匹配是通过get-counter和Hyper-V WMI信息完成的。从任何成员服务器运行,不需要任何模块。我希望这将有助于快速排除Hyper-V主机和VM上的性能问题。
显示Hyper-V虚拟机来宾性能统计信息(PowerShell) https://gallery.technet.microsoft.com/Show-Hyper-V-Virtual-652fdd54
您可能想尝试一个第三方工具,该工具可以帮助检测引起高I / O的虚拟机,并且还能够对如此高的I / O发出警报。您可以在此处进行检查-ApexSQL VM Monitor。
此工具可以监视主机和虚拟机的磁盘计数器的大量数据,并且可以在预定义计数器旁边进行设置,以监视和显示来自性能监视器的计数器的图形表示。
希望我能帮上忙。