Empêcher tar d'utiliser trop de CPU et de disque (l'ancien ordinateur portable se bloque à 100%)

15

Je souhaite sauvegarder 1 téraoctet de données sur un disque externe.

J'utilise cette commande: tar cf /media/MYDISK/backup.tar mydata

PROBLÈME: Mon pauvre ordinateur portable se bloque et se bloque chaque fois que j'utilise 100% de CPU ou 100% de disque (si vous voulez réagir à ce sujet, veuillez écrire ici ) . Je veux donc rester à environ 50% du processeur et 50% du disque max.

Ma question: comment limiter le CPU et le disque avec la tarcommande?

Rsync a une option --bwlimit, mais je veux une archive car 1) il y a beaucoup de petits fichiers 2) Je préfère gérer un seul fichier plutôt qu'une arborescence. Voilà pourquoi j'utilise tar.

Nicolas Raoul
la source
1
Quelle idée intelligente pour créer un tel tarball énorme: DDD Qu'en est-il de la commande 'nice'?
jirib
1
@JiriXichtkniha: nicen'empêchera pas 100% d'utilisation du CPU
Nicolas Raoul

Réponses:

22

Vous pouvez utiliser pvpour limiter la bande passante d'un tuyau. Étant donné que votre cas d'utilisation est fortement lié aux E / S, la surcharge supplémentaire du processeur liée au passage dans un canal ne devrait pas être perceptible, et vous n'avez pas besoin d'effectuer de limitation du processeur.

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar
Gilles 'SO- arrête d'être méchant'
la source
1
Encore mieux que ce à quoi je m'attendais! Je limite les E / S à 5 Mo / seconde et le processeur reste à 13% (semble raisonnable avec le cryptage en cours).
Nicolas Raoul
1
Très agréable!. Peut-être aussi recommander le drapeau -q pour éliminer la barre de progression.
szabgab
une si grande commande !!! Si vous ne l'avez pas dans votre Debian / Ubuntu, lancez simplement apt-get install pv. Je recommande d'ajouter `-b` après -L 1m: de cette façon, un compteur d'octets incrémentiel sera imprimé, mis à jour toutes les secondes. De cette façon, vous savez combien d'octets ont été écrits jusqu'à présent
lucaferrario
Notez également que si vous compressez la sortie (en utilisant à la tar czfplace de tar cf), la limite se réfère à la sortie compressée (donc avec -L 1mvotre écriture sur le disque ne dépassera pas 1 Mo / s ... mais la lecture de votre disque sera probablement entre 1 Mo / s et 5 Mo / s, selon votre type de contenu)
lucaferrario
Super astuce! Lors de la compression avec xz, je passe d'abord par pv puis par xz.
Jean-Bernard Jansen
8

Vous pouvez essayer l' outil cpulimit qui limite le pourcentage CPU. Ce n'est pas un outil standard, vous devrez donc l'installer. Voici un bref extrait du README:

"Cpulimit est un outil qui tente de limiter l'utilisation CPU d'un processus (exprimé en pourcentage, pas en temps CPU). [...] Le contrôle de la quantité de CPU utilisée se fait en envoyant des signaux SIGSTOP et SIGCONT POSIX aux processus. Tous les processus enfants et les threads du processus spécifié partageront le même pourcentage de CPU. "

Ensuite, je recommanderais ionice pour limiter l'utilisation des E / S, bien que ce soit l'accès simultané qui serait limité, pas le débit maximal ... Néanmoins, voici comment l'utiliser:

ionice -c 3 <your_command>
Huygens
la source
Génial! Il semble que cpulimit soit ce que je cherchais.
Nicolas Raoul
2

Vous ne pouvez pas vraiment faire en sorte qu'un processus s'exécute moins . Vous pouvez utilisernice pour lui donner une priorité inférieure, mais c'est en relation avec d'autres processus. La façon d'exécuter le refroidisseur de processeur pendant l'exécution d'un processus consiste à utiliser usleep(3)pour forcer le processus à sortir de l'état d'exécution un certain temps, mais cela impliquerait soit de corriger tarsoit d'utiliser le LD_PRELOADmécanisme pour fournir une fonction corrigée qui tarutilise beaucoup (par exemple fopen(3)).

Je soupçonne que vos meilleures solutions de contournement sont celles que vous avez mentionnées sur SuperUser: garder l'ordinateur portable au frais et / ou réduire l'horloge du processeur.

Une solution de contournement ennuyeuse mais possiblement viable (un coup de coude, vraiment) fonctionne à un niveau «macroscopique». Plutôt que de fairetar courir 100 ms toutes les 200 ms, vous pouvez le faire courir une seconde sur deux. Remarque: il s'agit d'un horrible, horrible kludge. Mais bon, ça pourrait même marcher!

tar cjf some-file.tar.bz2 /some-directory &
while true; do
    sleep 1  # Let it run for a second
    kill -STOP $! 2>/dev/null || break
    sleep 1  # Pause it for a second
    kill -CONT $! 2>/dev/null || break
done

Le premier sleepajuste le temps de sommeil, le second ajuste le temps d'exécution. À l'heure actuelle, il a un cycle d'utilisation de 50%. Pour maintenir la température basse, vous devrez très probablement réduire le cycle de service à peut-être 25% ou moins (1 seconde de course, 3 secondes de sommeil = 1 de toutes les 4 secondes = 25% de cycle de service). La commande shell sleeppeut prendre des temps fractionnaires, soit dit en passant. On pourrait même dire sleep 0.1. Gardez-le au-dessus de 0,001 juste pour être sûr, et n'oubliez pas que l'exécution du script ajoute du temps aussi.

Alexios
la source
+1 Bonne idée! Je suppose que c'est similaire à l'outil cpulimit suggéré par Huygens.
Nicolas Raoul
Sauf que l'outil de Huuygens est bien meilleur et plus pratique, c'est pourquoi cette réponse a obtenu mon propre +1. :)
Alexios
0

Une manière plus générale de limiter le CPU est d'utiliser /sys . Cela semble être ce que vous voulez de toute façon, car d'autres choses que celles qui tarsont capables d'effectuer des tâches de calcul coûteuses, c'est juste que vous voyez le tarfaire le plus.

Pour ce faire, vous devez:

  1. aller à /sys/devices/system/cpu/cpuX/cpufreq chacun de vos CPU (remplacez-le cpuXpar chaque CPU).
  2. Ensuite, regardez dans le fichier scaling_available_frequencies pour voir quelles fréquences votre CPU prend en charge.
  3. Choisissez une fréquence (disons 1234567) et faites echo 1234567 > scaling_max_freq

Cela empêchera le CPU de dépasser la fréquence spécifiée.

Patrick
la source
Merci, mais je suis déjà à la fréquence la plus basse possible. J'aurais dû le mentionner. J'ai commencé l'overclocking dès que ces problèmes ont commencé à apparaître.
Nicolas Raoul