Ik ga binnenkort een SSD schijf in mijn laptops optical drive bay zetten. Vandaar dat ik me wat heb verdiept in de werking van SSD's.
Een probleem van SSD schijven is 'write amplification' oftewel het feit dat wanneer je een bepaalde hoeveelheid logische data naar de SSD stuurt, op de SSD schijf meer data wordt geschreven dan er heen is gestuurd. Dit gaat ten koste van performance en levensduur. Dit komt onder andere door 'Garbage collection'.
Garbage collection
Bij een normale harde schijf wordt oude data op de schijf die nog op een bepaalde plek staat maar die niet meer gebruikt wordt bij een nieuwe schrijfactie op die locatie gewoon overschreven. Bij SSD's kan dat niet, daar moet oude data eerst gewist worden alvorens er nieuwe data op kan worden geschreven. Belangrijk voor de performance is het om oude data niet pas te wissen zodra nieuwe zich aandient, maar omdat zo snel mogelijk te doen als data niet meer nodig is zodat er altijd veel vrije ruimte beschikbaar is voor efficiente, snelle schrijf acties.
Typisch aan SSD's Data op SSD's wordt geschreven in eenheden genaamd 'pages', en gewist in eenheden genaamd 'blocks'. Een 'block' bestaat uit meerdere 'pages'.
OOOO OOOO
OOOO OOOO
OOOO OOOO
OOOO OOOOHierboven zijn als voorbeeld twee blocks van ieder 12 pages grafisch weergegeven. Alle pages zijn onbeschreven. Stel nu dat er 4 pages in het eerste block worden beschreven met de informatie A, B, C en D. Dan krijg je het volgende:
ABCD OOOO
OOOO OOOO
OOOO OOOO
Stel nu dat er daarna nieuwe data wordt toegevoegd (EFGH), en dat ABCD wordt gewijzigd in JKLM. Dan krijg je het volgende:
ABCD OOOO
EFGH OOOO
JKLM OOOO
Zoals je ziet blijft ABCD staan, immers een SSD kan geen data overschrijven die niet eerst al gewist is.
Nu is er geheugen verloren gegaan omdat bij een SSD data niet overschreven wordt. De plek waar ABCD staat moet eerst gewist worden alvorens deze weer bruikbaar is. Het probleem is nu dat losse pages niet gewist kunnen worden, alleen gehele blokken met 12 pages. De oplossing heet 'garbage collection'. Het werkt zo: de valide data in een block wordt naar een ander block gekopieerd, en het orginele block wordt geheel gewist. In het voorbeeld krijg je dan de volgende situatie na het kopieren:
ABCD EFGH
EFGH JKLM
JKLM OOOO
Vervolgens wordt de oude data gewist zodat het geheugen dat door ABCD werd ingenomen weer bruikbaar is:
OOOO EFGH
OOOO JKLM
OOOO OOOO
Voor een goede prestatie moet ervoor gezorgd worden dat SSD's ongebruikte data dus wissen vóórdat er nieuwe data geschreven wordt. Het wissen van oude data op SSD's heet 'garbage collection', en is erg belangrijk voor de prestatie.
Nu is het probleem dat besturingssystemen wanneer een bestand gewist wordt op een harde schijf niet de data waaruit dat bestand bestaat wissen, maar alleen de verwijzer naar die data wordt gewist. Dit betekent dat de data zelf normaal nog gewoon op de schijf staat, ook al wordt deze niet meer gebruikt, net zolang tot het bestandsysteem besluit de blokken te overschrijven. Vandaar ook dat het mogelijk is dat er software bestaat om per ongeluk gewiste bestanden terug te halen. Normaal gezien behandeld een besturingssysteem een SSD schijf gewoon als een normale harde schijf, wat betekent dat ook op de SSD de data van gewiste bestanden blijft staan. Dit betekent dat er erg veel data op een SSD staat waarvan de SSD niet weet dat het 'garbage' is totdat het besturingssysteem de opdracht geeft de data te overschrijven. Het gevolg hiervan is dat er bij het proces van 'garbage collection' heel veel data wordt gekopieerd waarvan de SSD denkt dat het valide data is, terwijl het eigenlijk gewoon garbage is. Dit is natuurlijk niet goed voor de performance en levensduur van een SSD schijf.
De oplossing hiervoor is TRIM. Veel moderne SSD schijven en Linux ondersteuning TRIM. TRIM maakt het mogelijk voor het besturingssysteem om bij het wissen van een bestand door te geven aan een SSD schijf welke blokken data niet meer nodig zijn als gevolg van het wissen van een bestand. Met deze kennis kan een SSD dus veel efficienter 'garbage' opruimen. De SSD verwijderd dan namelijk niet alleen de verwijzing naar de data van het bestand, maar ook de data zelf. En dit laatste dus voordat het bestandsysteem de data overschrijft met nieuwe data.
Hoe TRIM te gebruiken?
Zorg dat je een kernel hebt nieuwer dan 2.6.33, en het ext4 bestandsysteem.
Voeg in fstab als bestandsysteemoptie 'discard' toe bij de mount van het bestandsysteem op de SSD. Bijv:
UUID=ed586ab8-08c5-4bae-b118-d191b716b4a4 / ext4 discard,errors=remount-ro 0 1
(Controleer of je SSD TRIM ondersteunt, is dat niet het geval, kan je het beter niet instellen.)
Dat is alles, nu zou TRIM automatisch moeten werken.
Naast TRIM is ook over provisioning belangrijk om garbage collection efficient te laten verlopen, en de levensduur van een SSD te verlengen. Over provisioning betekent dat je een deel van de schjif niet gebruikt zodat er altijd vrije ruimte beschikbaar is voor het kopieren van pages voor 'garbage collection' en het afschrijven van 'bad blocks'. Professionele SSD's gebruiken vaak een flink deel van de SSD intern al voor provisioning, deze is dus niet beschikbaar. Voor consumenten SSD's gebeurt dat in mindere mate (minder GB levert minder geld op), het kan daarom slim zijn om er zelf voor te zorgen dat een deel van de SSD niet gebruikt wordt door de gebruiker. Dan is er altijd voldoende 'provisioning' voor top performance en levensduur verbetering.
Hoe?
Eenvoudig, zorg bij het partitioneren dat je zo'n 10% van de ruimte niet gebruikt.
edit:
Gebruik je luks encryptie, zorg dan dat je in /etc/crypttab ook discard toevoegd als optie:
sda5_crypt UUID=e364d03f-[...]6cd7e none luks,discard
En herbouw je initramfs zodat het bij het opstarten wordt meegenomen:
sudo update-initramfs -c -k all