Lenteur des opérations de métadonnées telles que ls -l, du ou find

Lorsqu'un répertoire dépasse 100 000 fichiers, les opérations de métadonnées telles que ls -l, du ou find sont lentes.

En général, l'opération ls -l dans un répertoire de stockage de fichiers avec 100 000 fichiers devrait se terminer en <= 10 secondes. La taille du répertoire n'a pas d'incidence significative sur le débit d'écriture du stockage de fichiers. Si vous constatez une lenteur en lecture et en écriture, assurez-vous de ne pas utiliser les options de montage NFS rsize et wsize avec une valeur inférieure à 1048576. À titre de meilleure pratique, ne spécifiez pas les options de montage rsize et wsize, laissez-les à leur valeur par défaut 1048576.

Cause : Les opérations de balayage de répertoire telles que ls, du, find et rsync dans un répertoire contenant 100 000 fichiers prennent plus de temps dans le stockage de fichiers.

Solutions :

  1. Redistribuez les fichiers dans des sous-répertoires au lieu de stocker un volume important de fichiers dans un même répertoire. Il est recommandé d'utiliser des sous-répertoires pour que la taille des répertoires reste inférieure à 100 000 fichiers.

    Conseil

    Pour le stockage de fichiers, il est recommandé de limiter la taille des répertoires à l'aide de sous-répertoires.
  2. Utilisez ls -ld ou stat au lieu de ls -l. Ces opérations sont beaucoup plus rapides sur les répertoires volumineux que ls -l.

    Par exemple :

    [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. Parfois, un problème de client NFS peut entraîner l'entrée des opérations de balayage de répertoire dans une boucle et donc une augmentation du temps de balayage. Ce problème a touché les versions Oracle Linux suivantes :

    • Oracle Linux 6
    • Oracle Linux 7 avec versions Unbreakable Enterprise Kernel (UEK) antérieures à 4.14.35-1902.301.1

    Si vous utilisez Oracle Linux 6, effectuez une mise à niveau vers Oracle Linux 7 ou une version ultérieure. La dernière version est recommandée.

    Les utilisateurs d'Oracle Linux 7 peuvent exécuter la commande uname -a pour vérifier la version d'UEK. Si la version UEK est antérieure à la version 4.14.35-1902.301.1, effectuez une mise à niveau vers une version ultérieure du noyau. Le correctif traitant ce comportement a été mis à disposition le 17 avril 2020 et peut être installé avec Oracle Ksplice.

    Oracle Ksplice vous permet d'appliquer les mises à jour de sécurité importantes et d'autres mises à jour de noyau critiques sans redémarrage. Oracle Ksplice doit être installé sur l'instance. Après avoir installé Ksplice, vous pouvez installer les correctifs Ksplice disponibles. Pour obtenir des instructions, voir Oracle Ksplice.

    Après avoir installé le correctif, vous pouvez vérifier la version en vigueur du noyau. Ksplice uptrack ne modifie pas la sortie de la commande uname. uname continue de refléter la version du noyau dans laquelle l'instance a été démarrée.

    À la place, utilisez uptrack-uname pour voir sur quel noyau en vigueur une instance s'exécute. uptrack-uname a le même format que uname et prend en charge les indicateurs uname communs, y compris -r et -a.

    Par exemple : 

    $ uptrack-uname -r
    4.14.35-1902.302.2.el7uek.x86_64
  4. Les opérations de balayage de répertoire invoquent l'appel NFS READDIRPLUS, ce qui est coûteux lorsque le répertoire contient de nombreux fichiers. Les instances peuvent désactiver les appels READDIRPLUS à l'aide de l'option nordirplus lors du montage. Pour désactiver les opérations NFS READDIRPLUS sur l'instance :

    1. Ouvrez une fenêtre de terminal sur l'instance.
    2. Démontez le système de fichiers avec la commande umount. Par exemple :

      sudo umount 10.x.x.x:/fs-export-path /mnt/yourmountpoint
    3. Montez de nouveau le système de fichiers et incluez l'option -o nordirplus pour désactiver READDIRPLUS. Par exemple :

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