Speicherspartechniken bei modernen Betriebssystemen
20. Juli 2010Einige Hypervisor-basierte Virtualisierungsplattformen arbeiten mit Arbeitsspeicherbereichen, die sie für mehrere Virtuelle Maschinen (VMs) einsetzen. Sind dieselben Speicherseiten von verschiedenen VMs vorhanden, speichert das System auf einem physischen Host (im physischen Arbeitsspeicher) nur einmal und stellt diese Speicherseiten allen VMs zur Verfügung.
Dazu muss das System die einzelnen Arbeitsspeicherseiten genau verfolgen und für jede dieser Seiten einen Hash-Wert erzeugen. Dann sind die Seiten mit demselben Hash-Wert zu nehmen und mit „Bit-für-Bit-Vergleichen“ ist zu bestimmen, ob sie wirklich komplett identisch sind und dann gilt es, diese Seiten in eine einzige physische Kopie zusammenzuführen. Dieser Vorgang kann sehr lange dauern – unter Umständen sogar mehrere Stunden.
Wichtig ist bei dieser Technik, dass nach identischen Speicherseiten gesucht wird. Die Größe der Speicherseiten lag früher bei 4 KByte. Die Vorteile des Findens von 4-KByte-Seiten mit denselben Inhalten über Betriebssysteme hinweg sind recht groß und man spart sich damit sehr viel physischen Speicherplatz.
Doch die gängigen Prozessorfamilien unterstützen schon seit einiger Zeit größere Speicherseiten. Windows Server 2008, Windows Vista und die neueren Windows-Betriebssysteme ebenso wie die modernen Linux-Betriebssysteme arbeiten standardmäßig mit Arbeitsspeicherseiten von 2 MByte. Die Wahrscheinlichkeit, identische Speicherseiten bei einer Größe von 2 MByte zu finden, ist deutlich geringer. Daher verlieren diese Speicherspartechniken ihre Wirkung, wenn moderne Betriebssysteme mit großen Speicherseiten arbeiten.
Es stellt sich aber die Frage, warum die größeren Speicherseiten zum Einsatz kommen. Alle Betriebssysteme arbeiten selbst mit einem virtuellen Adressbereich – sprich die Applikationen bekommen eine logische Sicht auf den Speicher und nicht den wirklichen Speicher. Dazu muss der virtuelle Adressbereich auf den physischen Speicher abgebildet werden. Das wird mit den sogenannten Page Tables (Seitentabellen) gemacht. Sie funktionieren nach dem Prinzip „diese virtuelle Adresse ist in der Realität diese physische Speicherseite“.
Dieses Nachschauen (auch als Lookup bezeichnet) in einer Seitentabelle dauert seine Zeit, daher arbeiten die Systeme mit einem schnellen Zwischenspeicher, dem TLB (Translation Lookaside Buffer). Der TLB wird daher als ein möglichst schneller Cache-Speicher auf dem Prozessor selbst realisiert. Der TLB speichert die Abbildungen von virtuellen Adressbereichen, die zuletzt benutzt wurden. Damit wird der Zugriff auf häufig verwendete Speicherbereiche massiv beschleunigt.
Der TLB arbeitet allerdings mit einer endlichen Größe – dieser Puffer wird ja direkt auf dem CPU-Baustein eingesetzt. Wenn man nun Seitengrößen mit 2 MByte anstelle von 4 KByte verwendet, verringert sich die Anzahl der Speicherseiten, die man abfragen muss, um an die Daten zu kommen. Daher kann man viel öfter aus dem TLB die Informationen für die Seitenabbildung holen – im Fall von 2 MByte versus 4 KByte ergibt sich sogar ein 512facher Wert. Anders ausgedrückt wird 512mal so viel Speicher über den TLB adressierbar, wenn die großen Speicherseiten Verwendung finden. Daraus ergibt sich ein enormer Geschwindigkeitsgewinn beim Zugriff auf Speicherseiten.