Was ist die Herausforderung bei SSDs?

SSDs haben aufgrund ihrer Architektur das Problem, dass sie durch häufige Schreibvorgänge mit der Zeit langsamer werden. Das liegt daran, dass beim Löschen Speicherbereiche als gelöscht markiert werden, die Daten aber zunächst erhalten bleiben. Wenn nun Daten auf diese freigegebenen Bereiche geschrieben werden sollen, müssen diese erst tatsächlich geleert werden, um dann neue Daten zu erhalten; und dieser Vorgang kostet Zeit. Im Detail kannst Du das hier nachlesen: Warum das so ist, kannst Du wunderbar in diesem Blog-Artikel nachlesen: From write() down to the flash chips

Um diesem Problem entgegen zu wirken, wurde der TRIM-Befehl entwickelt. Dieser sorgt dafür, dass als gelöscht markierte Bereiche wieder freigegeben werden, sobald die Auslastung der SSD mit Lese- und Schreibvorgänge dies erlaubt.

Die Herausforderung beim RAID ist nun, dass es derzeit keine RAID-Controller gibt, die den TRIM-Befehl unterstützen und die Implementierungen auf Betriebssystemebene nicht zwingend erkennen können, ob das "virtuelle" Laufwerk den TRIM-Befehl unterstützt oder nicht. Es hindert Dich ja niemand daran ein RAID aus einer Festplatte und einer SSD zu erstellen. Ob solch eine Konstellation Sinn macht, oder nicht, soll hier nicht diskutiert werden. Lächelnd

Overprovisioning

Um das TRIM-Problem zu lösen, können wir uns eines Tricks bedienen, der allerdings zu Lasten des nutzbaren Speicherplatzes auf der SSD geht. Durch so genanntes Overprovisioning kann die Performance von SSDs in manchen Fällen gesteigert, zumindest aber auf Dauer hoch gehalten werden. Bei diesem Verfahren geben wir der SSD einfach etwa 20% der Nominalgrösse als Arbeitsbereich zur freien Verfügung, bei einer 240 GB SSD wären das etwa 48 GB.

Die Idee dabei ist, dass immer mehr Speicherplatz frei ist als überhaupt vom Betriebssystem nutzbar ist. Damit sollten immer genug freie Speicherbereiche verfügbar sein und das "Löschen beim Schreiben" kein Thema mehr sein.

Im Klartext: Lediglich 80% der Nominalgrösse partitionieren und den restlichen Speicher unberührt lassen, sprich weder einer Partition zuweisen, noch formatieren oder ähnliches.

TRIM aktivieren

Trotz des Overprovisioning können wir TRIM für die SSDs aktivieren. Falls FreeBSD auf der SSD installiert ist, musst Du im SingleUser Modus starten. Anschliessend muss die SSD lediglich mit Leseberechtigung eingehängt werden.

Anschliessend aktivieren wir TRIM für beide SSDs (wir bauen ja ein RAID) mit folgenden Befehlen, wobei du /dev/ada0p1 und /dev/ada0p2 ggf. ersetzen musst.

# tunefs -t enable /dev/ada0p1
# tunefs -t enable /dev/ada0p2

Wir können nun die Ausgabe von tunefs kontrollieren:

# tunefs -p /dev/ada0p1
tunefs: POSIX.1e ACLs: (-a)                                disabled
tunefs: NFSv4 ACLs: (-N)                                   disabled
tunefs: MAC multilabel: (-l)                               disabled
tunefs: soft updates: (-n)                                 enabled
tunefs: soft update journaling: (-j)                       enabled
tunefs: gjournal: (-J)                                     disabled
tunefs: trim: (-t)                                         enabled
tunefs: maximum blocks per file in a cylinder group: (-e)  4096
tunefs: average file size: (-f)                            16384
tunefs: average number of files in a directory: (-s)       64
tunefs: minimum percentage of free space: (-m)             8%
tunefs: optimization preference: (-o)                      time

Jetzt können wir aus den SSDs in Verbindung mit dem Overprovisioning-Verfahren das RAID konfigurieren und aufbauen. Performanceverluste gehören von nun an der Vergangenheit an.