Comment empêcher la suppression de sous-arborescence (`rm -rf`) de priver d'autres processus pour les E / S disque?

8

Nous avons un très grand répertoire de cache Nginx (multi-Go) pour un site occupé, que nous devons parfois effacer d'un seul coup. J'ai résolu ce problème dans le passé en déplaçant le dossier de cache vers un nouveau chemin, en créant un nouveau dossier de cache sur l'ancien chemin, puis en rm -rfutilisant l'ancien dossier de cache.

Dernièrement, cependant, lorsque j'ai besoin de vider le cache par une matinée chargée, les E / S rm -rfaffaiblissent les processus d'accès au disque de mon serveur, car Nginx et le serveur pour lequel il fait face nécessitent beaucoup de lecture. Je peux regarder la charge moyenne grimper pendant que les processeurs restent inactifs et rm -rfabsorbent 98 à 99% du disque IO iotop.

J'ai essayé ionice -c 3en invoquant rm, mais cela ne semble pas avoir d'effet appréciable sur le comportement observé.

Existe-t-il un moyen d'apprivoiser rm -rfpour partager davantage le disque? Dois-je utiliser une technique différente qui prendra ses repères ionice?

Mise à jour:

Le système de fichiers en question est un magasin d'instances AWS EC2 (le disque principal est EBS). L' /etc/fstabentrée ressemble à ceci:

/dev/xvdb       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2
David Eyk
la source
Vous devriez probablement également mentionner le système de fichiers que vous utilisez et comment (options de montage).
Cristian Ciupitu
Mise à jour. De plus, si cela est important, c'est sur Ubuntu 12.04.
David Eyk
Notez que les performances d'E / S sur Amazon EBS peuvent être assez mauvaises. Voir perfcap.blogspot.com/2011/03/… qui recommande un maximum à long terme de 100 iops, avec des rafales à court terme (1 minute) jusqu'à 1000. Il semble que votre cas soit bien supérieur à celui d'une minute, d'où le problème.
Moshe Katz
C'est pourquoi nous utilisons un magasin d'instances, pas EBS, pour le cache. Voir mon commentaire de mise à jour. Désolé si ce n'était pas clair.
David Eyk
Désolé, je suis en retard, mais vous pouvez enquêter sur les cgroups et le contrôleur blkio: kernel.org/doc/Documentation/cgroups/blkio-controller.txt
AndreasM

Réponses:

3

Toutes les données recueillies sur cette page. Voici quelques options pour supprimer un grand répertoire de fichiers. Consultez la rédaction pour les détails de la façon dont cela a été produit.

Commande Temps système écoulé% CPU cs1 * (Vol / Invol)
rsync -a - supprimer vide / a 10,60 1,31 95% 106/22
trouver b / -type f -supprimer 28,51 14,46 52% 14849/11
trouver c / -type f | xargs -L 100 rm 41,69 20,60 54% 37048/15074
trouver d / -type f | xargs -L 100 -P 100 rm 34,32 27,82 89% 929897/21720
rm -rf f 31,29 14,80 47% 15134/11

* cs1 est un changement de contexte volontaire et involontaire

Back2Basics
la source
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
Tom O'Connor du
Fascinant! Je vais l'essayer.
David Eyk
rsyncfonctionne en ce moment. Il est peut-être trop tôt pour le dire et il pourrait être utile de ne pas l'exécuter au milieu d'une matinée chargée, mais le serveur est toujours réactif et la moyenne de charge est gérable.
David Eyk
L'invocation exacte que j'utilise:ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ /mnt/nginx-cache-old
David Eyk
Eh bien, cela n'a pris que 4 heures. ;) Je vais accepter cette réponse (de @aferber désolé) que je comme l'invocation simple et il semble être sensible à niceet ionice, ou du moins il n'a pas détruit le serveur comme l'a rm -rffait.
David Eyk
9

La suppression de fichiers n'effectue que des opérations de métadonnées sur le système de fichiers, qui ne sont pas influencées par ionice.

Le moyen le plus simple serait, si vous n'avez pas besoin de l'espace disque pour le moment, d'effectuer les rmheures creuses.

La manière la plus complexe dont MIGHT fonctionne est d'étaler les suppressions dans le temps. Vous pouvez essayer quelque chose comme ce qui suit (notez qu'il suppose que vos chemins et noms de fichiers NE contiennent PAS d'espaces!):

while find dir -type f | head -n 100 | xargs rm; do sleep 2; done
while find dir -type d -depth | head -n 100 | xargs rmdir; do sleep 2; done

Notez également que vous ne pouvez pas utiliser rm -fdans la première commande car la boucle ne s'arrêterait pas (cela dépend du code de sortie d'erreur rmlorsqu'il n'y a pas d'argument).

Vous pouvez le modifier en modifiant le nombre de suppressions par cycle (100 dans l'exemple) et la durée du sommeil. Cependant, cela pourrait ne pas vraiment fonctionner car le système de fichiers peut encore regrouper les mises à jour des métadonnées de manière à ce que vous ayez des problèmes avec votre charge d'E / S. Il suffit d'essayer.

aferber
la source
La suppression d'un grand nombre de fichiers prend beaucoup de temps, il n'y a donc vraiment pas de période "hors pointe" qui l'englobera. :(
David Eyk
La whileboucle semble faire l'affaire quand head -n 50. 100 augmentait encore lentement la moyenne de charge au-dessus de la critique, ce qui me dit qu'il y avait trop de conflits de ressources.
David Eyk
Mec, ça prend du temps à courir!
David Eyk
La recherche va toujours répertorier tous les fichiers du répertoire et tous les sous-répertoires pour chaque itération de la boucle while. Vous pourriez probablement faire mieux avec quelque chose comme
Randy Orrison
1
La recherche va toujours répertorier tous les fichiers du répertoire et tous les sous-répertoires pour chaque itération de la boucle while. Vous pourriez probablement faire mieux avec quelque chose comme find dir -type f -print0 | xargs -l50 -0 rmwait où rmwait est un script qui fait rm "$ @"; sleep 2. Notez l'utilisation de -print0 et -0 pour gérer les noms de fichiers avec des espaces. -l50 indique à xargs de ne faire que 50 à la fois.
Randy Orrison
-1

Vous pouvez le coupler avec la commande "nice". ionice -c 3 nice -19 rm -rf /some/folder

Cela change la priorité du processus sur la machine.

Back2Basics
la source
Malheureusement, nicesemble avoir à peu près autant d'effet que ionice, c'est-à-dire, rien d'appréciable.
David Eyk
@DavidEyk. Si nice et ionice n'ont pas d'effet "perceptible", cela signifie que rien d'autre ne se bat pour des ressources de manière appréciable, ou que vous ne remarquez tout simplement pas l'effet à l'œil nu. Vous devriez vraiment le comparer en utilisant iostat et vmstat pour voir l'effet réel.
Michael Martinez
Je pense que @aferber a abordé cette question dans sa réponse: "La suppression de fichiers n'effectue que des opérations de métadonnées sur le système de fichiers, qui ne sont pas influencées par Ionice." J'ai vu la controverse - mes processus serveur étaient affamés pendant le temps de lecture alors que le processeur était en panne et rm -rfavait 99% de marche iotop.
David Eyk