Operazioni di metadati come ls -l, du o find sono lente

Quando una directory supera i 100.000 file, le operazioni sui metadati, ad esempio ls -l, du o find, sono lente.

In genere, il completamento di ls -l in una directory di storage di file con 100.000 file è previsto in <= 10 secondi. La dimensione della directory non influisce in modo significativo sul throughput di scrittura dello storage di file. Se viene indicata la lentezza di lettura/scrittura, assicurarsi che non si stiano utilizzando le opzioni di attivazione NFS rsize e wsize con un valore inferiore a 1048576. Come procedura ottimale, non specificare le opzioni di attivazione rsize e wsize, lasciandole al valore predefinito 1048576.

Causa: le operazioni di scansione delle directory quali ls, du, find e rsync in una directory contenente 100.000 file richiedono più tempo nello storage di file.

Soluzioni:

  1. Ridistribuire i file in sottodirectory invece di memorizzare un grande volume di file in una singola directory. Si consiglia di utilizzare le sottodirectory per mantenere le dimensioni delle directory inferiori a 100.000 file.

    Suggerimento

    Il mantenimento di dimensioni ridotte delle directory mediante l'uso di sottodirectory è una procedura consigliata per lo storage di file.
  2. Utilizzare ls -ld o stat invece di ls -l. Queste operazioni sono molto più veloci su directory di grandi dimensioni rispetto a ls -l.

    Ad esempio:

    [opc@instance01 dd]$ time ls -l|wc -l
    401425
    real 0m39.786s
    user 0m4.389s
    sys 0m5.403s
    [opc@instance01 dd]$ time ls -ld
    drwxrwxr-x. 4 opc opc 401424 Apr 17 14:18 .
    real 0m0.009s
    user 0m0.001s
    sys 0m0.003s
    [opc@instance01 dd]$ time stat .|grep Size
      Size: 401424     Blocks: 785        IO Block: 32768  directory
    real 0m0.010s
    user 0m0.002s
    sys 0m0.003s
    [opc@instance01 dd]$
  3. A volte, un problema del client NFS potrebbe causare operazioni di scansione delle directory per entrare in un loop e portare ad un aumento dei tempi di scansione. Questo problema ha interessato le seguenti versioni di Oracle Linux:

    • Oracle Linux 6
    • Oracle Linux 7 con versioni Unbreakable Enterprise Kernel (UEK) precedenti alla 4.14.35-1902.301.1

    Se utilizzi Oracle Linux 6, esegui l'upgrade a Oracle Linux 7 o versione successiva. Si consiglia l'ultima versione.

    Gli utenti di Oracle Linux 7 possono eseguire il comando uname -a per controllare la versione di UEK. Se la versione UEK è precedente alla 4.14.35-1902.301.1, eseguire l'aggiornamento a una versione kernel successiva. La patch per risolvere questo problema è stata resa disponibile il 17 aprile 2020 e può essere installata con Oracle Ksplice.

    Oracle Ksplice ti consente di applicare importanti aggiornamenti di sicurezza e altri aggiornamenti critici del kernel senza riavviare il sistema. Oracle Ksplice deve essere installato nell'istanza. Dopo aver installato Ksplice, è possibile installare le patch Ksplice disponibili. Per istruzioni, vedere Oracle Ksplice.

    Dopo aver installato la patch, è possibile verificare la versione del kernel efficace. Ksplice uptrack non modifica l'output del comando uname. uname continua a riflettere la versione del kernel in cui è stato eseguito il boot dell'istanza.

    In alternativa, utilizzare uptrack-uname per visualizzare il kernel efficace in esecuzione di un'istanza. uptrack-uname ha lo stesso formato di uname e supporta i flag uname comuni, inclusi -r e -a.

    Ad esempio: 

    $ uptrack-uname -r
    4.14.35-1902.302.2.el7uek.x86_64
  4. Le operazioni di scansione delle directory richiamano la chiamata NFS READDIRPLUS, che è costosa quando la directory contiene molti file. Le istanze possono disabilitare le chiamate READDIRPLUS utilizzando l'opzione nordirplus durante l'attivazione. Per disabilitare le operazioni NFS READDIRPLUS nell'istanza:

    1. Aprire una finestra di terminale sull'istanza.
    2. Disattivare il file system con il comando umount. Ad esempio:

      sudo umount 10.x.x.x:/fs-export-path /mnt/yourmountpoint
    3. Riattivare il file system e includere l'opzione -o nordirplus per disabilitare READDIRPLUS. Ad esempio:

      sudo mount -o nordirplus 10.x.x.x:/fs-export-path /mnt/yourmountpoint