web-dev-qa-db-fra.com

Comment faire `RM` plus vite sur EXT3 / Linux?

J'ai EXT3 Système de fichiers montés avec des options par défaut. Sur celui-ci, j'ai des fichiers d'environ 100 Go.

L'enlèvement de ces fichiers prend beaucoup de temps (8 minutes) et provoque beaucoup de trafic IO, ce qui augmente la charge sur le serveur.

Y a-t-il un moyen de rendre le RM pas aussi perturbateur?

32
user13185

Vous pouvez donner ionice un essai. Cela ne le rendra pas plus rapide mais cela pourrait le rendre moins perturbateur.

En termes d'efficacité, l'utilisation d'un RM par fichier n'est pas optimale, car elle nécessite une fourchette et EXED pour chaque RM.

En supposant que vous avez une liste.txt contenant les fichiers que vous souhaitez supprimer serait plus efficace, mais il va toujours être lent:

xargs -i rm {} < list.txt

Une autre approche serait de: Nice -20 xargs -i rm {} < list.txt
(Cela prendra moins de temps mais affectera grandement votre système :)

o

Je ne sais pas à quel point cela serait rapide mais:

mv <file-name> /dev/null 

o

Créez un point de montage spécial avec un système de fichiers rapide (à l'aide d'un périphérique de boucle?), Utilisez-le pour stocker et supprimer vos énormes fichiers.
[.____] (peut-être déplacer les fichiers là-bas avant de les supprimer, peut-être qu'il est plus rapide ou peut-être simplement le démonter quand vous voulez des fichiers)

o

cat /dev/null > /file/to/be/deleted (il est donc de taille zéro maintenant) et si vous voulez que cela disparaisse Juste rm -rf <file> maintenant

o encore mieux

déposer le chat et juste faire # > /file/to/be/emptied

4
user126330

Mes deux centimes.

J'ai déjà eu cette question. "Dans le script séquentiel qui doit fonctionner rapidement, le processus supprima beaucoup de fichier" .. donc le "RM" fera de la vitesse de script près du IO attendre/l'heure d'attente.

Donc, pour faire quoi que ce soit plus vite, j'ai ajouté un autre processus (Bash Script) lancé par cron .. Comme un collecteur de déchets, il supprimez tous les fichiers d'un répertoire particulier.

Ensuite, j'ai mis à jour le script d'origine en remplaçant le "RM" par un MV à un "dossier à déchets" (renommez le fichier en ajoutant un compteur à la fin de son nom pour éviter la collision).

Cela fonctionne pour moi, le script gère au moins 3 fois plus vite. Mais cela ne fonctionne bien que si le dossier des ordures et le fichier d'origine sont sous le même point de montage (même dispositif) pour éviter la copie du fichier. (MV sur le même périphérique consommer moins IO que rm)

J'espère que cela aide ..

1
Emmanuel Devaux

J'ai eu des problèmes pour que le répertoire puisse supprimer à un rythme raisonnable, vous ouvrez le processus de verrouillage du disque et de créer un empilement de processus essayant d'accéder au disque. Ionice n'a pas fonctionné, il a juste continué à utiliser 99% du disque IO et verrouillé tous les autres processus.

Voici le Python code qui a fonctionné pour moi. Il supprime 500 fichiers à la fois, prend une pause de 2 secondes pour laisser les autres processus faire leur travail, puis continue. Fonctionne très bien.

import os, os.path
import time

for root, dirs, files in os.walk('/dir/to/delete/files'):
    file_num = 0
    for f in files:
        fullpath = os.path.join(root, f)
        os.remove(fullpath)
        if file_num%500 == 1:
            time.sleep(2)
            print "Deleted %i files" % file_num
        file_num = file_num + 1
1
Nick Woodhams

Vous pouvez essayer de créer un système de fichiers de boucle pour stocker vos sauvegardes.

# dd if=/dev/zero of=/path/to/virtualfs bs=100M count=1024 # 100 MB * 1024 = 100 GB
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop

Ensuite, quand vous voulez effacer les sauvegardes:

# umount /mnt/backups
# mke2fs /path/to/virtualfs
# mount -t ext2 /path/to/virtualfs /mnt/backups -o loop

Presto! L'ensemble du système de fichiers virtuel est éliminé en une question de moments.

0
amphetamachine

Vous pouvez utiliser multitheading Whith Xargs

find . -type f | xargs -P 30 rm -rf 

où 30 est le nombre de threads que vous souhaitez créer. Si vous utilisez zéro, le système crée des threads maximum disponibles pour l'utilisateur exécutant la tâche.

0
Juan Carlos

Notez également que la réponse de Dennis Williamson, qui suggère ionice en tant que solution de contournement pour la charge, ne fonctionnera que si votre périphérique de bloc utilise le planificateur CFQ IO.

0
famzah

mV <nom de fichier>/dev/null

/ dev/null est un fichier et non un répertoire. Impossible de déplacer un fichier, dans un fichier, ou vous risquez de l'écraser.

Créez un point de montage spécial avec un système de fichiers rapide (à l'aide d'un périphérique de boucle?), Utilisez-le pour stocker et supprimer vos énormes fichiers. (Peut-être déplacer les fichiers là-bas avant de les supprimer, peut-être qu'il est plus rapide ou peut-être simplement le démonter lorsque vous voulez des fichiers partis)

Je ne pense pas que ce soit pratique. Cela utiliserait inutilement plus d'E/S que l'OP.

0
Felipe Alvarez