Hlavní navigace

I Linux potřebuje defrag

9. 5. 2012 10:44 (aktualizováno) Tomas Matějíček

Kdysi dávno, ještě na vysokoškolské koleji, mi kamarád ukazoval jak si kompiluje XFS filesystém, který tehdy nebyl ještě součástí jádra. V porovnání s tehdy jediným souborovým systémem ext2 byl XFS něco jako malý zázrak, žurnálování a z něj plynoucí především absence zdlouhavého fsck byla jasnou výhodou.

O něco později, když už byly žurnálovací systémy běžně v jádru, jsem na mém prvním hostingovém serveru přecházel z ext2 na reiserfs. Měl jsem s ním ale hrozné výkonostní problémy, reiser byl pomalý jak slimák, bylo to nepoužitelné. A světe div se, všechny výkonostní problémy zmizely po přechodu na XFS. Možná to nebylo filesystémem, ale diskem. Možná tím, že jsem při přechodu systémovou partišnu přeinstaloval a tudíž možná změnil ještě něco dalšího. A možná to bylo úplně něčím jiným, to už teď nezjistím. Každopádně XFS bylo svižné jak svižňa, takže jsem od té doby zavrhl všechny ostatní filesystémy a XFS používám naprosto všude. Výkon pro mé potřeby (webservery) absolutně vyhovující, jediné co bych uvítal vylepšit je rychlost mazání souborů, to je teda dost pomalé vytváří to vysoký load.

Nicméně i přes tento nedostatek jsem spokojen. Už několikrát jsem musel po havárii hardwaru xfs opravovat na degradovaných polích, a zatím vždy se mi povedlo vesměs všechny data dostat zpátky přes xfs_repair. Dnes jsem po letech ovšem natrefil na další (pro mě dosud neznámou) featuru, a tou je defrag. Celé roky jsem žil v mylném přesvědčení, že defragmentace není u XFS nutná, nicnémě opak je pravdou. Teda abych pravdu řekl, nevím jestli je NUTNÁ, nicméně je možná. A dokonce celkem jednoduše, a za běhu systému.

Tímhle příkazem se zanalyzuje diskový oddíl, pro každý soubor se spočítá počet fragmentů, a výsledek je vypsán:

root@darkstar:~# xfs_db -r /dev/sda5 xfs_db> frag actual 198698, ideal 64254, fragmentation factor 67.66% xfs_db> quit

Ve výpisu výše vidíme, že 67.66% dat je fragmentovaných ne moc ideálně, tudíž je na snadě spustit defragmentaci:

root@darkstar:~# xfs_fsr -v /dev/sda5

Program xfs_fsr sice jako parametr akceptuje soubor zařízení (diskového oddílu), nicméně pracuje s namountovaným filesystémem. Vyhledá soubory, které jsou příliš fragmentované, a opraví je tak, že ve stejném adresáři vytvoří jejich dočasnou kopii (pokud možno nefragmentovanou) a pak „přeznačkuje“ originální soubor, aby používal nová zkopírovaná data. Operace přeznačkování je atomická. Po provedené defragmentaci jsem se dostal na fragmentation faktor 2%, což vypadá mnohem líp :)

Jedno úskalí to ovšem má – někdy je pozici dat fyzicky na disku nutné udržet, např. LILO si fyzicky mapuje bloky na disku odkud čte vmlinuz při bootování. Proto je buď potřeba pomocí xfs_io označit patřičné soubory jako nedefragmentovatelné, nebo jednoduše po defragmentaci spustit lilo, aby si fyzické umístění kernelu refreshnulo.