GNU/Linux >> Linux Esercitazione >  >> Linux

Quali sono le implicazioni sulle prestazioni per milioni di file in un file system moderno?

Soluzione 1:

Il motivo per cui si creerebbe questo tipo di struttura di directory è che i filesystem devono individuare un file all'interno di una directory, e più grande è la directory, più lenta è l'operazione.

Quanto più lento dipende dal design del filesystem.

Il filesystem ext4 utilizza un albero B per memorizzare le voci della directory. Si prevede che una ricerca in questa tabella richieda O(log n) time, che la maggior parte delle volte è inferiore all'ingenua tabella lineare utilizzata da ext3 e dai filesystem precedenti (e quando non lo è, la directory è troppo piccola perché abbia davvero importanza).

Il filesystem XFS usa invece un albero B+. Il vantaggio di questo su una tabella hash o B-tree è che ogni nodo può avere più figli b , dove in XFS b varia e può arrivare fino a 254 (o 19 per il nodo radice; e questi numeri potrebbero non essere aggiornati). Questo ti dà una complessità temporale di O(logb n) , un grande miglioramento.

Ciascuno di questi filesystem può gestire decine di migliaia di file in una singola directory, con XFS che è significativamente più veloce di ext4 su una directory con lo stesso numero di inode. Ma probabilmente non vuoi una singola directory con inode 3M, poiché anche con un albero B + la ricerca può richiedere del tempo. Questo è ciò che ha portato alla creazione di directory in questo modo in primo luogo.

Per quanto riguarda le strutture proposte, la prima opzione che hai fornito è esattamente ciò che viene mostrato negli esempi di nginx. Funzionerà bene su entrambi i filesystem, anche se XFS avrà ancora un po' di vantaggio. La seconda opzione potrebbe funzionare leggermente meglio o leggermente peggio, ma probabilmente sarà abbastanza vicina, anche nei benchmark.

Soluzione 2:

Nella mia esperienza, uno dei fattori di ridimensionamento è la dimensione degli inode data una strategia di partizionamento del nome hash.

Entrambe le opzioni proposte creano fino a tre voci inode per ogni file creato. Inoltre, 732 file creeranno un inode che è ancora inferiore ai soliti 16 KB. Per me, questo significa che entrambe le opzioni funzioneranno allo stesso modo.

Ti applaudo per il tuo breve hash; i sistemi precedenti su cui ho lavorato hanno preso lo sha1sum del file specificato e le directory unite in base a quella stringa, un problema molto più difficile.

Soluzione 3:

Certamente entrambe le opzioni aiuteranno a ridurre il numero di file in una directory a qualcosa che sembra ragionevole, per xfs o ext4 o qualsiasi altro file system. Non è ovvio quale sia il migliore, bisognerebbe provare per dirlo.

Il benchmark con la tua applicazione che simula qualcosa come il vero carico di lavoro è l'ideale. Altrimenti, crea qualcosa che simuli specificamente molti piccoli file. A proposito, eccone uno open source chiamato smallfile. La sua documentazione fa riferimento ad altri strumenti.

hdparm fare I/O sostenuti non è così utile. Non mostrerà i molti piccoli I/O o le enormi voci di directory associate a moltissimi file.


Linux
  1. Qual è la giusta quantità di spazio di scambio per un moderno sistema Linux?

  2. Che cosa significa "rc" in .bashrc?

  3. A cosa servono gli inode?

  4. 7zip, Xz, Gzip, Tar, ecc:quali sono le differenze??

  5. Quali sono le opzioni di montaggio per migliorare le prestazioni del filesystem ext4 in Linux

Scegli il miglior file system per il tuo Linux

A cosa servono i file .la di libtool?

Qual è il limite massimo di file aperti su Linux?

Qual è una buona soluzione per la codifica dei file in Linux?

Quali sono i file più comuni da controllare con il software di monitoraggio dell'integrità dei file?

Quali sono i diversi modi per impostare i permessi dei file ecc. su gnu/linux