Am Dienstag bin ich von einem Kollegen gefragt worden, wie man feststellen kann, ob ein Cluster Shared Volume overcommited ist oder nicht. Die Antwort lautet PowerShell. Aber wie kommt es überhaupt zu einem CSV Overcommitment?
Ein CSV Overcommitment kommt dadurch zustande, dass man dynamische VHDs anstatt VHDs mit einer festen Größe für seine VMs nutzt. In einer produktiven Umgebung dürfte dies bei einem VDI Szenario der Fall sein. Ansonsten eher in einer Testumgebung, da man bei Servern in einer produktiven Umgebung aus Gründen der Performance auf VHDs mit einer festen Größe setzt.
Dynamische VHDs belegen nur den Platz den sie aktuell benötigen, können aber bis zu einer festgelegten Größe anwachsen. Ein einfaches Beispiel macht es schon deutlich was mit einem CSV Overcommitment gemeint ist. Das Cluster Shared Volume hat eine Größe von 2 TB. Darauf befindet sich eine VM mit einer dynamischen VHD. Diese VHD belegt derzeit 120 GB, kann aber bis zu einer Größe von 64 TB anwachsen. Somit besteht schon ein potentielles CSV Overcommitment. Es steht zwar im Regelfall genug freier Speicherplatz zur Verfügung, aber es wird mehr Speicherplatz zur Verfügung gestellt, als im Ernstfall bereitgestellt werden kann. Daher ist es aus meiner Sicht wichtig darüber in Kenntnis zu sein, ob ein potentielles CSV Overcommitment besteht, um im Ernstfall entsprechend reagieren zu können.
Des Weiteren folgen zwei PowerShell Skripte, die für diese Informationbeschaffung genutzt werden können. Das eine Skript bedient sich nur der Hyper-V & Failover Cluster Cmdlets und das Andere nutzt die Failover Cluster sowie die Virtual Machine Manager Cmdlets.
Das Skript gibt dann den Namen der Cluster Disk, den Pfad, die CSV Größe, den freien Speicherplatz des CSVs, den derzeitig belegten Speicherplatz des CSVs, den Status Overcommited, den eigentlich belegten Speicherplatz des CSVs und den Prozentwert des Overcommitment aus. Von den negativen Prozentwerten sollte man sich nicht irritieren lassen. –80% gibt nur an, dass man 80% von einem Overcommitment entfernt ist. Stehen z.B. 20% dort, dann ist das CSV um 20% overcommited.
Aufgrund der Gegebenheiten in der IT habe ich zwei PowerShell Skripte geschrieben, so dass man ohne VMM Umgebung und mit einer VMM Umgebung sich die Informationen beschaffen kann.
1. CSV Overcommitment – kein VMM Environment:
- Lauffähig unter Windows Server 2012 und Windows Server 2012 R2.
- Muss auf einem Hyper-V Node im Cluster ausgeführt werden.
Import-Module FailoverClusters
$CSVArray = @()
$Hosts=Get-ClusterNode
$CSVs = Get-ClusterSharedVolume
foreach($CSV in $CSVs){
$CSVInfo=$CSV|Select -Property Name -ExpandProperty SharedVolumeInfo
$OvercommitSpace=0
$Overcommited=”false”
foreach ($Hoster in $Hosts){
$VMs=Get-VM -ComputerName $Hoster.Name
foreach($VM in $VMs){
$VHDs=Get-VMHardDiskDrive -VM $VM
foreach($VHD in $VHDs){
$Compare=$VHD.Path.Substring(0,25)
if($CSVInfo.FriendlyVolumeName -eq $Compare){
$Harddisk=Get-VHD -ComputerName $Hoster.Name -Path $VHD.Path
$OvercommitSpace = $OvercommitSpace + $Harddisk.Size
}
}
}
}
if($CSVInfo.Partition.Size -le $OvercommitSpace){
$Overcommited = “true”
}
$Info = New-Object PSObject -Property @{
Name=$CSV.Name
Path=$CSVInfo.FriendlyVolumeName
Size=$CSVInfo.Partition.Size
FreeSpace=$CSVInfo.Partition.FreeSpace
UsedSpace=$CSVInfo.Partition.UsedSpace
Overcommited=$Overcommited
Overcommitment=$OvercommitSpace
OvercommitedPercentage=((($OvercommitSpace/1024/1024/1024)/($CSVInfo.Partition.Size/1024/1024/1024))*100)-100
}
$CSVArray += $Info
}
$CSVArray|ft -auto Name,Path,@{Label=”Size(GB)”;Expression={“{0:N2}” -f ($_.Size/1024/1024/1024)}},@{Label=”Free(GB)”;Expression={“{0:N2}” -f ($_.FreeSpace/1024/1024/1024)}},@{Label=”Used(GB)”;Expression={“{0:N2}” -f ($_.UsedSpace/1024/1024/1024)}},Overcommited,@{Label=”Effective Used(GB)”;Expression={“{0:N2}” -f ($_.Overcommitment/1024/1024/1024)}},@{Label=”Overcommited %”;Expression={“{0:N2}” -f ($_.OvercommitedPercentage)}}
2. CSV Overcommitement – VMM Environment:
- Lauffähig unter Windows Server 2012 und Windows Server 2012 R2.
- SC2012 SP1 VMM oder SC2012 R2 VMM Konsole muss installiert sein.
- Kann von einer Workstation oder direkt auf dem VMM Management Server ausgeführt werden.
Import-Module FailoverClusters
Import-Module virtualmachinemanager
$CSVArray=@()
$Cluster=Get-SCVMHostCluster|Out-GridView -PassThru
$Hosts=Get-SCVMHostCluster -Name $Cluster|Get-SCVMHost
$CSVs=Get-ClusterSharedVolume -Cluster $Cluster.Name
foreach ($CSV in $CSVs){
$CSVInfo=$CSV|Select -Property Name -ExpandProperty SharedVolumeInfo
$OvercommitSpace=0
$Overcommited=”false”
foreach($Hoster in $Hosts){
$VMs=Get-SCVirtualMachine -VMHost $Hoster|Where{$_.Location.Substring(0,25) -eq $CSVInfo.FriendlyVolumeName}
foreach($VM in $VMs){
$VHDs=Get-SCVirtualHardDisk -VM $VM
foreach($VHD in $VHDs){
$OvercommitSpace = $OvercommitSpace + $VHD.MaximumSize
}
}
}
if($CSVInfo.Partition.Size -le $OvercommitSpace){
$Overcommited = “true”
}
$Info = New-Object PSObject -Property @{
Name=$CSV.Name
Path=$CSVInfo.FriendlyVolumeName
Size=$CSVInfo.Partition.Size
FreeSpace=$CSVInfo.Partition.FreeSpace
UsedSpace=$CSVInfo.Partition.UsedSpace
Overcommited=$Overcommited
Overcommitment=$OvercommitSpace
OvercommitedPercentage=((($OvercommitSpace/1024/1024/1024)/($CSVInfo.Partition.Size/1024/1024/1024))*100)-100
}
$CSVArray += $Info
}
$CSVArray|ft -auto Name,Path,@{Label=”Size(GB)”;Expression={“{0:N2}” -f ($_.Size/1024/1024/1024)}},@{Label=”Free(GB)”;Expression={“{0:N2}” -f ($_.FreeSpace/1024/1024/1024)}},@{Label=”Used(GB)”;Expression={“{0:N2}” -f ($_.UsedSpace/1024/1024/1024)}},Overcommited,@{Label=”Effective Used(GB)”;Expression={“{0:N2}” -f ($_.Overcommitment/1024/1024/1024)}},@{Label=”Overcommited %”;Expression={“{0:N2}” -f ($_.OvercommitedPercentage)}}