Verhindern, dass Teer zu viel CPU und Festplatten verbraucht (alter Laptop stürzt ab, wenn 100%)


15

Ich möchte 1 Terabyte Daten auf einer externen Festplatte sichern.

Ich benutze diesen Befehl: tar cf /media/MYDISK/backup.tar mydata

PROBLEM: Mein schlechter Laptop friert ein und stürzt ab, wenn ich 100% CPU oder 100% Festplatte benutze (wenn Sie darauf reagieren möchten, schreiben Sie bitte hier ) . Ich möchte also bei etwa 50% CPU und 50% Festplatte bleiben.

Meine Frage: Wie man CPU und Scheibe mit dem tarBefehl drosselt ?

Rsync hat die Option --bwlimit, aber ich möchte ein Archiv, weil 1) es viele kleine Dateien gibt. 2) Ich bevorzuge es, eine einzelne Datei zu verwalten, anstatt einen Baum. Deshalb benutze ich tar.


1
Was für eine clevere Idee, solch einen riesigen Tarball zu erstellen: DDD Was ist mit dem Befehl 'nice'?
jirib

1
@ JiriXichtkniha: nice100% ige CPU-Auslastung wird nicht verhindert
Nicolas Raoul

Antworten:


22

Mit können Sie pvdie Bandbreite einer Pipe drosseln. Da Ihr Anwendungsfall stark an E / A gebunden ist, sollte der zusätzliche CPU-Overhead beim Durchlaufen einer Pipe nicht spürbar sein, und Sie müssen keine CPU-Drosselung durchführen.

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar

1
Noch besser als ich erwartet hatte! Ich beschränke IO auf 5 MB / Sekunde und die CPU bleibt bei 13% (scheint bei laufender Verschlüsselung vernünftig zu sein).
Nicolas Raoul

1
Sehr schön!. Vielleicht empfehlen Sie auch das Flag -q, um die Fortschrittsanzeige zu entfernen.
Szabgab

so ein toller Befehl !!! Wenn Sie es nicht in Ihrem Debian / Ubuntu haben, führen Sie es einfach aus apt-get install pv. Ich empfehle `-b` nachher hinzuzufügen -L 1m: Auf diese Weise wird ein inkrementeller Bytezähler ausgegeben, der jede Sekunde aktualisiert wird. Auf diese Weise wissen Sie, wie viele Bytes bis jetzt geschrieben wurden
Lucaferrario

Beachten Sie auch, dass sich die Beschränkung auf die komprimierte Ausgabe bezieht , wenn Sie die Ausgabe komprimieren ( tar czfstatt verwenden tar cf) (sodass beim -L 1mSchreiben auf Ihrer Festplatte 1 MB / s nicht überschritten werden .... Ihr Lesevorgang auf der Festplatte wird jedoch wahrscheinlich zwischen 1 MB / s liegen und 5 MB / s, abhängig von Ihrem Inhaltstyp)
Lucaferrario

Toller Trick! Beim Komprimieren mit xz gehe ich zuerst durch pv und dann durch xz.
Jean-Bernard Jansen

8

Sie können das Tool cpulimit ausprobieren, das den CPU-Prozentsatz begrenzt. Es ist kein Standard-Tool, daher müssen Sie es installieren. Hier ist ein kurzer Auszug aus der README:

"Cpulimit ist ein Tool, das versucht, die CPU-Auslastung eines Prozesses zu begrenzen (ausgedrückt in Prozent, nicht in CPU-Zeit). [...] Die Steuerung der verwendeten CPU-Menge erfolgt durch Senden von SIGSTOP- und SIGCONT POSIX-Signalen an Prozesse. Alle Die untergeordneten Prozesse und Threads des angegebenen Prozesses teilen sich denselben Prozentsatz der CPU. "

Dann würde ich ionice empfehlen, um die E / A-Nutzung einzuschränken, obwohl der gleichzeitige Zugriff begrenzt ist, nicht der maximale Durchsatz.

ionice -c 3 <your_command>

Groß! Es scheint, als wäre Pulimit das, wonach ich gesucht habe.
Nicolas Raoul

2

Man kann nicht wirklich einen Prozess dazu bringen, weniger zu laufen . Sie können es verwenden nice, um eine niedrigere Priorität zuzuweisen, dies steht jedoch im Verhältnis zu anderen Prozessen. Die Möglichkeit, den CPU-Kühler während usleep(3)der Ausführung eines Prozesses zu betreiben, besteht darin , den Prozess für eine bestimmte Zeit aus dem Ausführungsstatus zu zwingen. Dies würde jedoch entweder das Patchen taroder die Verwendung des LD_PRELOADMechanismus zur Bereitstellung einer gepatchten Funktion erfordern, die viel Zeit in Anspruch nimmt tar(z. B. fopen(3)).

Ich vermute, dass Ihre beste Lösung die Hardware ist, die Sie bei SuperUser erwähnt haben: Halten Sie den Laptop kühl und / oder senken Sie den CPU-Takt.

Eine ärgerliche, aber möglicherweise praktikable Problemumgehung (ein Trick, wirklich) funktioniert auf einer "makroskopischen" Ebene. Anstatt tar100 ms alle 200 ms laufen zu lassen, können Sie aus zwei eine Sekunde machen. Hinweis: Dies ist ein schrecklicher, schrecklicher Kludge. Aber hey, es könnte sogar funktionieren!

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

Die erste sleeppasst die Ruhezeit an, die zweite die Laufzeit. So wie es jetzt ist, hat es ein Tastverhältnis von 50%. Um die Temperatur niedrig zu halten, müssen Sie den Arbeitszyklus wahrscheinlich auf 25% oder weniger reduzieren (1 Sekunde, 3 Sekunden Schlaf = 1 von 4 Sekunden = 25% Arbeitszyklus). Der Shell-Befehl sleepkann übrigens Bruchzeiten annehmen. So könnte man sogar sagen sleep 0.1. Behalten Sie den Wert über 0,001, um sicherzugehen, und vergessen Sie nicht, dass die Skriptausführung die Zeit verlängert.


+1 Gute Idee! Ich vermute, es ist dem von Huygens vorgeschlagenen cpulimit-Tool ähnlich.
Nicolas Raoul

Allerdings ist Huuygens 'Tool viel besser und praktischer, weshalb diese Antwort meine eigene +1 bekam. :)
Alexios

0

Eine allgemeinere Möglichkeit, die CPU zu begrenzen, ist die Verwendung /sys. Dies scheint sowieso das zu sein, was Sie wollen, da andere Dinge als tardie Durchführung rechenintensiver Aufgaben in der Lage sind tar.

Der Weg dazu ist:

  1. Gehen Sie /sys/devices/system/cpu/cpuX/cpufreqfür jede Ihrer CPUs zu (ersetzen Sie sie cpuXdurch jede CPU).
  2. Schauen Sie dann in der Datei scaling_available_frequenciesnach, welche Frequenzen Ihre CPU unterstützt.
  3. Wählen Sie eine Frequenz (sagen wir 1234567) und machen Sie echo 1234567 > scaling_max_freq

Dadurch wird verhindert, dass die CPU jemals die angegebene Frequenz überschreitet.


Danke, aber ich bin schon bei der niedrigstmöglichen Frequenz. Ich hätte das erwähnen sollen. Ich fing an zu übertakten, sobald diese Probleme auftauchten.
Nicolas Raoul
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.