[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: KVM - RAM Cache begrenzen & KSM



> Deine erste Mail klang für mich, als ob du dir um das Cache-Verhalten des
> Hostbetriebssystems Sorgen machst.
Hmm nein, das war vielleicht etwas ungeschickt von mir beschrieben.

> Um den RAM Verbrauch der Gäste zu kontrollieren, kannst du den Virtio
> Balloon Driver verwenden.  Der ist bei hinreichend neuen KVM Versionen
> bereits standardmässig aktiv; im Gast muss dazu das Kernelmodul
> virtio_balloon geladen sein.
> 
> Mit Hilfe des Balloon Drivers ist es möglich, das ungenutzte RAM eines
> Gastsystems dynamisch an den Host zurück zu geben. Eine kurze Einführung,
> was man damit machen kann, findet sich hier:
> http://rwmj.wordpress.com/2010/07/17/virtio-balloon/

Danke für den Artikel, aber ich denke Balloning ist nicht ganz das was
ich möchte. Letztendlich erlaubt es ja nur im laufenden Betrieb den RAM
zu vergrößern/verkleinern. Ich kann es ja nochmal in einem Beispiel kurz
beschreiben was ich mir vorstelle.

---

Man hat zum Beispiel ein Host der über 8 Gigabyte RAM verfügt. Auf
diesen lässt man nun 4 Virtuelle Maschienen laufen die jeweils 2
Gigabyte zugeteilt werden.

Jeder der Virtuellen Maschiene braucht im Standardbetrieb zum Beispiel
lediglich 500 MB RAM.

Daher rein theoretisch sind zwar 8 Gigabyte zugewiesen, aber
letztendlich wirklich verbrauch auf dem Host liegt bei nur 2 Gigabyte.
Das System von KVM erlaubt es so auch mehrere Virtuelle Maschienen
laufen zu lassen. Zum Beispiel 6 VMs mit jeweils 2 Gigabyte RAM zugeteilt.

Das ganze ist in diesem sinne natürlich "overcommiten". Wenn jede
Host-Maschiene ihren zugewiesenen RAM zum Maximum ausnutzen würde,
bräuchte man bei 6 Maschienen 12 Gigabyte RAM, obwohl man nur 8 hat.
Daher werden 4 Gigabyte mehr benötigt als man hat. Aber KVM würde hier
in diesem fall den RAM einfach swappen.

Optimal wäre so ein Betrieb nicht. Aber im normalen zustand nutzt ja
nicht jede VM durchgängig den maximalen Speicher. Nur manchmal bei
berechnungen, Cronjobs, Backups etc. erlaubt es das ganze das jede VM
mehr RAM temporär nutzen kann, ohne das eine VM gleich swappen muss.

Nun kommt aber der Cache der VMs ins Spiel. Da Linux Standardmäßig ja
solange cached wie es möglich ist, ist es so das jede VM früher oder
später ihren maximalen Speicher ausnnutzen wird. Zwar kann es sein das
eine VM zwar nur 500 MB nutzt, aber die restlichen 1.5 Gigabyte als
Cache nutzt.

Die Hostmaschiene sieht an der Stelle aber nur eine VM die die vollen 2
Gigabyte RAM beansprucht und muss diese auch einer VM zuteilen.
Letztendlich macht das aggressive Cachen von Linux in meinen augen der
ganze Vorteil durch KVM und dem Overcommitten kaputt.

Letztendlich wenn man 6 VMs laufen lässt die eigentlich nur 500 MB RAM
benötigen. Also rund 3 Gigabyte wird der komplette restliche Speicher in
diesem Fall dann ganze 9 gigabyte durch caches der VMs genutzt. Und an
dieser stelle muss das Host System nunmal definitiv rund 4 Gigabyte
swappen. Die Maschienen bremsen sich also definitiv aus.

Wenn man nun aber den Cache begrenzen könnte sagen wir auf 500 MB, so
würde im normalen betrieb eine VM 500MB + 500MB Cache nutzen. Rund also
1 Gigabyte an Speicher. Bei 6 VMs bräuchte man dann rund 6 Gigabyte RAM,
die immer noch vollständig im RAM des Host Systems passen ohne das das
Host System swappen muss.

Und trotzdem würde das system noch erlauben das 2 Hosts temporär die
vollständigen 2 Gigabyte nutzen können, ohne das der Host etwas swappen
muss.

Dadurch das aber der Cache "unendlich" anwächst, verbraucht irgendwann
aber jede VM ihren maximal zugewiesenen Speicher was die Hostmaschiene
dazu zwingt bereits für den Cache zu swappen, und eben erlaubt das
wichtige Speicherbereiche bereits aus dem langsamen SWAP bereich
geliefert werden.

Letztendlich macht der Cache für mich den ganze Vorteil des
Overcommitens von KVM zunichte. Okay durch KSM wird ebenfalls noch RAM
"eingespart", trotzdem zwingt man die Hostmaschiene relativ früh zu
swappen obwohl die eigentlich VMs nur wenig Speicher benötigen.

Aber anscheint, scheint es wirklich keine Möglichkeit zu geben den Cache
zu begrenzen. Was man machen kann ist wohl den Cache von Zeit zu Zeit zu
"droppen". Wobei das auch ungewünscht ist. Der Cache ist ja schon
gewollt aus Performance Gründen, nur eben nicht in unbegrenzter Höhe.

Ich hoffe die "Problematik" oder das anliegen ist so ersichtlicher.


Reply to: