确定 Hyper-V 主机上执行 I/O 的虚拟机

确定 Hyper-V 主机上执行 I/O 的虚拟机

如何找出哪个虚拟机负责 Hyper-V 中的大部分 I/OI?

情况:我确实有 Hyper-V 主机,其中有许多虚拟机(每个主机大约 30 个),我偶尔会看到长时间的高磁盘利用率。我想知道哪个虚拟机导致了这种情况。

我尝试使用 Process Explorer,但它报告所有 Hyper-V 相关的 I/O 都由“系统”进程处理,因此没有帮助:

进程探索器

按访问的文件进行细分已经很有帮助了。Windows Server 的完整 GUI 安装具有资源监控提供此信息。但是,Resmon 似乎在 Core 和 Hyper-V 安装中不可用。

答案1

在本地工作站上打开性能监视器(以管理员身份运行)。添加计数器,从 hyper-v 计算机、Hyper-V 虚拟 IDE 控制器或 Hyper-V 虚拟存储设备中选择计数器,根据需要选择计数器和实例(VM)。您可能需要四处寻找才能找到对您最有意义的计数器。

有一些很好的提示,可以告诉你应该寻找哪些计数器监控 Hyper-V 性能

答案2

Syneticon-dj,我今天下午为你写了一些东西。我觉得这个问题很有趣,所以这个简单的脚本将为你提供 Hyper-V 主机上每个正在运行的虚拟机的读写 IO 统计数据。作为额外的好处,它将每个虚拟机与其 vmwp.exe 的进程 ID 关联起来。

您可以在 Hyper-V 服务器上运行它,因为它不需要 GUI。

缺点是,在我处理这个问题时,我注意到性能计数器在一段时间内运行良好,然后不知何故它们全部停留在零上。好吧,也许这不是一个错误,就像 Chris S 说的……但不幸的是,这些计数器可能毕竟不是很有用。无论如何,修改脚本以使用 Virt. Storage Device 计数器将非常容易。

输出如下所示:

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.
    [email protected]
#>
    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); }
        }

    }
}

答案3

其他两个答案都很有用。但我发现,通过打开“资源监视器”并查看“磁盘”选项卡,我可以更轻松地找到您要查找的内容(当 VHD 存储在本地或本地共享磁盘而不是文件服务器上时)。查看“磁盘活动”并按“总计(B/秒)”排序。您将看到按活动顺序列出的 VHD。

显然,我的策略是对您本地登录的机器进行松散的近似,这使得它在大型无头环境中不太有用。

答案4

您可能想尝试第三方工具,它可以帮助检测导致高 I/O 的虚拟机,并且还能够对此类高 I/O 发出警报。您可以在此处查看 -ApexSQL VM 监控器

该工具可以监控主机和虚拟机的大量磁盘计数器,除了预定义的计数器外,还可以设置为监控并显示性能监视器中计数器的图形表示。

希望我能帮上忙。

相关内容