盡管任何硬件資源都有可能成為影響虛擬機性能的瓶頸,但存儲IOPS往往是限制因素之一。因為存儲IOPS往往供不應求,所以虛擬化廠商提供了允許管理員限制虛擬機存儲I/O消耗的功能。然而高效率地使用上述功能的關鍵是了解存儲IOPS當前是如何在虛擬機之間分配的。
每個hypervisor廠商都有各自的測量并分配存儲IOPS的方式。以微軟Hyper-V為例,調節存儲IOPS消耗的主要機制借助于QoS管理功能,該功能往往被稱為存儲QoS。
使用QoS管理
QoS管理設置基于單塊虛擬硬盤。如圖A所示,該功能可以被用于限制虛擬機消耗更少的存儲IOPS。作為一個替代方案,QoS管理可以被用于為虛擬機預留存儲IOPS,這樣就可以保證虛擬機能夠獲得的最小IOPS值——如果有更多可用的IOPS,那么虛擬機能夠使用的IOPS將相應增加。
圖A. 虛擬硬盤QoS管理配置界面
QoS管理功能允許管理員基于單塊虛擬硬盤預留存儲IOPS或者對其進行限制。
盡管QoS管理功能很便利,但只有管理員知道可用的存儲IOPS有多少以及當前使用情況時,該功能才能夠派上用場。不幸的是,Hyper-V Manager并沒有提供該信息,但可以使用PowerShell檢索與Hyper-V相關的存儲性能信息。
虛擬機指標追蹤
PowerShell提供了一個名為Measure-VM的cmdlet,使你能夠追蹤各類虛擬機指標。在能夠使用該cmdlet前,需要啟用虛擬機的資源消耗計量。輸入如下命令可以啟用運行在當前Hyper-V服務器上所有虛擬機的資源消耗計量:Get-VM | Enable-VMResourceMetering
輸入如下命令可以確認是否已經啟用了虛擬機的資源消耗計量:
Get-VM | Select-Object Name, ResourceMeteringEnabled
啟用虛擬機的資源消耗計量并且生成了一些計量數據后,你可以使用Measure-VM cmdlet顯示虛擬機的資源使用情況。例如,如果你想針對所有虛擬機使用默認的資源計量數據,可以輸入如下命令:
Get-VM | Measure-VM
圖B顯示了啟用虛擬機計量、確認虛擬機計量以及用以及顯示默認計量數據的過程。
圖B:你可以使用Measure-VM cmdlet顯示虛擬機計量數據
如上圖所示,資源計量機制運轉良好,顯示值為零表明虛擬機未啟動。然而問題是并沒有顯示與存儲IOPS相關的信息。
顯示IOPS數據
盡管Measure-VM cmdlet默認沒有顯示存儲IOPS數據,但可以做到。實際上,cmdlet可以顯示每臺虛擬機的IOPS平均值、平均延遲情況、磁盤數據寫入以及磁盤數據讀取情況。
只需要在Measure-VM cmdlet后追加 Select-Object參數就可以顯示上述數據,然后指定你想顯示的指標即可。然而,務必牢記在生產環境中虛擬機往往位于使用共享存儲的故障切換集群中。因此全面獲取IOPS數據的唯一方式是查看所有服務器上的所有虛擬機。可以嘗試利用如下命令創建一個簡單的腳本:
$Servers = "Hyper-V-4", "Prod1"
ForEach ($Server in $Servers){
$VMs = Get-VM
ForEach ($VM in $VMs){
$VM | Measure-VM | Select-Object VMName, ComputerName, AggregatedAverageNormalizedIOPS, AggregatedAverageLatency, AggregatedDiskDataRead, AggregatedDiskDataWritten | Format-List
}
}
腳本的第一行列出了將要被監控的每臺Hyper-V主機的名字。簡單起見,這里只列出了兩臺服務器,但你通常要輸入所有Hyper-V服務器的名字。該腳本使用循環檢查所有的服務器,每次檢查一臺。然后嵌套循環檢索并顯示當前服務器上所有虛擬機的性能數據。你可以看到圖C中腳本的部分輸出結果。腳本列出了每臺虛擬機的性能數據、虛擬機名以及虛擬機當前所在的主機服務器。
圖C. 腳本顯示虛擬機的存儲性能數據
Hypervisor功能,比如QoS管理有助于分配存儲IOPS。然而為了高效率地使用該功能,你需要知道IOPS目前的使用情況。