J'ai écrit un programme buggy qui a accidentellement créé environ 30 millions de fichiers sous/tmp. (Le bogue a été introduit il y a quelques semaines et il créait quelques sous-répertoires par seconde.) Je pouvais renommer/tmp en/tmp2, et maintenant je dois supprimer les fichiers. Le système est FreeBSD 10, le système de fichiers racine est zfs.
Pendant ce temps, l'un des disques du miroir a mal tourné et je l'ai remplacé. Le lecteur dispose de deux disques SSD de 120 Go.
Voici la question: le remplacement du disque dur et la réargenture de l'ensemble de la baie ont pris moins d'une heure. La suppression de fichiers/tmp2 est une autre histoire. J'ai écrit un autre programme pour supprimer les fichiers, et il ne peut supprimer que 30 à 70 sous-répertoires par seconde. La suppression de tous les fichiers prendra entre 2 et 4 jours.
Comment est-il possible que la réargenture de l'ensemble de la baie prenne une heure, mais que la suppression du disque prenne 4 jours? Pourquoi mes performances sont-elles si mauvaises? 70 suppressions/seconde semblent très très mauvaises performances.
Je pourrais supprimer manuellement l'inode de/tmp2, mais cela ne libérera pas de l'espace, non?
Serait-ce un problème avec zfs, ou les disques durs ou quoi?
Les suppressions dans ZFS coûtent cher. Encore plus si vous avez activé la déduplication sur le système de fichiers (car le déréférencement des fichiers dédoublés coûte cher). Les instantanés pourraient également compliquer les choses.
Il vaut peut-être mieux supprimer le /tmp
répertoire au lieu des données contenues dans.
Si /tmp
est un système de fichiers ZFS, supprimez-le et créez à nouveau.
Comment est-il possible que la réargenture de l'ensemble de la baie prenne une heure, mais que la suppression du disque prenne 4 jours?
Considérons un immeuble de bureaux.
Le retrait de tous les ordinateurs, du mobilier et des fixations de tous les bureaux à tous les étages prend un long temps, mais laisse les bureaux immédiatement utilisables par un autre client.
La démolition de tout le bâtiment avec RDX est beaucoup plus rapide, mais le prochain client est tout à fait susceptible de se plaindre de la sécheresse de l'endroit.
Il se passe un certain nombre de choses ici.
Tout d'abord, toutes les technologies de disques modernes sont optimisées pour les transferts en masse. Si vous devez déplacer 100 Mo de données, ils le feront beaucoup plus rapidement s'ils sont dans un bloc contigu au lieu d'être dispersés partout. Les SSD aident beaucoup ici, mais même ils préfèrent les données dans des blocs contigus.
Deuxièmement, la réargenture est assez optimale en ce qui concerne les opérations sur disque. Vous lisez un énorme bloc contigu de données à partir d'un disque, effectuez des opérations de processeur rapides sur celui-ci, puis le réécrivez dans un autre gros bloc contigu sur un autre disque. Si l'alimentation est coupée à mi-chemin, ce n'est pas grave - vous ignorerez simplement toutes les données avec de mauvaises sommes de contrôle et vous poursuivrez comme d'habitude.
Troisièmement, la suppression d'un fichier est très lente. ZFS est particulièrement mauvais, mais pratiquement tous les systèmes de fichiers sont lents à supprimer. Ils doivent modifier un grand nombre de blocs de données différents sur le disque et les chronométrer correctement (c'est-à-dire attendre) afin que le système de fichiers ne soit pas endommagé en cas de panne de courant.
Comment est-il possible que la réargenture de l'ensemble de la baie prenne une heure, mais que la suppression du disque prenne 4 jours?
La réargenture est quelque chose que les disques sont vraiment rapides, et la suppression est quelque chose que les disques sont lents. Par mégaoctet de disque, vous n'avez qu'à faire un peu de réargenture. Vous pourriez avoir mille fichiers dans cet espace qui doivent être supprimés.
70 suppressions/seconde semblent très très mauvaises performances
Ça dépend. Je ne serais pas surpris par cela. Vous n'avez pas mentionné le type de SSD que vous utilisez. Les SSD Intel et Samsung modernes sont plutôt bons dans ce type d'opération (lecture-modification-écriture) et fonctionnent mieux. Les SSD moins chers/plus anciens (par exemple Corsair) seront lents. Le nombre d'opérations d'E/S par seconde (IOPS) est ici le facteur déterminant.
ZFS est particulièrement lent à supprimer des choses. Normalement, il effectuera des suppressions en arrière-plan afin que vous ne voyiez pas le retard. Si vous en faites un grand nombre, il ne peut pas le cacher et doit vous retarder.
Annexe: pourquoi les suppressions sont-elles lentes?
Ian Howson donne une bonne réponse sur la raison pour laquelle il est lent.
Si vous supprimez des fichiers en parallèle, vous pouvez constater une augmentation de la vitesse en raison de la suppression peut utiliser les mêmes blocs et peut ainsi enregistrer la réécriture du même bloc plusieurs fois.
Alors essayez:
find /tmp -print0 | parallel -j100 -0 -n100 rm
et voyez si cela fonctionne mieux que vos 70 suppressions par seconde.
Supprimer de nombreux fichiers n'est jamais vraiment une opération rapide.
Pour supprimer un fichier sur tout système de fichiers, vous devez lire l'index du fichier, supprimer (ou marquer comme supprimé) l'entrée de fichier dans l'index, supprimer toutes les autres métadonnées associées au fichier et marquer l'espace alloué au fichier comme inutilisé. Cela doit être fait individuellement pour chaque fichier à supprimer, ce qui signifie que la suppression de nombreux fichiers nécessite de nombreuses petites E/S. Faire cela d'une manière qui garantit l'intégrité des données en cas de panne de courant ajoute encore plus de surcharge.
Même sans les particularités introduites par ZFS, la suppression de 30 millions de fichiers signifie généralement plus de cent millions d'opérations d'E/S distinctes. Cela va prendre beaucoup de temps même avec un SSD rapide. Comme d'autres l'ont mentionné, la conception de ZFS aggrave encore ce problème.
Comment est-il possible que la réargenture de l'ensemble de la baie prenne une heure, mais que la suppression du disque prenne 4 jours?
Cela est possible car les deux opérations fonctionnent sur différentes couches de la pile du système de fichiers. La réargenture peut s'exécuter à bas niveau et n'a pas réellement besoin de regarder des fichiers individuels, en copiant de gros morceaux de données à la fois.
Pourquoi mes performances sont-elles si mauvaises? 70 suppressions/seconde semblent très très mauvaises performances.
Il faut beaucoup de comptabilité ...
Je pourrais supprimer l'inode pour/tmp2 manuellement, mais cela ne libérera pas de l'espace, non?
Je ne sais pas pour ZFS, mais s'il pouvait s'en remettre automatiquement, il ferait probablement, en fin de compte, les mêmes opérations que vous faites déjà, en arrière-plan.
Serait-ce un problème avec zfs, ou les disques durs ou quoi?
Est-ce que zfs scrub
dis n'importe quoi?
Très simple si vous inversez votre pensée.
Obtenez un deuxième disque (vous semblez l'avoir déjà)
Copiez tout du lecteur A vers le lecteur B avec rsync, à l'exception du répertoire/tmp. Rsync sera plus lent qu'une copie de bloc.
Redémarrez, en utilisant le lecteur B comme nouveau volume de démarrage
Reformater le lecteur A.
Cela défragmentera également votre lecteur et vous donnera un nouveau répertoire (bien, la défragmentation n'est pas si importante avec un SSD mais la linéarisation de vos fichiers ne fait jamais de mal)