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?
la source
df -h
etzpool list
etzfs list
.rm -rf /tmp2
ne fera pas le travail?/tmp
devrait être untmpfs
système de fichiers et est stocké en mémoire.Réponses:
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.
Vous feriez mieux de supprimer le
/tmp
répertoire au lieu des données qu'il contient.S'il
/tmp
s'agit d'un système de fichiers ZFS, supprimez-le et créez à nouveau.la source
ionice
, en supposant que FreeBSD en dispose) pendant la suppression.Considérons un immeuble de bureaux.
Le retrait de tous les ordinateurs, meubles et fixations de tous les bureaux à tous les étages prend beaucoup de temps, mais laisse les bureaux immédiatement utilisables par un autre client.
Démolissant le bâtiment avec RDX est beaucoup plus rapide, mais le prochain client est tout à fait susceptible de se plaindre de la façon dont l'endroit est mal isolé.
la source
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 continuerez comme d'habitude.
Troisièmement, la suppression d'un fichier est vraiment 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.
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.
Ç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 éléments. 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?
la source
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 d'examiner des fichiers individuels, en copiant de gros morceaux de données à la fois.
Il faut beaucoup de comptabilité ...
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.
Dit
zfs scrub
quelque chose?la source
Supprimer de nombreux fichiers n'est jamais vraiment une opération rapide.
Pour supprimer un fichier sur un système de fichiers, vous devez lire l'index de 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é pour le 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 disque dur SSD. Comme d'autres l'ont mentionné, la conception de ZFS aggrave encore ce problème.
la source
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 voir 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:
et voyez si cela fonctionne mieux que vos 70 suppressions par seconde.
la source
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)
la source
zfs send/recv
(copie au niveau du bloc) tous les autres systèmes de fichiers à l'exception du système de fichiers racine (où / tmp se trouve dans ce cas) et copier manuellement les données restantes sur le système de fichiers racine (à l'exclusion de / tmp bien sûr).Vous avez 30 millions d'entrées dans une liste non triée. Vous scannez la liste pour l'entrée que vous souhaitez supprimer et vous la supprimez. Maintenant, vous n'avez plus que 29 999 999 entrées dans votre liste non triée. S'ils sont tous dans / tmp, pourquoi ne pas simplement redémarrer?
Modifié pour refléter les informations dans les commentaires: Énoncé du problème: la suppression de la plupart, mais pas de la totalité , des 30 M + fichiers créés de manière incorrecte dans / tmp prend beaucoup de temps.
Problème 1) Le meilleur moyen de supprimer un grand nombre de fichiers indésirables de / tmp.
Problème 2) Comprendre pourquoi il est si lent de supprimer des fichiers.
Solution 1) - / tmp est réinitialisé à vide au démarrage par la plupart des distributions * nix. FreeBSD n'en fait cependant pas partie.
Étape 1 - copiez les fichiers intéressants ailleurs.
Étape 2 - En tant que root
Étape 3 - redémarrez.
Étape 4 - remplacez clear_tmp_enable par "Non".
Les fichiers indésirables ont maintenant disparu, car ZFS sur FreeBSD a la fonctionnalité suivante: "La destruction d'un ensemble de données est beaucoup plus rapide que la suppression de tous les fichiers qui résident sur l'ensemble de données, car elle n'implique pas l'analyse de tous les fichiers et la mise à jour de toutes les métadonnées correspondantes. " donc tout ce qu'il a à faire au démarrage est de réinitialiser les métadonnées de l'ensemble de données / tmp. C'est très rapide.
Solution 2) Pourquoi est-ce si lent? ZFS est un merveilleux système de fichiers qui comprend des fonctionnalités telles que l'accès au répertoire à temps constant. Cela fonctionne bien si vous savez ce que vous faites, mais les preuves suggèrent que l'OP n'est pas un expert ZFS. L'OP n'a pas indiqué comment ils tentaient de supprimer les fichiers, mais je suppose qu'ils ont utilisé une variante de "find regex -exec rm {} \;". Cela fonctionne bien avec de petits nombres mais n'est pas évolutif car il y a trois opérations en série en cours 1) obtenir la liste des fichiers disponibles (retourne 30 millions de fichiers dans l'ordre de hachage), 2) utiliser regex pour choisir le fichier suivant à supprimer, 3 ) dire au système d'exploitation de rechercher et de supprimer ce fichier d'une liste de 30 millions. Même si ZFS renvoie une liste de la mémoire et si 'find' le met en cache, l'expression régulière doit toujours identifier le prochain fichier à traiter à partir de la liste, puis dire au système d'exploitation de mettre à jour ses métadonnées pour refléter ce changement, puis de mettre à jour la liste afin qu'il ne soit pas traité à nouveau.
la source