Hyper-V: So vermeiden Sie Performance-Probleme bei VM-Snapshots
Snapshots in Hyper-V können schnell zu Performance-Problemen führen. Wir erklären den Hintergrund und zeigen, wie sich dies vermeiden lässt.
Als ich zum ersten Mal von Snapshots virtueller Maschinen (VM) gehört habe, bin ich intuitiv davon ausgegangen, dass dabei eine vollständige Kopie des aktuellen Zustands der virtuellen Maschine gesichert wird. Weiter dachte ich, dass beim Wiederherstellen von Snapshots genau diese Kopie wiederhergestellt wird und der Server anschließend wieder genauso zur Verfügung steht, wie bei der Erstellung des Snapshots. Nachdem ich inzwischen einige Erfahrung mit Snapshots gesammelt und die Vorgehensweise des Prozesses endlich verstanden habe, muss ich zugeben, dass ich mit dieser Annahme sehr falsch lag. Da es anderen Administratoren wahrscheinlich ähnlich geht möchte ich zeigen, wie Snapshots eigentlich genau funktionieren und wie sich Performance-Probleme vermeiden lassen.
Um vorweg die Namensgebung von Snapshots zu klären: In Windows Server 2012 hat Microsoft die Snapshots noch als Momentaufnahmen (engl. „Checkpoints“) bezeichnet. In Windows Server 2012 R2 wurden die Snapshots dann wieder von Momentaufnahmen zu Snapshots umbenannt. Auch in PowerShell-Befehlen und in System Center Virtual Machine Manager werden teilweise noch verschiedene Begriffe verwendet. Technisch gesehen gibt es aber keinen Unterschied zwischen Snapshots (Prüfpunkte) und Checkpoints (Momentaufnahmen).
Für Hyper-V unter Windows Server 2008 und 2012 empfiehlt Microsoft, Hyper-V-Snapshots nicht in einer Produktionsumgebung zu verwenden, sondern nur in Test-und Entwicklungsszenarien. Das Problem hierbei sind die enormen Auswirkungen von Snapshots auf die Server-Performance. Zwar unterstützen Windows Server 2008/2008 R2 und Windows Server 2012 problemlos Snapshots auch in Produktivumgebungen, allerdings machen virtuelle Server mit Exchange oder SQL-Datenbanken sehr große Probleme, wenn Snapshots erstellt oder verwendet werden um virtuelle Server wiederherzustellen. Vor allem Datenbanken haben große Schwierigkeiten mit Snapshots, das gilt auch für Domänencontroller und deren Active Directory-Datenbank. Seit Windows Server 2012 und aufwärts hat sich zwar nicht viel verändert, trotzdem hat Microsoft aus verschiedenen Gründen auch hier diesen vorsichtigen Ansatz zur Verwendung von Snapshots gewählt.
Der erste Grund, warum Microsoft in produktiven Umgebungen von der Verwendung von Snapshots abrät, ist die Beeinträchtigung der Server-Performance. Snapshots erhöhen deutlich die I/O-Anforderungen von virtuellen Festplatten und den Festplatten des Hyper-V-Hosts. Dieses Problem kann zwar durch die Speicherung von Snapshots auf einer anderen als der virtuellen Festplatte vermindert werden, trotzdem verursachen Snapshots einiges an Overhead auf den virtuellen Servern und dem Hyper-V-Host.
Der zweite Grund liegt im hohen Speicherbedarf von Snapshots, der erst dann wieder frei wird, wenn die VM heruntergefahren wird. Auch das kann, wie wir später noch sehen werden, verheerende Auswirkungen auf die Leistung Ihrer Umgebung haben.
Blick unter die Haube: Technische Details zu Hyper-V Snapshots
Also, was passiert eigentlich, wenn Sie die Option Snapshot auf einer VM in Hyper-V-Manager oder System Center Virtual Machine Manager aufrufen?
Zunächst erstellt Hyper-V einen differenzierenden Datenträger mit der AVHD-Dateierweiterung. Der Speicherort dieser Datei ist in den Einstellungen von virtuellen Servern festgelegt. Eine Änderung ist aber nur dann möglich, wenn noch keine Snapshots für den entsprechenden virtuellen Server erstellt wurden oder keine Snapshots mehr vorhanden sind.
Die Erstellung eines Snapshots beginnt als eine eher kleine Datei (32 MB in meinen Tests), aber im Hintergrund wird die originale Datei für die VM pausiert. Danach wird eine Kopie der Konfigurationsdatei gemacht, die eine XML-Dateierweiterung besitzt. Dadurch wird sichergestellt, dass Änderungen an der Hardware von virtuellen Servern weiterhin möglich sind, aber gleichzeitig auch durch den Snapshot erfasst werden. Der aktuelle Zustand des Storage wird in einer andere Datei mit einer. BIN-Erweiterung gespeichert. Durch dieses Vorgehen wird die Wiederherstellung des Snapshots genauso möglich, wie er zum Zeitpunkt der Erstellung generiert wurde. Die vierte Datei schließlich hat eine VSV-Erweiterung und wird für den Zustand der Geräte verwendet, die der VM zugeordnet sind.
Abgesehen von der Leistung bleibt die VM weiterhin aktiv und wird nicht heruntergefahren. Die Anwender können weiter mit dem virtuellen Server arbeiten, selbst während der Erstellung des Snapshots. Allerdings muss der Hyper-V-Host jetzt damit beginnen, zwischen der virtuellen Festplatte und der AVHD zu jonglieren. Zukünftig sind also beide Festplatten für den Server-Betrieb wichtig, die alte originale Festplatte sowie die neue AVHD-Festplatte.
Wenn zukünftig eine Leseanforderung in der VM notwendig ist wird von Microsoft Hyper-V zunächst geprüft, ob die differenzierende Festplatte die notwendigen Daten gespeichert hat. Wenn die zu lesenden Daten nicht auf der differenzierenden Festplatte gespeichert sind, dann muss der Host die Daten aus der übergeordneten virtuellen Festplatte lesen. Wenn andererseits eine Schreibanforderung auftritt, dann schreibt Hyper-V die Änderung in die AVHD-Datei. Das folgende Beispiel ist sehr einfach: Stellen Sie sich einfach Millionen von 1en und 0en vor. Das klingt zwar sehr naiv, aber genau das wird ja letztendlich auf VMs gespeichert:
0001110001 Original-VHD
_____0____ AVHD-Snapshot 1
Jedes Mal , wenn Datenänderungen auf dem Server auftreten, führt die AVHD eine Aufzeichnung dieser Änderung durch. Wenn Sie gleichzeitig mehrere Hyper-V-Snapshot erstellen kann die Sache dadurch ziemlich schnell chaotisch werden, denn dann bauen die AVHD-Dateien aufeinander auf und verwenden als Basis immer noch die originale VHD-Datei:
0001110001 Original-VHD
_____0____ AVHD-Snapshot 1
_____11___ AVHD-Snapshot 2
_1____0___ AVHD-Snapshot 3
Jeder Snapshot in Hyper-V ist eine separate AVHD-Datei und jede Datei enthält die Änderungen von dem Zeitpunkt an, an dem der entsprechende Snapshot mit der dazugehörigen AVHD-Datei erstellt wurde. Das wird solange durchgeführt, bis entweder der Snapshot gelöscht oder ein neuer Snapshot erstellt wird, denn dann wird die aktuelle AVHD-Datei lesend zur Verfügung gestellt und die neue AVHD-Datei schließlich zur schreibenden Datei gemacht. In dem obigen Beispiel wird, nachdem der zweite Snapshot erstellt wird, der erste Snapshot nur noch gelesen. Nach der Erstellung des dritten Snapshots wiederum wird der zweite nur noch lesend verwendet, genauso wie der zweite Snapshot und die Original-VHD.
Wie Sie sehen können, kann die Festplattennutzung auf diese Weise sehr schnell außer Kontrolle geraten. Dieser Vorgang verschlechtert wiederum deutlich die Server-Performance. Obwohl sich die ursprüngliche Menge an Daten nicht wesentlich verändert hat, wird bis zu 50 Prozent mehr Platz benötigt, um alleine die drei Snapshots zu verwenden. Windows Server-Betriebssysteme haben eine Menge Hintergrundaufgaben zu erledigen, um alle diese kleinen Schreibvorgänge und Veränderungen zu verwalten, und diese Hintergrundaufgaben können sich sehr schnell zu einem enormen Daten-Volumen aufsummieren.
Zudem kann eine einzelne Snapshot-Datei durchaus auch größer werden als die zugrunde liegende originale VHD/VHDX-Datei:
0001110001 Original-VHD
1110001110 AVHD-Snapshot 1
In diesem Beispiel ist jedes Bit der Daten unterschiedlich, damit gibt es keine Möglichkeit, ohne einen weiteren Snapshot mehr Speicherplatz zu nutzen. Dies ist eines der größten Risiken von Hyper-V-Snapshots. Wenn der Festplattenplatz nicht mehr ausreicht, dann werden alle VMs in den Zustand „Kritisch-Angehalten“ versetzt, was natürlich enorme Probleme verursachen kann, vor allem in Produktionsumgebung. Eine angehaltene VM ist für Benutzer genauso wenig erreichbar wie ein defekter Server, zudem lassen sich virtuelle Server erst dann wieder zur Verfügung stellen, wenn wieder genügend Speicherplatz frei ist.
Die Menge an Speicherplatz, die Snapshots benötigen, ist generell schwer einzuschätzen. Die beste Vorgehensweise ist dabei, die Snapshot-Daten auf einer anderen VM als VHD-Datei abzuspeichern. In einem Szenario, in dem ein Snapshot den gesamten verfügbaren Platz dieser VM nutzt, hat das keine Auswirkungen auf andere VMs, da hier schließlich noch genügend Speicherplatz zur Verfügung steht. Problematisch wird es nur dann, wenn Sie auf dem gleichen Laufwerke weitere Snapshot-Daten speichern, da in diesem Fall alle virtuellen Server betroffen sind, deren Daten auf dem entsprechenden Laufwerk gespeichert sind.
Über den folgenden PowerShell-Befehl können Sie ganz einfach überprüfen, ob Snapshots für virtuelle Server auf den Hyper-V-Hosts erstellt wurden:
Get-VM | Get-VMSnapshot
Mit diesem Befehl werden alle Snapshots aufgelistet und Sie können alle Snapshots auf allen Servern des Hyper-V-Hosts erkennen und unnötige Snapshots löschen.
Hyper-V-Snapshots begrenzen und löschen
Wenn Sie entscheiden, dass Snapshots zu riskant für Sie sind, oder wenn Sie Snapshots nur für bestimmte VMs zulassen wollen, dann können Sie den Pfad der Snapshot-Dateien auf einen Pfad ändern, der nicht existiert. Anschließend verhindern Sie über Berechtigungen, dass untergeordnete Administratoren die Einstellungen ändern können. Dadurch können Sie die Erstellung neuer Snapshots in Hyper-V unterbinden. Sie können den Hyper-V-Manager verwenden, um die VM zu markieren, deren Snapshots Sie löschen wollen. Markieren Sie danach die Snapshots, die Sie löschen wollen, und klicken Sie mit der rechten Maustaste auf den Snapshot. Hier können Sie alle Snapshots löschen, die Sie nicht mehr benötigen.
Durch diesen Vorgang werden die Änderungen von der AVHD-Datei auf die originale VHD-Datei gespeichert und die Snapshots gelöscht. Beachten Sie bei diesem Vorgang aber, dass in Windows Server 2008/2008 R2 dieser Vorgang erst beim Herunterfahren des Servers durchgeführt wird. In Windows Server 2012 wird dieses Zusammenführen im laufenden Betrieb durchgeführt.
Beim Exportieren von virtuellen Servern in Windows Server 2012 R2 können Sie jetzt auch Snapshots berücksichtigen. Über das Kontextmenü eines Snapshots können Sie daher einen virtuellen Server mit dem Stand des Snapshots exportieren und auf anderen Servern wieder importieren. Ebenfalls neu ist die Möglichkeit, dass Sie diese Vorgänge im laufenden Betrieb des virtuellen Servers durchführen können. Diese Funktionen gibt es in Windows Server 2012 und abwärts nicht.
Je mehr Snapshots eines Servers Sie also erstellen, umso mehr differenzierende, aufeinander aufbauende Festplatten werden erstellt. Durch diesen Aufbau kann es schnell zu Performance-Problemen kommen. Bewahren Sie Snapshots also nur so lange auf, wie es unbedingt notwendig ist. Löschen Sie einen Snapshot, entfernt Hyper-V auch die erstellten .xml, .vsv- und .bin-Dateien.
Die differenzierenden Festplatten (.avhd(x)) schreibt Hyper-V in Windows Server 2008 R2 aber erst dann in die produktive virtuelle Festplatte (.vhd(x)), wenn Sie den Server einmal ausschalten, nachdem Sie den Snapshot gelöscht haben. In Windows Server 2012/2012 R2 findet dieser Vorgang wieder online statt, der Server muss dazu also nicht neu gestartet werden.
Löschen Sie einen oder mehrere Snapshots eines virtuellen Servers, dann sollten Sie in Windows Server 2008 R2 den Server einmal herunterfahren. Bei diesem Vorgang schreibt Hyper-V die Daten der differenzierenden virtuellen Festplatten in die produktive Festplatte und löscht anschließend die differenzierenden. Erst nach diesem Vorgang steigt die Leistung des virtuellen Servers wieder an. Wenn Sie mehrere Snapshots auf einmal löschen, dann kann das Herunterfahren und Ausschalten eines Servers etwas länger dauern. In Windows Server 2012/2012 R2 ist dieses Vorgehen nicht nötig.