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 :
-
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. - Utilisez
ls -ld
oustat
au lieu dels -l
. Ces opérations sont beaucoup plus rapides sur les répertoires volumineux quels -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]$
-
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 commandeuname.
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 queuname
et prend en charge les indicateursuname
communs, y compris-r
et-a
.Par exemple :
$ uptrack-uname -r 4.14.35-1902.302.2.el7uek.x86_64
-
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 appelsREADDIRPLUS
à l'aide de l'optionnordirplus
lors du montage. Pour désactiver les opérations NFSREADDIRPLUS
sur l'instance :- Ouvrez une fenêtre de terminal sur l'instance.
-
Démontez le système de fichiers avec la commande
umount
. Par exemple :sudo umount 10.x.x.x:/fs-export-path /mnt/yourmountpoint
-
Montez de nouveau le système de fichiers et incluez l'option
-o nordirplus
pour désactiverREADDIRPLUS
. Par exemple :sudo mount -o nordirplus 10.x.x.x:/fs-export-path /mnt/yourmountpoint