Metadatenvorgänge wie ls -l, du oder find sind langsam

Wenn ein Verzeichnis mehr als 100.000 Dateien enthält, sind Metadatenvorgänge wie ls -l, du oder find langsam.

Im Allgemeinen wird die Ausführung von ls -l für ein File Storage-Verzeichnis mit 100.000 Dateien in <= 10 Sekunden abgeschlossen. Die Verzeichnisgröße beeinflusst den Schreibdurchsatz von File Storage nicht wesentlich. Wenn das Lesen/Schreiben langsam ist, stellen Sie sicher, dass Sie die NFS-Mountoptionen rsize und wsize nicht mit einem Wert kleiner als 1048576 verwenden. Als Best Practice geben Sie die Mountoptionen rsize und wsize nicht an, sondern den Standardwert 1048576.

Ursache: Directory-Scanvorgänge wie ls, du, find und rsync in einem Verzeichnis mit 100.000 Dateien dauern in File Storage länger.

Lösungen:

  1. Teilen Sie die Dateien neu in Unterordner auf, anstatt große Dateimengen in nur einem Verzeichnis zu speichern. Es wird empfohlen, Unterverzeichnisse zu verwenden, um die Größe einzelner Verzeichnisse auf weniger als 100.000 Dateien zu beschränken.

    Tipp

    Als Best Practice für File Storage wird empfohlen, die Verzeichnisgrößen durch die Verwendung von Unterverzeichnissen klein zu halten.
  2. Verwenden Sie ls -ld oder stat anstelle von ls -l. Diese Vorgänge sind bei großen Verzeichnissen wesentlich schneller als ls -l.

    Beispiel:

    [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. Manchmal kann ein Problem mit dem NFS-Client dazu führen, dass Verzeichnisscanvorgänge in eine Schleife geraten und es dadurch zu einem Anstieg der Scanzeit kommt. Dieses Problem betrifft die folgenden Oracle Linux-Versionen:

    • Oracle Linux 6
    • Oracle Linux 7 mit Unbreakable Enterprise Kernel-(UEK-)Versionen vor 4.14.35-1902.301.1

    Wenn Sie Oracle Linux 6 verwenden, führen Sie ein Upgrade auf Oracle Linux 7 oder höher durch. Die neueste Version wird empfohlen.

    Oracle Linux 7-Benutzer können durch Ausführen des Befehls uname -a die UEK-Version überprüfen. Wenn es sich um eine UEK-Version vor 4.14.35-1902.301.1 handelt, führen Sie ein Upgrade auf eine spätere Kernelversion durch. Ein Patch zur Behebung dieses Verhaltens wurde am 17. April 2020 veröffentlicht und kann mit Oracle Ksplice installiert werden.

    Mit Oracle Ksplice können Sie wichtige Sicherheits- und andere kritische Kernelupdates ohne einen Neustart einspielen. Oracle Ksplice muss auf der Instanz installiert werden. Nach der Installation von Ksplice können Sie verfügbare Ksplice-Patches installieren. Weitere Informationen finden Sie unter Oracle Ksplice.

    Nachdem Sie den Patch installiert haben, können Sie die gültige Kernelversion überprüfen. Ksplice uptrack ändert die Ausgabe des uname-Befehls nicht. uname reflektiert weiterhin die Version des Kernels, in dem die Instanz gebootet wurde.

    Verwenden Sie stattdessen uptrack-uname, um zu ermitteln, welcher gültige Kernel eine Instanz ausführt. uptrack-uname hat dasselbe Format wie uname und unterstützt die allgemeinen uname-Flags, einschließlich -r und -a.

    Beispiel: 

    $ uptrack-uname -r
    4.14.35-1902.302.2.el7uek.x86_64
  4. Verzeichnisscanvorgänge rufen den NFS-Aufruf READDIRPLUS auf, der teuer ist, wenn das Verzeichnis viele Dateien enthält. Für Instanzen können READDIRPLUS-Aufrufe mit der Option nordirplus beim Mounten deaktiviert werden. So deaktivieren SieREADDIRPLUS-NFS-Vorgänge für eine Instanz:

    1. Öffnen Sie ein Terminalfenster auf der Instanz.
    2. Unmounten Sie das Dateisystem mit dem Befehl umount. Beispiel:

      sudo umount 10.x.x.x:/fs-export-path /mnt/yourmountpoint
    3. Mounten Sie das Dateisystem erneut, und fügen Sie die Option -o nordirplus hinzu, um READDIRPLUS zu deaktivieren. Beispiel:

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