VM Memory Overhead ermitteln

Thomas Franke's picture

Was ist Memory Overhead?

Memory Overhead ist die Menge an zusätzlichem RAM, die ein ESXi-Host für die Verwaltung einer laufenden virtuellen Maschine benötigt. Laut VMware Support ist die Berechnung des Overheads ziemlich komplex - es gibt dafür keine einfache Formel.

Obwohl die Anzahl der vCPUs und der konfigurierte vRAM den größten Einfluss auf den Overhead haben gibt es eine Reihe weiterer Faktoren, etwa die ESXi Build-Version oder das Gast-Betriebssystem.

Im “vSphere Resource Management Guide” für vSphere 5.5 gibt es eine kleine Tabelle mit Beispielwerten. Die maximale Konfiguration in dieser Tabelle ist eine VM mit 8 vCPUs und 16 GB RAM, die einen Memory Overhead von 168,60 MB aufweist.

Warum ist das wichtig?

Vielleicht denken Sie jetzt: “168 MB – das ist nicht wirklich viel, daher brauche ich mir über den Memory Overhead keine Gedanken zu machen.”. Aber Hosts und VMs werden immer größer. Mit vSphere 5.5 kann eine VM über bis zu 64 vCPUs und 1 TB RAM verfügen!

Wenn auf ihren Hosts große VMs laufen oder eine hohe Anzahl an VMs, dann sollten Sie eine Vorstellung von dem benötigten Overhead haben. Das ist besonders dann wichtig, wenn Sie mit großen RAM-Reservierungen arbeiten, was für High Performance Systeme, Terminal- oder Datenbankserver, SAP-Systeme und Ähnliches durchaus üblich ist.

Hier ein Beispiel von einem meiner Kunden:

In einem Cluster mit ESXi 5.1-Hosts mit 192 GB RAM wurde eine Datenbank-VM mit 32 vCPUs und 188 GB RAM eingerichtet. Nachdem die VM gestartet war, wurde der gesamte Speicher mit einer Reservierung versehen. Später wurde festgestellt, dass die VM nach dem Herunterfahren nicht mehr gestartet werden konnte. Auch das Verschieben mit vMotion war nicht möglich, und sogar HA hätte hier nicht mehr funktioniert. Es kam zu Fehlern wie "The host does not have sufficient memory resources to satisfy the reservation.”.

Was war hier das Problem? Naja, die VM erzeugt einen Memory Overhead von 22 GB! Zusammen mit den konfigurierten 188 GB reservierten RAMs sind das bereits 210 GB (zuzüglich bis zu 12 GB RAM für den ESXi). Für die genannten Operationen wurde also mehr physikalischer RAM angefordert als der Host zur Verfügung stellen konnte - und zwar aufgrund des Overhead Memorys!

Als schnellen Workaround haben wir die Memory-Reservierung reduziert. Um das Problem zu lösen mussten wir den konfigurierten Speicher der VM auf 166 GB RAM (all locked) reduzieren.

Wie bestimmt man den Overhead Memory?

Sowohl der vSphere-Client als auch der Web-Client zeigen in der VM-Zusammenfassung einen “Memory Overhead” an. Die schlechte Nachricht ist: es gibt zwei verschiedene Memory Overhead-Werte!

Als Erstes haben wir den maximalen Overhead, den eine VM benötigen könnte. Das ist der Wert, der beispielsweise für die Berechnung eines vMotion-Vorgangs herangezogen wird.

Als Zweites gibt es noch den aktuellen Overhead, also die Menge an Speicher, die aktuell für die Verwaltung der VM genutzt wird.

In dem genannten Beispiel betrug der maximale Overhead 22 GB, der Aktuelle lag jedoch stets deutlich darunter, beispielsweise bei 1,3 GB.

Und welcher Wert wird nun im vSphere-Client angezeigt? Die richtige Antwort ist: das kommt darauf an! Wenn die VM ausgeschaltet ist, wird der maximale Overhead angezeigt. Ist die VM aber eingeschaltet, sehen Sie hier lediglich den aktuellen Overhead.

Die folgenden Screenshots zeigen die gleiche VM, einmal ausgeschaltet (291,10 MB Memory Overhead), und einmal eingeschaltet (84,66 MB Memory Overhead).

Overhead memory VM powered off Overhead memory VM powered on

Den gleichen Wert können Sie natürlich auch per PowerCLI abfragen:

$VM = Get-VM -Name "VM1"
[Math]::Round($VM.ExtensionData.Runtime.MemoryOverhead / 1MB, 2)

Aber wie ermitteln wir jetzt den maximalen Overhead bei einer laufenden Produktions-VM ohne eine Downtime? Wie berechnet man den Gesamt-Overhead eines Hosts, ohne vorher alle VMs auszuschalten?

Das lässt sich über eine Methode des Host-View-Objekts machen:

$VmHost       = Get-View -ViObject (Get-VmHost -Name "192.168.163.10")
$VM           = Get-VM -Name "VM1"
[math]::Round(($VMHost.QueryMemoryOverheadEx($VM.ExtensionData.config) / 1MB), 2)

Report-VmMemoryOverhead.ps1

Ich habe ein kleines Skript geschrieben, mit dem sich ein HTML-Report für alle VMs und Hosts erstellen lässt. Hier ist ein Beispielreport aus meiner Testumgebung:

Overhead memory Report

Das Skript habe ich zu meiner “vSphere-Toolbox” hinzugefügt, einer freien Skriptsammlung zur Verwaltung von VMware vSphere. Die vSphere-Toolbox kann auf meiner Downloadseite heruntergeladen werden.

Add new comment
By submitting this form, you accept the Mollom privacy policy.