Open Source im professionellen Einsatz
Linux-Magazin 04/2016
© Nelson Hale, 123RF

© Nelson Hale, 123RF

SSD-Caches machen langsamen Platten Beine

Mit Nachbrenner

Flashspeicher ist schnell, dummerweise aber auch teuer, jedenfalls noch. Ein Ausweg ist das Caching mit Flash: So kann eine kleinere und billigere SSD mehrere große Platten zum Fliegen bringen. Das Linux-Magazin hat zwei Lösungen dafür getestet.

1355

Festplatten sind relativ billig und kapazitätsreich, aber langsam – SSDs sind schnell, aber kleiner und teurer. Wer beider Vorteile durch einen SSD-Cache für Festplatten kombiniert, entfaltet eine Art Hebelwirkung: Mit überschaubarem finanziellen Aufwand lässt sich ein großer Performancegewinn erzielen.

Dem kommt entgegen, dass eine Applikation meist nicht alle Daten auf einmal begehrt, der größere Teil ist ihr oft lange Zeit mehr oder weniger egal. Caches nutzen genau das aus: Sie verlagern die gefragtesten Daten auf ein exklusives, schnelles Medium und lassen das Gros der Daten, das nur selten verlangt wird, auf dem billigeren, aber langsamen Hintergrundmedium.

Ein wenig Cache-Theorie

Soll ein Cache wichtige Daten bevorzugt bereitstellen, muss er entscheiden können, was wichtig ist. Dazu dient die so genannte Entscheidungsstrategie des Cache, für die es diverse Modelle gibt. Alle regeln, welche Daten der Cache zugunsten neuer Einträge wieder vergessen soll. Den Rest behält er und liefert ihn automatisch und völlig transparent aus, sobald das Hintergrundmedium danach gefragt wird. Die wichtigsten Entscheidungsstrategien sind:

Fifo (First in, first out): Der Eintrag, der als Erster in den Cache geschrieben wurde, fällt auch zuerst wieder heraus. Nachteilig ist diese Herangehensweise dann, wenn der Cache klein ist. Dann müssen permanent Daten gelöscht werden, um neuen Platz zu machen.

LFU (Least Frequently Used): Was am seltensten nachgefragt ist, wird wieder vergessen. Diese Strategie ist dann effizienter als Fifo, wenn Applikationen bestimmte Einträge tatsächlich deutlich öfter benötigen als andere.

LRU (Least Recently Used): Diese Strategie versucht jene Einträge im Cache zu behalten, die erst vor Kurzem gebraucht wurden, und die ältesten zu entfernen. Bei diesem Verfahren geht es also nicht wie bei LFU um die Zugriffsfrequenz, sondern um den Zugriffszeitpunkt. Diese Technik benutzt in der Regel einige Bits, um sich zu merken, wie alt der jeweilige Eintrag ist. Jeder Treffer im Cache aktualisiert das Alter aller anderen Einträge. Von LRU gibt es etliche Abwandlungen wie Pseudo-LRU (PLRU, braucht nur ein Alters-Bit) oder Segmented LRU (SLRU, arbeitet zusätzlich mit einem geschützten Segment, aus dem der Cache keine Einträge entfernen darf).

MRU (Most Recently Used): Auch das Gegenteil von LRU kann sinnvoll sein, nämlich dann, wenn die Wahrscheinlichkeit, dass auf ein Datum zugegriffen wird, mit seinem Alter steigt. Das passiert zum Beispiel beim sequenziellen Durchmustern eines Datenbestands. Auf ein eben gelesenes Datum kommt der Prozess dabei in nächster Zeit garantiert nicht so schnell zurück. In diesem Fall ist es sinnvoll, die jüngsten Einträge im Cache als erste wieder zu vergessen.

MQ (Multiqueue): Diese Technik verwaltet verschiedene Warteschlangen mit der LRU-Strategie, wobei jede Warteschlange einer bestimmten Zugriffsfrequenz zugeordnet ist. Zusätzlich gibt es einen History-Buffer, der sich die Zugriffshäufigkeiten der zuletzt entfernten Einträge eine gewisse Zeit lang merkt. Eine Abart von MQ ist Stochastic Multiqueue (SMQ).

RR: Random Replacement, das einen zufälligen Eintrag verdrängt.

Applikationsspezifisch: Caching ist nicht nur auf der Ebene von Blockdevices möglich, sondern auch auf dem Applikationslevel. Der Cache erfährt hier zum Beispiel vom Betriebssystem, von einem Hypervisor oder von einer Datenbank, was bereitzuhalten sich lohnt, und kann sich so auf Muster des Anwenderverhaltens einstellen.

Schreibmodi

Neben der Entscheidungsstrategie wählt jeder Cache außerdem noch eine Schreibstrategie. Hier unterscheidet man:

Writethrough: Den zu schreibenden Block legt das System sofort sowohl im Cache wie auch auf dem Hintergrundmedium ab. So bleibt in jedem Fall die Konsistenz gewahrt. Allerdings muss der Prozess beim Schreiben unter Umständen auf das langsamere Medium warten.

Writeback: Der zu schreibende Block gelangt zunächst nicht auf das Hintergrundmedium, sondern nur in den Cache. Auf die langsame Festplatte wandert der Block erst, wenn der Eintrag aus dem Cache verdrängt wird. Diese Strategie vermeidet Wartezeiten, allerdings um den Preis einer temporären Inkonsistenz. Das Medium hinter dem Cache enthält zeitweilig veraltete Daten. Der Cache sollte für diese Strategie unbedingt batteriegepuffert sein, andernfalls führt ein Stromausfall fast zwangsläufig zu Datenverlust und Inkonsistenz.

Wie Flash funktioniert

Die Vorläufer der heutigen Flashspeicher finden sich bereits in den 1970er Jahren. In damaligen Geräten lag Computer-Microcode in ROM-Chips (Read-only Memory). Der größte Nachteil dieser Nur-Lese-Speicher war, dass sie weder gelöscht noch überschrieben werden konnten. Ein Update bestand somit aus dem Auswechseln des Chips.

Um die Prozedur zu vereinfachen, entwickelte man den Erasable Programmable Read-only Memory, kurz EPROM. Er verfügte über ein normalerweise abgeklebtes durchsichtiges Fenster über dem Siliziumchip. Wer das Etikett auf dem Fenster entfernte und den Baustein etwa eine Viertelstunde lang mit UV-Licht bestrahlte, löschte den Chip und konnte ihn neu beschreiben. Das war zwar wesentlich kostengünstiger als ein Wegwerf-ROM, aber auch umständlich.

Die nächste Generation brachte daher eine weitere Verbesserung in Gestalt des Eletrically Erasable Programmable Read-only Memory (EEPROM). Diese Speicherart ließ sich durch Anlegen einer Spannung löschen und wurde genauso wie die Vorgänger zum Speichern kleiner Datenmengen verwendet, die auch ohne Strom erhalten bleiben sollten und sich nicht oft änderten. Diese Speicherbausteine gehörten damit bereits wie heutige Flashspeicher zur Klasse des Non-Volatile Random Access Memory (NVRAM), den nicht-flüchtigen Speichern mit wahlfreiem Zugriff.

Flashspeicher, die auf die EEPROMs folgten, haben eine wesentlich höhere Speicherdichte, verwenden aber dasselbe Prinzip: Sie enthalten für jedes Bit, das zu speichern ist, einen Floating-Gate-Transistor. Das namengebende Floating Gate ist ein elektrisch isolierter Anschluss, auf den eine Spannung aufgebracht werden kann, die dann erhalten bleibt.

Das Vorhandensein der Spannung bewirkt, dass die Source-Drain-Strecke des Transistors in einem hochohmigen Zustand bleibt, das heißt, der Transistor ist nicht-leitend, er sperrt (Abbildung 1). Ohne Spannung auf dem Floating Gate leitet der Transistor stattdessen Strom zwischen Source und Drain. Anhand dieser Beiden Zustände lassen sich die Bits 0 und 1 unterscheiden.

Die eben beschriebene Bauform heißt Single Level Cell (SLC) und gilt als besonders robust und zuverlässig. Sie wird deshalb beispielsweise oft in SSDs der Enterprise-Klasse eingesetzt.

Eine Variante besteht darin, auf das Floating Gate mehrere verschieden hohe Spannungen aufzubringen. Auf diese Weise lassen sich mehr als zwei Zustände (Widerstandswerte) unterscheiden und damit in einer Zelle auch mehr Bits speichern – zwei in Multi Level Cells (MLC) und drei Bits in Triple Level Cells (TLC). An Quadrupel Level Cells wird aktuell geforscht. Der große Vorteil liegt in der höheren Speicherdichte, die jedoch mit einem Tempoverlust und einer höheren Bitfehlerrate erkauft wird, die aufwändige Fehlerkorrekturmechanismen nötig macht.

Eine Konsequenz des Speicherprinzips ist, dass ein Flashspeicher immer erst explizit gelöscht werden muss, bevor er sich neu beschreiben lässt. EEPROMs sind bit- oder wortweise löschbar, Flashspeicher blockweise. Das kann allerdings nicht beliebig oft geschehen, denn jede Schreiboperation verschleißt die Speicherzelle ein wenig. So sind im Durchschnitt nicht mehr als 100000 Schreibvorgänge möglich. SSD-Controller versuchen daher die Schreiboperationen möglichst gleichmäßig über alle Zellen zu verteilen (Wear Levelling). Ein weiterer Nachteil der SSD ist der deutlich höhere Preis im Vergleich zur Festplatte.

Dem stehen allerdings viele Vorteile gegenüber: Flashspeicher sind viel schneller als herkömmliche Festplatten. Den Performancevorteil spielen sie insbesondere bei zufällig verteilten Zugriffen aus, denn die führen bei einer Platte zu ständigen, zeitraubenden Bewegungen des Schreib-Lese-Kopfes. Sie brauchen auch weniger Platz, sie sind mechanisch unempfindlich, sie erwärmen sich weniger und machen keine Geräusche.

In Sachen Kapazität wollen SSDs bald einen Vorsprung gegenüber Festplatten haben: In drei Jahren soll es SSDs mit 128 TByte geben. Dagegen werden Festplatten laut einer Roadmap des Advanced Storage Technology Consortium (ASTC) noch bis zum Jahr 2025 brauchen, ehe sie 100 TByte erreichen.

Abbildung 1: Schematischer Aufbau eines Floating-Gate-Transistors.

Ein weiteres Unterscheidungsmerkmal für Caches besteht darin, wie der Cache seine Einträge adressiert. Man unterscheidet Direct-mapped Caches, bei denen sich die Adresse im Cache direkt aus der Adresse auf dem Hauptspeichermedium ableitet, etwa indem dessen niederwertigste Bits verwendet werden, sowie assoziative Caches, bei denen ein Algorithmus den Speicherort im Cache bestimmt, zum Beispiel über eine Hashfunktion. Das direkte Mapping ist schneller, allerdings können sich zwei Blöcke selbst dann gegenseitig verdrängen, wenn der restliche Cache komplett leer ist. Das assoziative Verfahren ist flexibler, der Rechenaufwand dafür aber höher.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • PostgreSQL-Tuning

    Viele Admins lassen PostgreSQL-Installationen im Auslieferungszustand laufen. Das ist oft ein Fehler, denn die Datenbank bringt viele Stellschrauben mit, um dem Server Beine zu machen. Wer die kennt, spart sich den Griff zum Geldbeutel für neue Hardware und erfreut seine Clients, User und Controller.

  • Linus gibt Kernel 3.10 frei

    Linus Torvalds pflegt wie so oft sein Understatement, als er am Sonntag dem Kernel 3.10 den Final-Stempel aufdrückte. Dabei sind Menge und Qualität der Änderungen gegenüber dem Vorgänger sehr beachtlich. 

  • Red Hat Enterprise Linux 6.6 veröffentlicht

    Red Hat hat Version 6.6 von Red Hat Enterprise Linux (RHEL) für seine Unternehmenskunden veröffentlicht. Die Entwickler haben die Performance verbessert und ein paar neue Features spendiert.

  • NV-DIMM

    Bald wird man sie kaufen können, die Non-Volatile Dual In-line Memory Modules. Elektrisch sind die schnellen Speicher wie RAM angebunden, behalten ihren Inhalt aber über Reboots hinaus. Der Linux-Kernel ist schon fit für die neue Technik und kann sie sogar als Blockgeräte anbieten.

  • Einführung

    Cache it, if you can! – sagt sich Sysadmin Charly Kühnast, wenn die Latenzen seiner Internetverbindung gefühlt länger als die Regentschaft Napoleons dauern. In der heutigen Kolumne stellt er seine Cache-Lösung für die Namensauflösung vor.

comments powered by Disqus

Ausgabe 06/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.