Filesystem numero elevato di file in una singola directory


29

OK, non così grande, ma devo usare qualcosa in cui sono memorizzati circa 60.000 file con dimensioni medie di 30kb in una singola directory (questo è un requisito, quindi non posso semplicemente dividere in sottodirectory con un numero inferiore di file).

I file saranno accessibili in modo casuale, ma una volta creati non ci saranno scritture sullo stesso filesystem. Attualmente sto usando Ext3 ma lo trovo molto lento. Eventuali suggerimenti?


3
Perché devono trovarsi in una directory?
Kyle Brandt,

1
Sono anche interessato a una risposta aggiornata alla domanda originale, dati i miglioramenti sufficienti in xfs ed ext4.

Risposte:


15

Dovresti considerare XFS. Supporta un numero molto elevato di file sia a livello di file system che a livello di directory e le prestazioni rimangono relativamente coerenti anche con un numero elevato di voci a causa della struttura dei dati della struttura B +.

C'è una pagina sulla loro wiki per un gran numero di articoli e pubblicazioni che descrivono in dettaglio il design. Ti consiglio di provarlo e confrontarlo con la tua soluzione attuale.


secondo le diapositive nella risposta di @ nelaar, ext4 sarebbe superiore a xfs per questo compito.
Mulllhausen,

13

Un miliardo di file su Linux

L'autore di questo articolo analizza alcuni dei problemi di prestazioni sui file system con un numero elevato di file e fa dei bei confronti delle prestazioni dei vari file system ext3, ext4 e XFS. Questo è reso disponibile come presentazione. http://events.linuxfoundation.org/slides/2010/linuxcon2010_wheeler.pdf

tempo di eseguire mkfs tempo di creare file 1M 50kb Tempo di riparazione del file system rimozione di file da 1m


2
Preferiamo davvero che le risposte contengano contenuto non puntatori al contenuto. Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
user9517 supporta GoFundMonica il

@Iain spero che sia meglio, semplicemente scaricando il PDF, ti darei le stesse informazioni.
nelaaro,

19
wow questi sono alcuni grafici eccezionalmente difficili da leggere. ~
ThorSummoner,

8

Molti file in una directory su ext3 sono stati discussi a lungo nel sito sorella stackoverflow.com

A mio avviso, 60.000 file in una directory su ext3 sono tutt'altro che ideali, ma a seconda degli altri requisiti potrebbe essere abbastanza buono.


5

OK. Ho fatto alcuni test preliminari usando ReiserFS, XFS, JFS, Ext3 (dir_hash abilitato) ed Ext4dev (kernel 2.6.26). La mia prima impressione è stata che tutti fossero abbastanza veloci (sulla mia robusta workstation) - si scopre che la macchina di produzione remota ha un processore abbastanza lento.

Ho sperimentato alcune stranezze con ReiserFS anche durante i test iniziali, quindi l'ho escluso. Sembra che JFS abbia il 33% in meno di CPU rispetto a tutti gli altri e quindi lo testerà sul server remoto. Se funziona abbastanza bene, lo userò.


5

Sto scrivendo un'applicazione che memorizza anche molti file anche se i miei sono più grandi e ne ho 10 milioni che li suddividerò in più directory.

ext3 è lento principalmente a causa dell'implementazione predefinita "elenco collegato". Quindi, se hai molti file in una directory, significa che aprirne o crearne un'altra diventerà sempre più lento. C'è qualcosa chiamato un indice htree disponibile per ext3 che secondo come riferito migliora notevolmente le cose. Ma è disponibile solo per la creazione di filesystem. Vedi qui: http://lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/

Dato che dovrai ricostruire il filesystem comunque e per via delle limitazioni di ext3, la mia raccomandazione è di guardare ext4 (o XFS). Penso che ext4 sia un po 'più veloce con file più piccoli e abbia ricostruzioni più veloci. L'indice Htree è predefinito su ext4 per quanto ne so. Non ho alcuna esperienza con JFS o Reiser, ma ho sentito che la gente lo consiglia prima.

In realtà, probabilmente testerei diversi filesystem. Perché non provare ext4, xfs & jfs e vedere quale offre le migliori prestazioni complessive?

Qualcosa che uno sviluppatore mi ha detto che può accelerare le cose nel codice dell'applicazione non è fare una chiamata "stat + open" ma piuttosto "open + fstat". Il primo è significativamente più lento del secondo. Non sono sicuro di avere alcun controllo o influenza su questo.

Vedi il mio post qui su StackOverflow. Memorizzare e accedere a un massimo di 10 milioni di file in Linux ci sono alcune risposte e collegamenti molto utili.


3

L'uso di tune2fs per abilitare dir_index potrebbe essere d'aiuto. Per vedere se è abilitato:

sudo tune2fs -l /dev/sda1 | grep dir_index

Se non è abilitato:

sudo umount /dev/sda1   
sudo tune2fs -O dir_index /dev/sad1
sudo e2fsck -D /dev/sda1
sudo mount /dev/sda1

Ma ho la sensazione che potresti seguire una strada sbagliata ... perché non generare un indice piatto e usare del codice per selezionare in modo casuale basato su quello. È quindi possibile utilizzare le sottodirectory per una struttura ad albero più ottimizzata.


1
era /dev/sad1intenzionale prevenire errori di copia / pasta?
Anwar,

2

ext3 e precedenti supportano fino a 32768 file per directory. ext4 supporta fino a 65536 nel conteggio effettivo dei file, ma ti permetterà di averne di più (semplicemente non li memorizzerà nella directory, il che non ha importanza per la maggior parte degli utenti).

Inoltre, il modo in cui le directory sono archiviate su filesystem ext * è essenzialmente come un grande elenco. Sui filesystem più moderni (Reiser, XFS, JFS) sono archiviati come alberi B, che sono molto più efficienti per grandi set.


2
supportare quel numero di file in una directory non è la stessa cosa che farlo a una velocità ragionevole. non so ancora se ext4 sia migliore, ma ext3 rallenta notevolmente quando ha più di qualche migliaio di file in una directory, anche con dir_index attivato (aiuta, ma non elimina del tutto il problema).
Caso

1

È possibile memorizzare gli inode dei file anziché i nomi dei file: l'accesso ai numeri degli inode dovrebbe essere molto più veloce della risoluzione dei nomi dei file


Ora dimmi. Come si apre un file per numero di inode?
Matt,

1
@Matt, sembra che la domanda sia cambiata dopo che ho risposto. O ero molto più stupido 1,5 anni fa :)))
kolypto

0

Non vuoi stipare quel numero di file in una directory, vuoi una sorta di struttura. Anche se è qualcosa di semplice come avere sottodirectory che iniziano con il primo carattere del file può migliorare i tempi di accesso. Un altro trucco sciocco che mi piace usare è quello di forzare il sistema ad aggiornare la sua cache con metainformation è quello di eseguire updateb regolarmente. In una finestra esegui slabtop, e in un'altra esegui updateb e vedrai che molta memoria verrà allocata nella cache. È molto più veloce in questo modo.


-1

Non hai specificato il tipo di dati in questi file. Ma dai suoni di ciò, dovresti usare una sorta di database con indicizzazione per ricerche rapide.


-1

Il filesystem non è probabilmente la memoria ideale per tale requisito. Qualche tipo di archiviazione del database è migliore. Tuttavia, se non puoi farne a meno, prova a dividere i file in diverse directory e usa unionfs per montare (associare) quelle directory su una singola directory in cui vuoi che appaiano tutti i file. Non ho usato questa tecnica per accelerare, ma vale la pena provare.

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.