Synopsis
Dans une infrastructure VMware, il est utile de savoir le ratio d’Overcommitting du CPU et de la RAM, de base il n’y a pas de moyen rapide de le savoir (Sans compter ESXTOP). C’est là que PowerCLI entre en jeu, grâce à un petit script je vais vous fournir le moyen de le vérifier.
Tout d’abord qu’est-ce que l’Overcommitting, en faisant simple c’est le fait d’utiliser des ressources en excès, assigner plus de vCPU ou de RAM aux machines virtuelles que l’ESXi n’en possède, on dit alors qu’il y a Contention.
Je vous invite à en apprendre un peu plus via les post sur la gestion de CPU/RAM :
VMware – Les mécanismes de gestion du CPU
VMware – Les mécanismes de gestion de la RAM
Explication
Je vais prendre comme exemple un Cluster de deux ESXi, si on parle en pourcentage on ne dépasse pas les 100%, on peut ainsi se dire qu’il n’y a pas de contention … et bien non, il ne faut pas confondre pourcentage d’utilisation et contention.
RAM
Si j’utilise le script d’overcommit RAM, je me retrouve avec environ 1:1, c’est-à-dire que toute la RAM physique de mes ESXi est assignée (Granted). Dans cette logique on devrait être à 100% d’utilisation, mais non car la RAM n’est pas utilisée (Consumed), tout ça grâce aux différents mécanismes VMware qui permettent de récupérer de la RAM et donc de permettre cet overcomitting.
Pas de problème pour la RAM, on peut charger et mettre sous contention en monitorant bien sûr pour n’utiliser que TPS voir le Balooning et éviter le Swapping entre autre.
Host RAM / VM RAM
CPU
Maintenant si j’utilise le script d’overcommit CPU, c’est une autre histoire … les CPU ne sont pas non plus à 100%, mais on se retrouve avec un ratio de contention de 5:1, les VM utilisent donc 5 fois plus de vCPU qu’il n’y a de pCPU.
Avec ce niveau de contention, attendez-vous à avoir de graves problèmes de performance, le scheduler se retrouvera noyé sous les demandes de pCPU et vous aurez du CPU Ready à coup sûr…
CPU Hardware / CPU Virtuel
Au final il faut se dire qu’on ne manage pas une infrastructure VMware comme un PC, je ne dis pas que le pourcentage d’utilisation ne sert à rien mais qu’il ne faut pas seulement se fier à cette valeur, d’ailleurs si vous commencez à monter à 50% d’utilisation CPU, vérifier votre contention et la charge de vos VM (Esxtop sera votre ami…)
Script CPU (OneLiner)
ForEach($clustername in Get-Cluster){write-host;write-host $clustername -ForegroundColor Yellow;$vmhosts=Get-Cluster $clustername|Get-VMHost;$vms=Get-Cluster $clustername|Get-VM|where {$_.PowerState -eq "PoweredOn"};$Output=@();$Output1=@();$totalvcpus=0;$totalhostthreads=0;$totalratio=0;ForEach($vmhost in $vmhosts){$vcpus=0;$ratio=$null;$ht=$vmhost.HyperThreadingActive;if($ht -eq "True"){$Multiple="0.75"}else{$Multiple="1"};$hostthreads=$vmhost.extensiondata.hardware.cpuinfo.numcputhreads*$Multiple;$vms|Where-Object{$_.vmhost -like $vmhost}|ForEach{$vcpus+=$_.numcpu};if($vcpus -ne "0"){$ratio= "{0:N1}" -f ($vcpus/$hostthreads)};$hvalue=New-Object psobject;$hvalue|Add-Member -MemberType Noteproperty "Hostname" -value $vmhost.name;$hvalue|Add-Member -MemberType Noteproperty "pCPU" -Value $hostthreads;$hvalue|Add-Member -MemberType Noteproperty "vCPU" -Value $vcpus;$hvalue|Add-Member -MemberType Noteproperty "Ratio" -Value $ratio;$Output+=$hvalue;$totalhostthreads += $hostthreads;$totalvcpus += $vcpus;$totalratio="{0:N1}" -f ($totalvcpus/$totalhostthreads)};$cvalue=New-Object psobject;$cvalue|Add-Member -MemberType Noteproperty "Hostname" -value "Cluster";$cvalue|Add-Member -MemberType Noteproperty "pCPU" -Value $totalhostthreads;$cvalue|Add-Member -MemberType Noteproperty "vCPUs" -Value $totalvcpus;$cvalue|Add-Member -MemberType Noteproperty "Ratio" -Value $totalratio;$Output1 += $cvalue;$Output|ft -autosize;$Output1|ft -autosize}
Script RAM (OneLiner)
$getcluster=Get-Cluster;ForEach($clustername in $getcluster){ write-host;write-host $clustername -ForegroundColor Yellow;$vmhosts=Get-Cluster $clustername|Get-VMHost;$Output=@();$Output1=@();$totalhostram=0;$totalvram=0;$totalratio=0;ForEach ($vmhost in $vmhosts){$ratio=$null;$hostvram=0;$vms = Get-Cluster $clustername | Get-VMHost $vmhost | Get-VM | where {$_.PowerState -eq "PoweredOn"};ForEach ($vm in $vms){$vram=0;$vram = $vm.MemoryGB;$hostvram += $vram};$totalvram += $hostvram;$hostram="{0:N0}" -f ($vmhost.memorytotalGB);$ratio = "{0:N1}" -f ($hostvram/$hostram);$hvalue= New-Object psobject;$hvalue| Add-Member -MemberType Noteproperty "Hostname" -value $vmhost.name;$hvalue| Add-Member -MemberType Noteproperty "hRAM" -Value $hostram;$hvalue| Add-Member -MemberType Noteproperty "vRAM" -Value $hostvram;$hvalue| Add-Member -MemberType Noteproperty "Ratio" -Value $ratio;$Output+=$hvalue;$totalhostram += $hostram};$totalratio = "{0:N1}" -f ($totalvram/$totalhostram);$cvalue= New-Object psobject;$cvalue| Add-Member -MemberType Noteproperty "Hostname" -value "Cluster";$cvalue| Add-Member -MemberType Noteproperty "hRAM" -Value $totalhostram;$cvalue| Add-Member -MemberType Noteproperty "vRam" -Value $totalvram;$cvalue| Add-Member -MemberType Noteproperty "Ratio" -Value $totalratio;$Output1+=$cvalue;$Output|ft -autosize;$Output1|ft –autosize}