[linux-l] Timingprobleme in virtuellen Maschinen [WAR: Desktop Virtualisierung]

Lutz Willek lutz.willek at belug.de
Fr Nov 30 10:30:25 CET 2012


Hallo,

und Danke Peter für die treffende Beschreibung und der Hintergründe des 
Problems timekeeping in virtuellen Umgebungen. Ich möchte anmerken, dass 
dieses Problem jede Art von Virtualisierung betrifft, egal ob KVM, XEN, 
VMware oder andere.

Was folgt ist ein Erfahrungsbericht und Lösungen für VMware. Mit der 
Bitte an Euch, Eure Informationen zu teilen, wenn Ihr Lösungsansätze für 
andere Virtualisierungsumgebungen kennt. Insbesondere interessieren mich 
persönlich Erfahrungen zu KVM und XEN, da ich noch keine größeren 
Umgebungen (mehr als 100 VMs) damit betrieben habe.

Wir betreuen viele virtuelle Maschinen, einen bunten Strauß aller großen 
Betriebssysteme. Dabei war nicht so sehr die Separation einzelner 
Systeme, sondern die einheitliche Hardwareumgebung und damit leichtere 
Wartbarkeit entscheidend für den Schritt hin zur Virtualisierung. Wegen 
der Möglichkeit der Implementierung von Hochverfügbarkeit auf 
Virtualisierungsebene, bei gleichzeitig möglichst hoher Auslastung des 
einzelnen Hosts, und ganz wichtig den Managementfunktionen, wurde und 
wird auf einem VMware ESX Cluster virtualisiert. Andere 
Virtualisierungslösungen boten zum Zeitpunkt der Entscheidung für VMware 
nicht alle nötigen Features. (Das ist heute teilweise anders)
Wir konnten im Vergleich zu vorher den Einsatz von Hardware um mehr als 
80% verringern und gleichzeitig eine bessere Gesamtperformance und 
Gesamtverfügbarkeit erreichen: Für uns wurde das Ziel erreicht.

Die von Peter angesprochenen Zeitprobleme traten schon im Testbetrieb 
auf und führten normalerweise nur zu subtilen Fehlern, teilweise aber 
auch zum totalen Versagen von Diensten. Besonders betroffen waren 
Dienste, die Zeitauflösungen von unter 100 ms benötigen, also 
Datenbanken, LDAP, AD oder HA-Lösungen, die über Netzwerk miteinander 
kommunizieren. Vorweg: Inzwischen laufen diese Dienste alle stabil in 
der virtuellen Umgebung, auch wenn hochgenaue Zeitauflösung von unter 1 
ms zwischen den einzelnen Diensten gefordert wird.

Der erste Lösungsansatz war, den Zeitgeber des physikalischen Hosts zu 
benutzen und diesen an die virtuellen Maschinen zu koppeln. Außer bei 
Livemigrationen zwischen Hosts war so zurückkaufen der Zeit innerhalb 
von virtuellen Maschinen verschwunden. Auch das langsame zurückdriften 
der VM-Zeit im Vergleich zur Realzeit war damit gelöst. Dafür hatten wir 
nun massiv Zeitsprünge innerhalb der VMs: die Zeit verlief nicht mehr 
linear. Normalerweise nur wenige ms, im Extrem haben wir einmal 27 
Sekunden "verlorene" Zeit festgestellt: Die Anwendungen kamen damit 
überhaupt nicht klar. Dieser Ansatz für sich allein war also schlecht 
und wurde schnell wieder verworfen. (BTW: Für Desktopvirtualisierung ist 
das heute noch brauchbar und auch gängige Lösung!)

Der nächste Ansatz war zusätzlich ein spezieller (vmi-)Kernel, der in 
der Lage war, innerhalb der VM die entstandenen Zeitsprünge zu "stauchen 
und zu dehnen": Damit verlief die Zeit innerhalb einer VM quasilinear. 
Nur auf eine Maschine beschränkte Anwendungen waren damit schon sehr 
glücklich. (Beispielsweise Webserver und dazugehörende Datenbank auf dem 
gleichen System) Der Nachteil: Die Zeit verlief nun zwischen den 
virtuellen Maschinen nicht mehr linear, sondern schwankte im Extrem 
relativ zu anderen VM's um bis zu einige Minuten vor/rückwärts. Das war 
natürlich Gift für beispielsweise Datenbankreplikationen oder 
Authentifizierungen (ldap/Kerberos: seeehr lustige Effekte!). Außerdem 
waren diese speziellen Kernel nicht für jedes Betriebssystem verfügbar. 
Außer für Spezialfälle wurde das schnell nicht mehr eingesetzt, heute 
gar nicht mehr.

Der nächste Ansatz waren spezielle Bootparameter, die den Kernel darauf 
vorbereiteten keine genaue Hardwareuhr zu haben, oder diese schlicht zu 
ignorieren. Gleichzeitig wurde die Bindung an den Zeitgeber des Hosts 
wieder gelöst. Die genauen Bootparameter sind abhängig von der 
eingesetzten Distribution und Kernelversion, wenn man danach sucht 
findet man auch 1000 verschiedene Angaben im Netz. Relevant für uns 
waren und sind die Empfehlungen im VMware KB 1006427 "Timekeeping best 
practices for Linux guests", danach sollte man sich dann auch richten. 
Dies brachte erstmals brauchbare Resultate. Sinngemäß: Je neuer der 
eingesetzte Kernel, um so weniger muss man beachten, umso genauere 
Resultate werden erzielt. Gerade bei p2v älterer Systeme lohnt also der 
Blick in diesen KB-Artikel.

Der entscheidende Durchbruch war dann ein speziell konfigurierter ntpd 
auf jeder virtuellen Maschine, der die Hardwareuhr ignoriert und 
schneller als normalerweise, entstehende Zeitungenauigkeiten ausgleicht. 
Damit erreichen wir eine lineare Zeit innerhalb der VM und eine 
quasilineare Zeit relativ zu anderen VMs, ausreichend für bisher alle 
Anwendungsfälle. Die prinzipielle Konfiguration des ntpd wird inzwischen 
auch im KB-Artikel 1006427 beschrieben, wir benutzen diese Konfiguration 
mit nur kleineren sitespezifischen Modifikationen seit etwa 2009. 
(Sinngemäß setzen wir das auch ein, wenn wir bspw. mit KVM virtualisieren)

Zusammengefasst lässt sich sagen, dass wir seit Anfang 2010 keine 
relevanten Zeitprobleme mehr innerhalb von virtuellen Maschinen haben. 
Soweit mal meine 2 ct. dazu, ich hoffe das hilft dem einen oder anderen 
etwas.

Nochmal die Bitte: Vergleichbare Erfahrungen mit XEN oder KVM 
interessieren mich sehr, bitte schreibt etwas dazu wenn Ihr solche 
Systeme betreibt und und ähnliche Probleme habt, und wie die 
Lösungsansätze dort aussehen.


Freundliche Grüße / Best Regards

         Lutz Willek

Am 29.11.2012 23:53, schrieb Peter Ross:
> [...]
> Es kann bei ordentlicher Last Timer-Probleme geben, die zu
> Performanceverlusten führen. Die sind ärgerlich und schwer zu finden...
>
> In Server-Umgebungen können die einen schon wahnsinnig machen, da sie
> sporadisch auftreten - und zu "verlorener Zeit" führen.
>
> Es gibt halt nur einen Hardware-Zeitgeber, der der Maschine "den Takt"
> gibt. Das ist ein hochpriorisierter Hardwareinterupt, der dann den
> laufenden Kernel unterbricht und den Kernel "antreibt".
>
> In einer Virtuellen Maschine wird der Taktgeber halt auch virtualisiert,
> kann aber natürlich nicht durch einen echten Hardware-Timer getrieben
> werden. Also ist es Software, und der Interruipt kann "verloren" gehen,
> wenn die Maschine gerade was besseres zu tun hat.
>
> Dann verliert die Virtuelle Maschine an Zeit und lastet die zugewiesenen
> Resourcen nicht ordentlich aus. Innerhalb der Maschine sieht man das gar
> nicht - da die Maschine gar nichts über die "verlorene Zeit" weiß, und
> so top z.B. eine "ordentliche Performance" vorgaukelt.
>
> Die verlorenen "Ticks" treten sporadisch auf, unter Last, sind von der
> Art der Last abhängig und in einer Testumgebung selten zu finden. Nur,
> wenn es "ernst" wird - z.B. tausende Leute gleichzeitig auf einen
> Webserver zugreifen, und jeder gerade was anderes macht.
>
> So kann sich das System ziemlich klebrig anfühlen. Ich habe knapp zwei
> Jahre einen VMWare-getriebene Umgebung, die immer wieder unter dem
> Problem litt, betrieben, und war wirklich froh, als ich da weg war...
>
> Es grüßt
> Peter



Mehr Informationen über die Mailingliste linux-l