Linux: quanti dischi I / O ci vogliono per leggere un file? Come minimizzarlo?

Secondo questo articolo su Haystack di Facebook:

" A causa del modo in cui gli apparecchi NAS gestiscono i metadati della directory, l'immissione di migliaia di file in una directory è stata estremamente inefficace poiché il block di directory della directory era troppo grande per essere memorizzato in modo efficace dall'appliance. Di conseguenza è stato comune avere più di 10 operazioni di disco per recuperare un un'image singola Dopo aver ridotto le size delle directory a centinaia di immagini per directory, il sistema risultante presenterebbe generalmente tre operazioni di disco per recuperare un'image: una per leggere i metadati della directory in memory, un secondo per caricare l'inode in memory e un terzo per leggere i contenuti del film " .

Avevo assunto che la directory dei file system metadati e inode sarebbero sempre memorizzati nella RAM dalla OS e un file di lettura richiederebbe solitamente solo 1 disco IO.

È questo problema "multiplo di IO per leggere un singolo file" descritto in quella carta unica per gli apparecchi NAS o Linux ha lo stesso problema?

Sto progettando di eseguire un server Linux per la visualizzazione delle immagini. In qualsiasi modo posso minimizzare il numero di disco IO – assicurandoti che il sistema operativo cache tutti i dati di directory e di inode in RAM e che each lettura di file richiede solo più di un disco IO?

  • Autenticazione SSSD
  • Curl: distriggers la verifica del certificato
  • Recuperare uno script in esecuzione da una session terminal
  • Postfix e Sendmail smsmp cron lavoro
  • Conservare i symlinks di destinazione esistenti con rsync
  • Come installare Mysql 5.6 su disfunction Debian 7
  • Miglior sapore Linux per lo sviluppo di applicazioni web (LAMP)
  • Avviare la connessione di networking dal recupero Ubuntu?
  • 3 Solutions collect form web for “Linux: quanti dischi I / O ci vogliono per leggere un file? Come minimizzarlo?”

    Linux ha lo stesso "problema". Ecco un documento uno studente di mia pubblicazione due anni fa, where l'effetto è mostrato su Linux. Gli IO multipli possono provenire da diverse fonti:

    • Ricerca directory su each livello di directory del path del file. Può essere necessario leggere l'inode della directory e uno o più blocchi di immissione della rubrica
    • Inode del file

    Nel model normale IO, la memorizzazione nella cache è davvero efficace e inodes, directory e blocchi di dati vengono allocati in modi che riducono la ricerca. Tuttavia, il metodo di ricerca normale, in realtà condiviso da tutti i file system, è cattivo per traffico fortemente randomizzato.

    Ecco alcune idee:

    1) Le cache relative ai filesystem aiutano. Una grande cache assorbe la maggior parte delle letture. Tuttavia, se si desidera mettere più dischi in una macchina, il rapporto Disk-to-RAM limita la quantità di cache.

    2) Non utilizzare milioni di piccoli file. Aggregarli a file più grandi e memorizzare il nome del file e l'offset all'interno del file.

    3) Mettere o cache i metadati su un SSD.

    4) E naturalmente utilizzare un filesystem che non dispone di un formato totalmente anarchico di directory. Un lettore di lettura non dovrebbe prendere più del tempo lineare e l'accesso diretto ai file in modo ideale solo il tempo logaritmico.

    Mantenere le directory piccole (less di 1000 o così) non dovrebbe aiutare così tanto perché avresti bisogno di più directory con la necessità di essere memorizzati nella cache.

    Ciò dipende dal filesystem che si intende utilizzare. Prima di leggere i file system:

    • Leggete il file della directory.
    • Leggere l'inode del tuo file
    • Leggete i settori del tuo file

    Se la cartella contiene un enorme numero di file, questo è un grosso preassaggio sulla cache.

    Probabilmente non sarai in grado di conservare tutti i dati di directory e di inode in RAM, poiché probabilmente hai più dati di directory e di inode rispetto alla RAM. Potresti anche non desiderare, poiché quella RAM potrebbe essere meglio utilizzata per altri scopi; nel tuo esempio di image, non preferisci avere i dati di un'image di accesso frequentemente memorizzata nella RAM che la voce di directory per un'image non accessibile?

    Detto questo, penso che la manopola vfs_cache_pressure sia usata per controllare questo. "Quando vfs_cache_pressure = 0, il kernel non recupererà mai dentries e inodes dovuto alla pressione di memory e questo può facilmente portre a condizioni di memory fuori memory".

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.