Darbe kilo diskusija kiek failų optimaliausia saugoti kataloge ir ar iš viso jų skaičius turi įtakos. Panašiu klausimu jau buvau domėjęsis anksčiau, tada orientavausi į ext3 failų sistemą. Laikiausi nuomonės, kad viename kataloge laikyti daug failų yra blogis, iš kažkur galvoje turėjau 10k optimalų failų kiekį. Šiandien plačiau pasidomėjau šiuo klausimu ir padariau keletą išvadų.
Atnaujinti senas failų sistemas(ext3, ext2…)
Tai atlikti gali būti sudėtinga ir pavojinga, todėl verta tik jei netenkina esamos failų sistemos apribojimai(trumpas palyginimas). Perėjus prie kitos FS gali padidėti sistemos greitaveika, stabilumas, taip pat sumažėja apribojimų. Ext4 failams saugoti naudoja hashed B-tree struktūra, todėl failai pasiekiami per O(logn).
Į dabartinių failų sistemų apribojimus galime nekreipti dėmesio, bet…
Failų sistema sugeba saugoti daug failų viename kataloge ir rasti nurodytą, be didelių greitaveikos nuostolių, tačiau problemos prasideda jei norime atlikti veiksmus reikalaujančius katalogo skenavimo – pvz paieškos. Įrankiai kaip ls ir find dirbs ilgai nes atliekamas rikiavimas(jei ls nenurodyta -U), o vykdant shell’e gali negauti rezultatų dėl ‘Argument list too long’. Taip pat sudėtingėja atsarginių kopijų darymas.
Katalogų gylis
Katalogų gylis yra svarbus, įdomumo dėlei jis turi ir limitus: ext3 – 32000, ext4 – 64000. Apžvelgus greitaveikos testus(lyginama trijų lygių, po 20 subkatalogų kiekviename su 10 lygių gyliu po 3 subkatalogus) matome, kad vykdyti veiksmus su daug į gylį besitęsiančių katalogų trunka ilgiau, nei su mažesniu skaičiumi.
Failų skirstymas
Pasirinkus skirstyti failus reikia nuspręsti kokią strategiją naudoti. Pateikiu tris su kuriomis man teko susidurti.
Pagal laiką
Tinka failams, kurių skaičius varijuoja mažai tam tikrame laiko periode, pvz logai. Juos galima saugoti katalogų struktūroje: root/metai/mėnuo/diena/…
Hash reikšmę(maišos funkcijos rezultatą)
Normalizuojant failo pavadinimus dažnai naudojamos maišos funkcijos. Tokiu atveju labai patogu katalogams pavadinti rinktis hash funkcijos rezultato kelis ženklus. Kiek ženklų pasirinkti priklauso nuo saugomų failų skaičiaus. Pasirinkus md5 algoritmą ir 2 ženklus gausime 16*16=256 skirtingus sub katalogus, laikant kad md5 nuo smulkių duomenų pakeitimų sugeneruoja visiškai skirtingas hash reikšmes ir kiekvienas simbolis vienodai tikėtinas, galime laikyti, kad po tuos katalogus failai pasiskirstys daugmaž tolygiai.
Pavyzdys:
Pavadinimas – MD5 reikšmė – katalogas saugojimui
namas.txt – 60660294491999df621a26cfb7d35818 – root/60
projektas.jpg – 97c6702a0ba91219dc1456bccac88ea9- root/97
Nuoseklią reikšmę
Ne visada galime sumaišyti failus, pvz saugumo sumetimais viename kataloge privalo būti tik vieno asmens failai. Tokiu atveju geras sprendimas dalinti nuoseklią reikšmę – vartotojo id. Tarkim viename sub kataloge nenorime turėti daugiau nei 30000 vartotojų katalogų, tai daliname iš to skaičiaus. Jei vartotojo id 20, jo failus saugosime sub kataloge round(20/30000) – /root/0/20
Šaltiniai:
http://serverfault.com/questions/49684/linux-filesystems/49716#49716
http://stackoverflow.com/questions/466521/how-many-files-in-a-directory-is-too-many/466728
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories
http://unix.stackexchange.com/questions/78157/what-is-the-cost-of-deeply-nested-folders-in-ext4
http://lwn.net/Articles/400629/
http://events.linuxfoundation.org/slides/2010/linuxcon2010_wheeler.pdf (EXT3, EXT4, XFS, BTRFS greitaveikos palyginimas)
http://stackoverflow.com/questions/8238860/maximum-number-of-files-folders-on-linux