Was ist TRIM oder besser; Warum ist meine SSD so langsam?

Da unterhalte ich mich heute mit einem Bekannten über das neue Android 4.3 und welche Neuerungen es beinhaltet. Da stolpert mein Bekannter über TRIM. Nachdem ich es ihm erklärt habe, meint er: „Warum hat so eine geile Sache denn bisher noch keiner ersonnen? Das wäre doch auch für seinen PC wichtig!“. Wir sprechen kurz darüber das TRIM nicht wirklich eine Erfindung von Android/Google ist sondern um 2007 schon klar war.

Scheinbar ist das Thema im Zusammenhang mit Flash-Speichern wie SSD Festplatten, USB-Sticks oder Speicherkarten doch nicht so klar wie ich zuerst dachte….. Ja Felix, ich schreib es ja schon hier auf 🙂

Also was macht dieses komische TRIM? Nichts besonders, im Groben sagt es der Festplatte nur, welche Blöcke noch in Verwendung sind und welche nicht! Dieses hat natürlich einen Grund. Jeder der schon einmal „aus Versehen“ Dateien gelöscht hat und diese mit einem kleinen Programm wiederherstellen konnte, der weiß dass Dateien meist nicht gelöscht werden, sondern sie werden nur aus dem „Inhaltsverzeichnis“ des Datenträgers gelöscht und ihre Speicherblöcke werden im Dateisystem wieder zum Überschreiben gekennzeichnet. Welche Blöcke belegt und welche Böcke frei (also überschreibbar) sind davon hat der eigentliche Datenträger in der Regel keine Ahnung. Klassische Speichermedien müssen dieses auch nicht wissen. Für sie macht es keinen Unterschied ob der Block nun frei ist oder belegt. Im Gegenteil, es würde eher ein Problem sein, dieses dem Datenträger bei jedem Vorgang mit zu teilen. Warum? Nun ja, wenn ich eine Datei löscht, dann weiß das Dateisystem davon, dieses entfernt den Eintrag aus seinem „Inhaltsverzeichnis“ und macht noch ein bisschen „wuwu“ drumherum. Dieses bedeutet IOPS auf dem Datenträger. Wenn man nun zusätzlich noch den Datenträger darüber Informiert, dann bedeutet dieses noch mehr IOPS. Dieses setzt alle Komponenten unnötig unter Last und macht alles langsam.

Flash-Speicher kann nun IOPS deutlich besser verkraften als zum Beispiel eine einfache Festplatte. Denn beim Flash-Speicher sind die Informationen, egal wie verteilt sie auf dem Speicher liegen mögen, immer direkt verfügbar. Bei einer Festplatte muss erst der Schreib-/Lesekopf zur richtigen Spur gefahren werden und dann wartet alles darauf, dass die Information vorbei gedreht wird. Sind die Informationen auf einer Festplatte weit verteilt dauert es lange alle Informationen einzusammeln. Der Schreib-/Lesekopf muss halt immer erst zur richtigen Spur und dort auf die Informationen warten… Daher defragmentieren wir Festplatten, damit die Informationen möglichst schön zusammen liegen und optimalerweise in einer Spur direkt hintereinander eingelesen werden können. SSDs / Flash-Speicher defragmentieren wir nicht, denn es bringt nichts und macht nur den Speicher kaputt!!

Kaputt? Japp…. Denn hier wird in Speicherzellen geschrieben welche nach einer gewissen Anzahl Speichervorgängen unwiederbringlich kaputt gehen. Flash-Speicher sind daher mit etwas Intelligenz ausgestattet. So wird das Speichern auf einem Flash-Speicher immer über alle Speicherzellen verteilt. Damit ist die „Abnutzung“ am geringsten und der Speicher lebt am längsten. Zusätzlich gibt es immer etwas mehr Speicher als man wirklich benutzen kann. Dieser Speicher wird dann benutzt, wenn der Flash-Speicher voll oder besser fast voll beschrieben ist. Jetzt kann dieses verteilte und gleichmäßige Beschreiben der Speicherzellen natürlich nur mit freien und frei werdenden Blöcken passieren. Sonst würde wir ja Nutzdaten überschreiben. Genau jetzt wird es spannend. Denn wenn der Datenträger nicht weiß welche Blöcke wieder frei geworden sind, dann wird er irgendwann die Speichervorgänge nur noch auf dem Reservebereich verteilen und noch etwas später dann überhaupt nicht mehr, da für den Datenträger irgendwann alle Blöcke belegt sind. Dieses merkt der Benutzer dann meist daran, dass seine SSD ganz plötzlich sehr langsam arbeitet. Denn ab jetzt werden nur die Blöcke überschrieben, welche vom Filesystem explizit angegeben werden. Damit „verschleißt“ man also nicht nur seinen Flash-Speicher, sondern es wird zusätzlich langsam.

Teilt man also seinem Flash-Speicher mit welche Blöcke wieder frei geworden sind, kann dieser die Schreibvorgänge überhaupt und vor allem so gleichmäßig wie möglich verteilen. Das macht also TRIM 😀

Android kann es nun also ab Version 4.3, Linux macht es ab Kernel 2.6.33 (glaube ich zumindest) Windows 7 und die auf Windows 7 basierende Serverversion von Microsoft, Windows Server 2008 R2, kann es genau so wie: Solaris, FreeBSD oder Mac OS X.

Mac OS X im übrigen erst recht spät, bevor die Jungs angefangen haben in ihre MacBooks SSDs einzubauen war es wohl aus ihrer Sicht nicht nötig. Apple halt… Wie auch immer… Aktiviert werden muss es bei den meisten Betriebssystemen/Dateisystemen noch immer von Hand. Nur Microsoft ist da wie so oft etwas benutzerfreundlicher. Denn wenn der NTFS-Treiber erkennt dass der Datenträger TRIM unterstützt, schaltet er dieses voll automatisch mit an 🙂

Wer jetzt noch Windows XP oder *grusel* Window Vista einsetzt: Verkackt 🙂 ihr macht eure SSD kaputt!

Ein Linux Beispiel gefällig? Kein Problem…

So gesehen gibt es zwei mögliche Lösungen TRIM zu aktivieren:

1. Von Hand, wenn man es für nötig hält oder halt per cron-job.
+ Klasse Sache, geht ab Kernel 2.6.3irgendwas.
+ Per cron-job so einfach wie nem Baby den Schnuller zu klauen.
– Informiert den Datenträger natürlich nur in dem Moment in welchem es gestartet wird über den aktuellen Zustand.

2. Automatisch beim einbinden/mounten des Dateisystems per fstab.
+ Informiert den Datenträger in Echtzeit.
– Erst ab Kernel 3.0 wirklich mit den gängigen Filesystemen nutzbar.
– Man munkelt über kaputte Daten/Datenträger mit sehr alten SSDs.

Beispiel für Version 1:

# fstrim -v /

Ach ja, fstrim ist das Programm welches mit Root-Rechten ausgeführt werden muss. „-v“ sorgt für die nötigen Informationen und „/“ ist das gewünschte Filesystem.

Möchte man alles per cron täglich ausgeführt haben erstellt man am besten unter: /etc/cron.daily/ ein neues Script: hdd-trim

Als Beispielinhalt:
#!/bin/bash
echo „Gestartet am: $(date)“ >> /var/log/hdd-trim.log
fstrim -v / >> /var/log/hdd-trim.log

Datei noch ausführbar machen:
# chmod +x /etc/cron.daily/hdd-trim

Fertig…. Nun kann man sich täglich sein wachsendes Logfile anschauen 🙂

Beispiel für Version 2:

Einfach beim Konfigurationseintrag seines Wunschfilesystems discard zu den Mountoptions hinzufügen:

/dev/sda1 / ext4 noatime,errors=remount-ro,discard 0 1

„/dev/sda1 / UUID“ natürlich genau so anpassen wie Mountpunkt oder Filesystem.

B.t.w.: Wir nehmen hier ein Programm, welches dem Datenträger sagt welche Blöcke frei sind und er doch bitte überschreiben darf/soll. Wenn hier etwas schief geht, werden unserer Daten überschrieben 🙂 Also, erst schauen ob die Versionen stimmen, ob die Firmware der Platte alles mit macht und dann nach einem Backup, testen 🙂