Sistemul meu de fișiere ext4 își pierde performanța atunci când crește.
Am un sistem care stochează o mulțime de fișiere imagine. Acest server de imagini bazat pe Debian stochează fișiere de imagine împărțite în foldere de ani pe seturi de discuri de 1-2TB cu hardware RAID-1. Fișierele sunt stocate într-o structură de foldere de ani și două niveluri de 256 de foldere mai jos.
Ca
images/2021/2b/0f/193528211006081503835.tif
Fișierele sunt scrise continuu pe parcursul anului și sunt distribuite uniform cu ajutorul unui hash, astfel încât fiecare dosar frunză/imagine
conține în jur de 400 de dosare la sfârșitul anului.
Acest lucru oferă un total de aproximativ 256 x 256 x 400 = 26 214 400 de fișiere pe dosar anual.
Repetarea acestei structuri de foldere funcționează bine până la aproximativ 20 de milioane de fișiere.
Durează poate câteva ore. Când devine mai mare, chiar și listarea unui folder de frunze cu 300-400 de fișiere poate dura 1-4 secunde când nu este în cache. Bănuiesc că are ceva de-a face cu fragmentarea în intrările din director.
Accesarea unui fișier individual atunci când știți calea este întotdeauna rapidă.
Și nu este o problemă hardware/disc, performanța brută io este bună. Apropo, fișierele nu sunt niciodată șterse din această structură.
Defragmentarea cu e4defrag nu face nicio diferență. Presupun că defragmentează doar fișierele și nu directoarele. fsck.ext4 -D ar putea fi o soluție, dar deoarece acesta este un sistem de producție, nu sunt dornic să demontez sistemul de fișiere și să încerc.
Ceea ce ajută, este să copiați fișierele într-un folder temporar și apoi să le mutați înapoi, suprascriind originalul. Ca
cp -a imagini/2021/2b/0f/* imagini/2021/2b/tmp
mv -f imagini/2021/2b/tmp/* imagini/2021/2b/0f
După această operație, performanța este restabilită (chiar dacă nu este în cache).
Dacă fișierele în sine ar fi fragmentate, înțeleg de ce ar ajuta acest lucru, dar nu sunt conform e4defrag.Mutarea fișierelor în folderul temp și înapoi nu ajută.
Ma poate ajuta cineva sa inteleg ce se intampla aici.