Wear leveling (SSD)

A wear levelinget magyarra lefordítva valahogy úgy lehetne megfogalmazni, hogy az elhasználódás kiegyenlítéséért felelős algoritmus. Mint azt tudjuk, a cellák csak bizonyos számú írást képesek elviselni, az MLC NAND napjainkban már csak körülbelül 3000-et, míg a TLC nagyjából 2000-2500-at. Abban majdnem biztosak lehetünk, hogy az SSD tartós használat mellett sok év után írhatatlanná válhat, de ha már tudjuk ezt, akkor jó lenne, ha az egész SSD "felülete" azonos időben, azaz minél később válna írhatatlanná, és nem különböző időpontokban. A wear leveling algoritmus éppen ezért felel. Léteznek jobb és rosszabb algoritmusok. A jót onnan lehet felismerni, hogy a valós, általunk okozott adatforgalmon túl nem ró túl nagy terhet a cellákra (write amplification).

A wear leveling önkényesen írkál az SSD-re?

Muszáj neki. Ha van három cellánk (az egyszerűség kedvéért mindegyik 1 bitet tárol) amelyek 300 írást képesek elviselni, akkor meg kell oldani, hogy mindhárom cella egyidőben váljon használhatatlanná, pontosabban azt, hogy ne legyen köztük olyan, amelyik hamarabb elhasználódik. Ha az első kettő tovább tart, mint a harmadik, akkor nem beszélhetünk optimális működésről, viszont a kiegyenlítéshez adatok átmozgatására van szükség. Tegyük fel, hogy nincs wear leveling. Az első cella egy bizonyos ideig egy adott, statikus információt tárol, míg a másodikon és a harmadikon folyamatosan változnak az adatok (dinamikus). Ez wear leveling nélkül azt jelentené, hogy a második és a harmadik cella bizonyos számú írásciklussal előrébb jár az elöregedésben, mint az első cella, tehát hamarabb válik használhatatlanná. Ezt ki kell egyenlíteni és ennek érdekében a wear leveling úgy tárolja az információt, hogy mindhárom cella egyidőben váljon írhatatlanná. Az SSD-k esetében el kell felejteni azt a belénk rögzült képet, amit a töredezettségmentesítő programokban látni, amikor a merevlemezt szeretnénk optimalizálni. Az SSD ugyanis nem úgy működik, mint a HDD, hogy a tányér külső peremétől befelé íródnak fel az adatok, hanem az SSD vezérlője szétszórja az adatokat "mindenfelé", pontosabban lehetőleg egyenletesen a NAND-ok között. A wear leveling egyébként problémákat is felvethet, amikor már nem három celláról, hanem több gigabájtnyi adatról van szó.

Gondoljunk csak bele, veszünk egy 100 GB-os SSD-t, ezen mondjuk kb. 60 GB statikus adatot tárolunk. (A statikus adat olyan adat, amit nem változtatunk meg szinte soha, például az operációs rendszer fájljai és a használt alkalmazások/programok fájljai (Program Files könyvtár), illetve a többi.) Wear leveling nélkül egy idő után szimplán elhasználódik a 40 GB szabad hely, és még az is valószínűtlen, hogy mindez egyszerre következik be. A maradék 60 GB ugyan továbbra is használható marad, de így már nem beszélhetünk 100 GB-os SSD-ről. Valójában erre a kérdésre kétféle megoldás létezik (egyelőre), melyeket a dinamikus és a statikus wear leveling névvel illették.

A dinamikus wear leveling mindig csak a szabad terület, azaz a statikus adatokon túl található terület épségét felügyeli, ahol dinamikusan változó adatok találhatók. A fenti példából kiindulva csak a 40 GB szabad tárhely elhasználódásának a kiegyenlítésére figyel. Sebesség szempontjából ez ideális, hiszen a statikus adatokkal nem kell törődnie, csak nagyon ritkán van munkája és olyankor sem sok. Élettartam szempontjából viszont ezt csak alternatív megoldásként tartják számon, mert miután elhasználódik a dinamikus adatokhoz használt terület, csak a maradék használható tovább, de ez már nem ugyanakkora méretű SSD.

Napjaink SSD-i (legalábbis a többségük) statikus wear levelinget használ. Mint az a nevéből talán kitalálható, ez azt jelenti, hogy az algoritmus a statikus adatokat is folyamatosan mozgatja. Ez azzal az előnnyel jár, hogy az SSD teljes felülete egyidőben válik írhatatlanná, viszont az a hátránya, hogy magának az algoritmusnak a működése plusz terhet ró a cellákra, illetve a sebességet is csökkentheti. A kérdés csak az, hogy mekkora ez a teher, tehát mennyi plusz írással számolhatunk. Ez két tényezőtől függ, egyrészt magától az algoritmustól, másrészt attól, hogy mennyi szabad terület található az SSD-n. Az Intel korábban például elérte, hogy ez az úgynevezett "overhead", tehát hozzáadott írás (write amplification) csak a valós írás 10%-át érje el (1,1x-es szorzó); ez elméletben egy nagyon alacsony szám, ami jó, hiszen ez azt jelenti, hogy tovább "élhetnek" a cellák. Szintén az Intel szerint a kezdetleges vezérlők esetében akár 2000%-os, azaz 20x-os adatmozgatással is számolhatunk a nem éppen ideális esetekben.

Ez enyhén szólva is hihetetlen. Mégis hogyan kell ezt elképzelni?

Vegyünk egy olyan szélsőséges példát, amiben egy SSD-t majdnem "csurig" megtelítünk, például egy 50 GB-os SSD-re 48 GB statikus adatot írunk fel. Tegyük fel, hogy a maradék 2 GB helyen az operációs rendszer és a böngésző ideiglenes fájljai találhatóak, amelyek folyamatosan frissülnek, cserélődnek. A statikus wear leveling nem hagyhatja, hogy a 2 GB "szemét" tárolását végző cella gyorsabban használódjon el, mint a maradék 48 GB statikus adat tárolását végző cella, ezért a háttérben megpróbálja eltolni a 48 GB adatot, tehát lényegében egy közel teljes SSD-nyi, 48 GB adatot fog áthelyezni. Persze ezt nem úgy kell elképzelni, hogy egy temp-fájl törlése/létrehozása után meg kell várni, amíg 48 GB adat elmozdul. Az SSD ezt a háttérben végzi (jó esetben olyankor, amikor nincs terhelés alatt a vezérlő); a 2 GB üresnek vélt cellamennyiséget (a dinamikus adatok "alatt") ide-oda tologatja az SSD felületén, így a cellák elhasználódása az SSD egészén egyenletes lesz.

Hirdetés