Las operaciones de metadatos como ls -l, du o find son lentas

Cuando un directorio supera los 100 000 archivos, las operaciones de metadatos como ls -l, du o find son lentas.

Por lo general, se espera que ls -l en un directorio de File Storage con 100 000 archivos se complete en <= 10 segundos. El tamaño del directorio no afecta significativamente al rendimiento de escritura del almacenamiento de archivos. Si observa lentitud de lectura/ escritura, asegúrese de no utilizar las opciones de montaje NFS rsize y wsize con un valor inferior a 1048576. Como práctica recomendada, no especifique las opciones de montaje rsize y wsize, déjelas en su valor por defecto 1048576.

Causa: las operaciones de exploración de directorios como ls, du, find y rsync en un directorio que contiene 100 000 archivos tardan más en el almacenamiento de archivos.

Soluciones:

  1. Permite redistribuir archivos en subdirectorios en lugar de almacenar un gran volumen de archivos en un solo directorio. Recomendamos utilizar subdirectorios para mantener los tamaños de directorio por debajo de 100 000 archivos.

    Consejo

    Mantener los tamaños de directorio pequeños mediante el uso de subdirectorios es una práctica recomendada para File Storage.
  2. Utilice ls -ld o stat en lugar de ls -l. Estas operaciones son mucho más rápidas en directorios grandes que ls -l.

    Por ejemplo:

    [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 veces, una incidencia de cliente NFS puede provocar que las operaciones de exploración de directorios entren en un bucle y den lugar a un aumento del tiempo de exploración. Esta incidencia ha afectado a las siguientes versiones de Oracle Linux:

    • Oracle Linux 6
    • Oracle Linux 7 con versiones de Unbreakable Enterprise Kernel (UEK) anteriores a 4.14.35-1902.301.1

    Si utiliza Oracle Linux 6, cambie la versión a Oracle Linux 7 o posterior. Se recomienda la última versión.

    Los usuarios de Oracle Linux 7 pueden ejecutar el comando uname -a para comprobar la versión de UEK. Si la versión de UEK es anterior a 4.14.35-1902.301.1, cambie la versión a una versión de núcleo posterior. El parche que soluciona este comportamiento se publicó el 17 de abril de 2020 y se puede instalar con Oracle Ksplice.

    Oracle Ksplice le permite aplicar importantes actualizaciones de seguridad y otras actualizaciones de núcleo críticas sin reiniciar. Oracle Ksplice se debe instalar en la instancia. Después de instalar Ksplice, puede instalar los parches de Ksplice disponibles. Consulte Oracle Ksplice para obtener instrucciones.

    Después de instalar el parche, puede verificar la versión efectiva del núcleo. uptrack de Ksplice no cambia la salida del comando uname. uname sigue reflejando la versión del núcleo en el que se ha iniciado la instancia.

    En su lugar, utilice uptrack-uname para ver qué núcleo efectivo está ejecutando una instancia. uptrack-uname tiene el mismo formato que uname y soporta los indicadores de uname comunes, incluidos -r y -a.

    Por ejemplo: 

    $ uptrack-uname -r
    4.14.35-1902.302.2.el7uek.x86_64
  4. Las operaciones de exploración de directorios llaman a la llamada NFS READDIRPLUS, que es costosa cuando el directorio contiene muchos archivos. Las instancias pueden desactivar las llamadas READDIRPLUS mediante la opción nordirplus al realizar el montaje. Para desactivar las operaciones NFS READDIRPLUS en la instancia:

    1. Abra una ventana de terminal en la instancia.
    2. Desmonte el sistema de archivos con el comando umount. Por ejemplo:

      sudo umount 10.x.x.x:/fs-export-path /mnt/yourmountpoint
    3. Vuelva a montar el sistema de archivos e incluya la opción -o nordirplus para desactivar READDIRPLUS. Por ejemplo:

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