La suppression de fichiers prend trop de temps

11

Version courte : rm -rf mydiravec mydir(récursive) contenant des fichiers de 2,5 millions, prend environ 12 heures sur une machine la plupart du temps de repos.

Plus d'informations : La plupart des fichiers supprimés sont des liens durs vers des fichiers dans d'autres répertoires (le répertoire supprimé est en fait la plus ancienne sauvegarde effectuée par rsnapshot; la rmcommande est en fait fournie par rsnapshot). Il s'agit donc principalement d'entrées de répertoire supprimées - le contenu du fichier lui-même n'est pas beaucoup; c'est de l'ordre de quelques dizaines de Go.

Je suis loin d'être certain que btrfsc'est le coupable. Je me souviens que la sauvegarde était également très lente avant de commencer à utiliser btrfs, mais je ne suis pas certain que la lenteur était dans la suppression.

La machine est un Intel Core i5 2,67 GHz avec 4 Go de RAM. Il a deux disques SATA: l'un a le système d'exploitation et d'autres éléments, et le disque de sauvegarde est de 1 To WDC WD1002FAEX-00Z3A0. La carte mère est un Asus P7P55D.

Edit : La machine est un Debian Wheezy avec Linux 3.16.3-2~bpo70+1. Voici comment le système de fichiers est monté:

root@thames:~# mount|grep rsnapshot
/dev/sdb1 on /var/backups/rsnapshot type btrfs (rw,relatime,compress=zlib,space_cache)

Edit : l'utilisation rsync -a --delete /some/empty/dir mydirprend environ 6 heures. Une amélioration significative par rapport à rm -rf, mais toujours trop je pense. ( Explication de pourquoi rsyncest plus rapide querm : "[M] ost les systèmes de fichiers stockent leurs structures de répertoires dans un format btree, l'ordre [dans] lequel vous supprimez les fichiers est ... important. Il faut éviter de rééquilibrer le btree lorsque vous effectuez la déconnexion .... rsync -a --delete... fait les suppressions dans l'ordre ")

Edit : j'ai attaché un autre disque qui avait 2,2 millions de fichiers (récursivement) dans un répertoire, mais sur XFS. Voici quelques résultats comparatifs:

                  On the XFS disk      On the BTRFS disk
Cached reads[1]       10 GB/s               10 GB/s
Buffered reads[1]     80 MB/s              115 MB/s
Walk tree[2]         11 minutes            43 minutes
rm -rf mydir[3]       7 minutes            12 hours

[1] Avec hdparm -T /dev/sdXet hdparm -t /dev/sdX.
[2] Temps nécessaire à l'exécution find mydir -print|wc -limmédiatement après le démarrage.
[3] Sur le disque XFS, c'était peu de temps après avoir parcouru l'arbre avec find. Sur le disque BTRFS, c'est l'ancienne mesure (et je ne pense pas que c'était avec l'arborescence mise en cache).

Cela semble être un problème avec btrfs.

Antonis Christofides
la source
1
2,5 millions de fichiers dans un seul répertoire? Je ne connais pas de système de fichiers qui gère bien cela.
Michael Hampton
@MichaelHampton: Ce n'est pas plat, il contient des répertoires imbriqués. J'ai ajouté le mot "récursivement" dans la courte description; J'espère que cela clarifie les choses.
Antonis Christofides
1
Pourquoi utilisez-vous l'astuce du répertoire de copie sur écriture sur un système de fichiers de copie sur écriture?
symcbean
@symcbean: Vous voulez dire que l'astuce du lien dur est redondante btrfs? C'est possible, bien sûr, mais pensez-vous que cela peut être pertinent? Pour l'instant, je ne me souviens pas pourquoi j'ai décidé d'essayer btrfs.
Antonis Christofides
2
Ah, je me souviens maintenant. J'ai décidé de passer à btrfsparce que je voulais la compression transparente. Maintenant: rsnapshotutilise des liens durs. Il n'a aucune option pour ne pas utiliser de liens durs. Les liens physiques se chevauchent donc avec btrfsla fonctionnalité de copie sur écriture de, mais je ne peux pas faire grand-chose à ce sujet.
Antonis Christofides

Réponses:

3

Eh bien, c'est toujours un problème Btrfs, c'est bien connu que la suppression de nombreux petits fichiers prend assez de temps par rapport aux autres systèmes de fichiers.

Si vous ne l'aimez pas, vous pouvez soit attendre que l'amont l'ait corrigé, soit passer à un autre système de fichiers qui le fait mieux.

Votre principale erreur est cependant d'utiliser un ancien noyau (3.16, oui, il était déjà ancien lorsque vous avez posté) avec btrfs. Btrfs est un système de fichiers qui est toujours en développement, vous devez donc toujours rester avec la dernière et la meilleure version du noyau pour entrer en contact avec les améliorations. Si votre distribution ne fait pas de rétroportages, vous pouvez le faire vous-même ou vous êtes foutu.

Btrfs a obtenu de nombreuses améliorations de performances dans la version 3.19 du noyau - c'est la version minimale que vous devez utiliser en production, votre version 3.16 du noyau suce clairement sans rétroportages.

Gardez également à l'esprit que, selon Chris Mason, il considère que Btrfs est stable, mais pas encore prêt pour la production.

Marc Stürmer
la source
1
Comment définissez-vous «bien connu»? J'avais fait des recherches approfondies et en vain sur le Web, et personne parmi ceux qui avaient participé à cette discussion ne le savait. Mais, de toute façon, je reste juste à l'écart btrfs. Trop excité alors que son développement semble prendre une éternité.
Antonis Christofides
1
Eh bien, il y a par exemple les gens de CoreOS. Ils ont utilisé à peu près Btrfs un an comme système de fichiers par défaut jusqu'au début de 2015 où ils sont passés à l'époque à Ext4 + Overlayfs. Gardez à l'esprit que c'était avant la version 3.19 du noyau, ce qui a apporté de nombreuses améliorations pour Btrfs. Jetez également un coup d'œil à cette présentation d'octobre 2015, qui porte sur ext4, xfs, zfs et btrfs sur les conditions de charge de travail de la base de données, à savoir Postgres: de.slideshare.net/fuzzycz/… Un autre point de repère, mais pas si bon noyau: goo.gl/rR3kZ2
Marc Stürmer
Et comme je l'ai dit, la version du noyau de votre boîte (3.16) est connue pour être en proie à des problèmes de performances, utilisez au moins 3.19 pour les trucs Btrfs sérieux selon Chris Mason. Si vous voulez utiliser sérieusement Btrfs, utilisez toujours le dernier et le meilleur noyau - quelque chose qui ne fonctionne pas vraiment bien avec Debian ... et recherchez le terme "performances des métadonnées btrfs".
Marc Stürmer
2

Je suis un peu en retard à cette fête, mais voici une astuce pour supprimer très rapidement des arbres btrfs extrêmement volumineux:

  1. Créez un sous-volume factice sur le même système de fichiers btrfs.
  2. Déplacez le répertoire de niveau supérieur que vous souhaitez supprimer dans ledit sous-volume - cette opération devrait être très rapide si vous le faites sur le même système de fichiers btrfs, même entre les sous-volumes.
  3. Détruisez le sous-volume.

Le noyau va commencer à récupérer de l'espace en arrière-plan, vous n'aurez donc pas l'espace disponible tout de suite, mais le processus devrait être beaucoup plus rapide que de faire n'importe quelle sorte de suppression d'espace utilisateur.

Nicolas Noble
la source
0

Vous pouvez renommer le répertoire, puis supprimer le répertoire renommé dans un processus d'arrière-plan. Cela ne va pas accélérer l'opération de suppression. Cependant, cela permettrait au programme de continuer vers l'avant avec un répertoire vide pendant que l'opération de suppression se produit sur le côté.

Je ne sais pas si cela va fonctionner dans votre cas d'utilisation. Cela dépend si le programme ne peut pas continuer jusqu'à ce que le disque soit inactif (c'est-à-dire qu'il va faire des opérations de disque lourdes). Cela dépend si le programme va remplir le disque avec beaucoup de données.

Nathan
la source