Numero massimo di file in una directory ext3 pur ottenendo prestazioni accettabili?


25

Ho un'applicazione che scrive in una directory ext3 che nel tempo è cresciuta fino a circa tre milioni di file. Inutile dire che leggere l'elenco dei file di questa directory è insopportabilmente lento.

Non biasimo ext3. La soluzione corretta sarebbe stata quella di consentire al codice dell'applicazione di scrivere nelle sottodirectory come ./a/b/c/abc.extinvece di utilizzare solo ./abc.ext.

Sto cambiando in una struttura di sottodirectory e la mia domanda è semplicemente: all'incirca quanti file dovrei aspettarmi di archiviare in una directory ext3 pur ottenendo prestazioni accettabili? Qual è la tua esperienza?

O in altre parole; supponendo che sia necessario memorizzare tre milioni di file nella struttura, quanti livelli di profondità dovrebbe ./a/b/c/abc.extessere la struttura?

Ovviamente questa è una domanda a cui non si può rispondere esattamente, ma sto cercando una stima del parco palla.

Risposte:


12

Se hai una distro che supporta la dir_indexfunzionalità, puoi facilmente avere 200.000 file in una singola directory. Lo terrei a circa 25.000, solo per sicurezza. Senza dir_index, prova a mantenerlo a 5.000.


10

Essere molto attenti a come si seleziona la scissione directory. "a / b / c" suona come una ricetta per il disastro per me ...

Non solo andare ciecamente a creare una struttura profonda di più directory, ad esempio 100 voci nel primo livello, 100 voci nel secondo livello, 100 voci nel terzo. Sono stato lì, l'ho fatto, ho preso la giacca e ho dovuto ristrutturarla quando le prestazioni sono andate al crapper con qualche milione di file. :-)

Abbiamo un client che ha fatto il layout delle "directory multiple", e finisce per mettere da uno a cinque file per directory, e questo li stava uccidendo. 3 a 6 ore per fare un "du" in questa struttura di directory. Il salvatore qui era SSD, non erano disposti a riscrivere questa parte della loro applicazione e un SSD ha impiegato questo du time da ore a minuti.

Il problema è che ogni livello di ricerche di directory richiede ricerche e le ricerche sono estremamente costose. Anche la dimensione della directory è un fattore, quindi averla più piccola piuttosto che più grande è una grande vittoria.

Per rispondere alla tua domanda su quanti file per directory, 1.000 ne ho sentito parlare come "ottimali" ma le prestazioni a 10.000 sembrano andare bene.

Quindi, ciò che consiglierei è un livello di directory, ogni livello è lungo una directory di 2 caratteri, composto da lettere maiuscole e minuscole e cifre, per circa 3800 directory nel livello superiore. È quindi possibile conservare i file 14M con quelle sottodirectory contenenti 3800 file o circa 1.000 file per sottodirectory per i file 3M.

Ho fatto una modifica come questa per un altro cliente, e ha fatto un'enorme differenza.


6

Ti suggerirei di provare varie dimensioni di directory con uno strumento di benchmarking come il timbro postale , perché ci sono molte variabili come la dimensione della cache (sia nel sistema operativo che nel sottosistema del disco) che dipendono dal tuo ambiente particolare.

La mia regola personale è mirare a una dimensione della directory di <= 20k file, anche se ho visto prestazioni relativamente decenti con un massimo di 100k file / directory.


3

Ho tutti i file andare cartelle come:

uploads / [data] / [ora] /yo.png

e non avere problemi di prestazioni.


4
E quanti file ricevi all'ora?
Cascabel,


2

Posso confermare su un server piuttosto potente con un sacco di memoria sotto un carico decente che 70.000 file possono causare ogni sorta di caos. Sono andato a rimuovere una cartella cache con 70k file e questo ha fatto sì che apache iniziasse a generare nuove istanze fino a quando non raggiungeva il massimo a 255 e il sistema utilizzava tutta la memoria libera (16 GB anche se l'istanza virtuale potrebbe essere stata inferiore). Ad ogni modo, tenerlo sotto i 25.000 è probabilmente una mossa molto prudente


1

Nella mia esperienza, l'approccio migliore è quello di non progettare in anticipo la struttura dei file. Come menzionato in almeno un'altra risposta, esistono estensioni del filesystem che si occupano della fine del problema delle prestazioni.

Il problema che ho riscontrato più frequentemente è l'usabilità a livello amministrativo. La minima quantità di lavoro che puoi fare per ridurre il numero di file in una directory è probabilmente l'approccio di cui hai bisogno in questo momento.

sqrt (3_000_000) == 1732

Un paio di migliaia di file in una singola directory mi sembrano ragionevoli. Sii il tuo giudice per la tua situazione. Per ottenere ciò, prova a dividere i file in un singolo livello di directory hash in modo che il numero medio di file per directory sia circa uguale al numero di directory.

Dato il tuo esempio, questo sarebbe ./a/abc.ext, ./ab/abc.ext, ./abc/abc.ext, ....

La diffusione dei file dipenderà fortemente dai nomi dei file effettivi. Immagina di applicare questa tecnica a una directory di un milione di file ciascuno chiamato foobar???.txt. Esistono modi per ottenere una diffusione più uniforme, come l'hashing basato sul valore di un determinato numero di bit dalla somma MD5 di ciascun nome file, ma oserò indovinare che sarebbe eccessivo per quello che stai cercando di ottenere.


1

Hmm, ho letto questo articolo di recente . In sostanza, sfrutti la distribuzione del tuo algoritmo di hashing preferito. Ho iniziato a giocare con i numeri, un MySQL firmato INT ha un valore massimo di 2147483647. Puoi anche variare il numero desiderato di file per directory e il numero di sottodirectory da impostare sul numero finale di sottodirectory / file- suddivisione per directory per un determinato set di dati, ma è difficile trovare prove empiriche su organizzazioni di directory / file ottimali. Questo articolo fornisce alcune informazioni sulle differenze di prestazioni tra i filesystem (alcune metriche interessanti), ma nulla sulle organizzazioni ottimali.


0

Penso che ci stia pensando troppo. Se scegliessi un singolo livello aggiuntivo di directory e riuscissi a bilanciare le cose in modo uniforme, avresti 1732 * directory e 1732 file per directory.

A meno che non prevediate di aver bisogno di decine di miliardi di file, è possibile scegliere un numero compreso tra 1000 e 100.000 e ottenere buoni risultati.

* radice quadrata di 3 milioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.