SSD-Einsatz mit Linux
Dies ist ein kleiner Merkzettel, was man beachten sollte, v.a. die Dinge beinhalten, die man nachträglich schlecht ändern kann.
SSD-Firmware
Nicht Linux-spezifisch, aber trotzdem erwähnenswert: als allererstes checken, ob auf der SSD die aktuelle Release-Firmware drauf ist, bevor man Daten draufspielt - erspart einem das Backup.
Das Align-Problem
Flash-Disks verwalten ihre Information in großen Blöcken (typisch: 128 kByte bis 512 kByte). Beim Löschen kann immer nur ein ganzer Block gelöscht werden. Da Schreiben bei Flash-Disks ein vorheriges Löschen voraussetzt, wird also immer in diesen ganzen Blöcken geschrieben.
Dateisystem verwenden ebenfalls Blöcke, dort oft Cluster genannt. Überlagert ein Cluster zwei Flash-Blöcke und wird dieser Cluster geschrieben, so müssen diese beide Flash-Blöcke geschrieben werden. Die Schreibrate halbiert sich dadurch, und der Verschleiß, nämlich die Anzahl der geschriebenen Blöcke, verdoppelt sich.
Man muss also dafür sorgen, dass die Clustergrenzen mit den Flash-Blockgrenzen übereinstimmen. Dies muss beim Partitionieren geschehen, da die Clustergrenzen vom Start der Partition abhängen.
fdisk hat in ältereren Versionen den Cylinder-Head-Sector-Modus (C/H/S-Modus) benutzt: Mit heutigen Platten ist immer folgende Geometrie gegeben: Head=255 und Sectors=63. Damit ergeben sich pro Zylinder 255*63=16065 Sektoren. Damit also ein Block auf einen Zylinderanfang fällt, ist schwierig: Ein 128-kByte-Block enthält 128*2=256 Sektoren, das k.g.V von 16065 und 256 ist 16065*256, also fallen bei den Zylindern 1, 256, 512... die Grenzen zusammen. Partitionen müssen dann ein Vielfaches von 256*16065*512 Byte = 2056320 kByte (etwa 2Gbyte) haben.
Alte fdisk-Versionen legen die erste Partition auf den Anfang des 2.ten Kopfes im 1.ten Zylinder (Sektor 63), der dann sicher nicht mit einer Flash-Blockgrenze zusammenfällt.
fdisk
Neuere fdisk-Versionen alignen automatisch, man sieht es daran, dass im Sektor-Modus ("u" und "c") der Partitionsstart der ersten Partition bei 2048 (== 1MB) angezeigt wird.
Man kann aber auch mit älteren fdisks im C/H/S-Modus alignen:
Partitions-Alignment auf 128KB:
fdisk -H 224 -S 56 /dev/sdb # Cylinder = 49 * 128KB
Hinweis: Wenn man die erste Partition wie üblich auf Cyl 1, Head 1, Sect 1 anfängt (also bei Sektor 56), ist sie nur auf 4KB aligned, aber fuer /boot wenig relevant, da wenig Schreibzugriffe. Alternativ kann man, wenn man kein /boot möchte auch einfach einen Cylinder verschenken und auf Cyl 2 Head 0 Sect 1 (also bei Sektor 12544) anfangen, dann ist man 128KB-aligned und auf Cylinder-Grenze schon bei der ersten Partition.
Warnung: Diese Geometrie (224 Heads, 56 Sektoren/Head) beschränkt die Gesamtkapazität auf 65535*224*56*512 Byte = 391 GByte.
Einzelne SSD
TODO
Alternativ: RAID1 aus SSD und HDD
Idee:
- SSDs sind oft noch zu teuer, um 2 davon zu nem RAID zusammenzubauen. Daher SSD+HDD.
- Ne einzelne SSD kann durchaus auch kaputt gehen - zwar nicht mechanisch, aber Flash nutzt sich durch Schreibzugriffe ab (wobei die Controller heutzutage sog. Wear-Leveling betreiben, um den Flash möglichst gleichmäßig abzunutzen). Daher will man RAID1.
- Auf der HDD gibt es normalerweise deutlich mehr Platz, kann nicht gespiegelt für weniger wichtige Daten verwendet werden (z.B. Backups, Downloads, SWAP, ...).
- Die meisten READs aus der SSD bedienen, die HDD soll nur die WRITEs abkriegen (um ein aktueller Spiegel der SSD zu sein). Von der HDD soll nur dann gelesen werden, wenn es von der SSD nicht geht (Flash kaputt?). Dies erreicht man, indem man die HDD als --write-mostly deklariert.
- Wenn man auch die Schreibperformance tunen will, braucht man --write-behind. Dann werden die Daten auf die SSD geschrieben, dann wird fertiggemeldet und erst danach werden die Daten auf die HDD geschrieben.
Beispiel-Layout:
SSD |- /boot -||--- / ---||------ /home ------| HDD |- /boot -||--- / ---||------ /home ------||- SWAP -||--------- BACKUP / TRASH ---------|
- SWAP nur auf HDD - Schreibzugriff auf SSD vermeiden (man baut einfach genug RAM ein, dass es nicht so sehr swapped). Haken: wenn die HDD plötzlich verstirbt, stürzt der Rechner ab, wenn Speicherinhalte ausgelagert waren.
- BACKUP - da das eh redundante, wiederbringliche oder unwichtige Daten sind (z.B. Kopien von Daten auf anderen Rechnern, Historische Kopien von / oder /home, Downloads, ...), muss es nicht unbedingt RAID1 sein.
- /boot - wegen Alignment
TODO: mehr Details zu --write-mostly --write-behind bitmap ...
md Alignment: metadata 0.90 oder 1.0 liegen am ENDE, daher kein Einfluss. 1.1/1.2 liegt am Anfang - die eigentlichen Daten beginnen aber erst ab Sektor 2048, sind also auf 1MB aligned.
sda ist ssd, sdb ist hdd # boot, keine optimierung: mdadm --create /dev/md1 -l1 -n2 /dev/sda1 /dev/sdb1 # root / home, schreiboptimiert: mdadm --create /dev/md2 -l1 -n2 --bitmap=internal /dev/sda2 --write-behind --write-mostly /dev/sdb2 mdadm --create /dev/md3 -l1 -n2 --bitmap=internal /dev/sda3 --write-behind --write-mostly /dev/sdb3
mkfs
ext3
Fuer /boot nehmen wir vorsichtshalber mal ext3, ansonsten ext4:
mke2fs -j /dev/md1
ext4
Fuer root und home ext4, da besserer Support fuer SSD/Alignment:
# 32 blocks * 4KB/block = 128KB mke2fs -t ext4 -E stripe-width=32,resize=500G /dev/md2 mke2fs -t ext4 -E stripe-width=32,resize=2000G /dev/md3
mount
TODO: noatime,nodiratime oder relatime, /tmp auf tmpfs,
Tuning
TODO: io scheduler
Anmerkung
Ich war auf der Suche nach einer Seite, die Hinweise gibt, was zu beachten ist, wenn in einem Linux system eine SSD Platte zum Einsatz kommt. Aber diese Seite ist leider nur verständlich für Menschen die fdisk und Partitionen im Blut haben. Für mich als ambitionierter Laie und Computerfreund, sagen solche Sätze wenig:
Neuere fdisk-Versionen alignen automatisch, man sieht es daran, dass im Sektor-Modus ("u" und "c") der Partitionsstart der ersten Partition bei 2048 (== 1MB) angezeigt wird.
Was ist aligen? Was ist ein Sektor Modus?
Auch die weitere Erklärung zum fdisk Befehl ist sehr kryptisch:
Hinweis: Wenn man die erste Partition wie üblich auf Cyl 1, Head 1, Sect 1 anfängt (also bei Sektor 56), ist sie nur auf 4KB aligned, aber fuer /boot wenig relevant, da wenig Schreibzugriffe. Alternativ kann man, wenn man kein /boot möchte auch einfach einen Cylinder verschenken und auf Cyl 2 Head 0 Sect 1 (also bei Sektor 12544) anfangen, dann ist man 128KB-aligned und auf Cylinder-Grenze schon bei der ersten Partition.
Vielleicht kann bei Gelgenheit jemand etwas hilfreichere Hinweise hier einbauen? Danke.