Optimierungen für SSDs

Aus Siduction Wiki DE
Wechseln zu: Navigation, Suche

Einleitung

Eine Solid State Disk (SSD) ist aus FLASH-Speicherzellen aufgebaut und hat die besondere Eigenschaft, dass Daten vor dem Schreiben gelöscht werden müssen, wobei nur ganze Blöcke auf einmal gelöscht werden können. Soll also nur 1 Byte geändert werden, muss der zugehörige Block gelöscht, der vorige Inhalt des Blockes mit Änderung des neuen Bytes geschrieben werden. Das kostet natürlich Zeit.

Um dieses Problem zu umgehen, bieten moderne Filesysteme eine Lösung: Der TRIM-Befehl, eine Erweiterung des SATA-Befehlsatzes. Mit diesem Befehl kann das Filesystem der SSD mitteilen, welche Blöcke nicht in Gebrauch sind. Die Firmware der SSD kann solche Blöcke dann, wenn sonst nichts los ist, schon mal löschen.

Gegenanzeige

In Wikipedia wird dargelegt, dass moderne SSDs das Löschmanagement (Garbage collection) in der Firmware so optimieren, dass kein Performance-Unterschied zwischen Nutzen und Nichtnutzen des TRIM-Befehls mehr vorhanden sei. Andererseits reduziere TRIM die Schreibzugriffe.

Blockgröße beim Partitionieren beachten

Es ist natürlich sinnvoll, dass die Blöcke des Filesystems mit denen der SSD zusammenpassen: Überlappt ein Filesystemblock zwei SSD-Blöcke, so müssen beim Löschen doppelt so viele SSD-Blöcke behandelt werden.

Die SSD-Blockgröße muss unter dem Suchbegriff "NAND Erase Block Size" recherchiert werden. Bei der INTEL-25M G2 ist das 512 kB, also 512*1024 = 524288 Byte.

fdisk legt standardmäßig das Schema 255 (Köpfe) * 63 (Sektoren) * 512 Byte Sektorgröße = 8225208 Byte = 8032 kByte je Zylinder fest. Das passt also nicht zur SSD-Blockgröße.

Hinweis.png Dieser Aufruf löscht alle Partitionen der Platte (wenn Änderungen getätigt werden)!

So setzen wir setzen einfach die Zylindergröße auf 512 kByte = 32 * 32 * 512 Byte/Sektor:

fdisk -L home -H 32 -S 32 -c /dev/sdX

Hinweise:

  • /dev/sdX ist anzupassen, z.B. /dev/sda
  • -c setzt die DOS-Kompatibilität außer Kraft.
  • 512 kByte je Zylinder geht nur, wenn die SSD nicht zu groß ist, genauer < 133 GByte.
  • Bei SSDs > 133 GByte muss die Zylindergröße ein ganzzahlig Vielfaches der SSD-Blockgröße sein.

Jetzt werden die Partitionen wie gewohnt angelegt.

Blockgröße beim Formatieren berücksichtigen

Das ext4-Filesystem unterstützt den TRIM-Befehl. Mit folgendem Befehl passen wir die interne Geometrie an die SSD an:

mkfs.ext4 -b 4096 -E stride=32,stripe-width=32 /dev/sdXY

Hinweise:

  • /dev/sdXY ist anzupassen, z.B. sda3
  • Die obigen Optionen sind eigentlich für RAID vorgesehen und sorgen dafür, dass die Abläufe auf die SSD-Blockgröße optimiert werden.
  • Es kann der stride-Wert auf die Kopfzahl, der stripe-width-Wert auf die Sektorzahl gesetzt werden (entscheidend ist nur das Produkt!)

SSD beim Mounten berücksichtigen

  • Die Schreibvorgänge sollen bei SSDs minimiert werden (Lebensdauer):
    • Mit noatime verhindert man, dass jeder lesende Dateizugriff das Zugriffsdatum ändert.
    • Mit tempfs werden temporäre Dateien nach Möglichkeit nur im RAM erstellt
  • Die Nutzung des Trim-Befehls wird beim Mounten der Partition festgelegt, mit der Option discard:

Beispiel für /etc/fstab:

LABEL=home /home ext4 auto,noatime,discard,defaults	0 0
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0


Links