Zapobieganie zużyciu przez tar zbyt dużej ilości procesora i dysku (stary laptop ulega awarii, jeśli 100%)

15

Chcę wykonać kopię zapasową 1 terabajta danych na dysku zewnętrznym.

Korzystam z tego polecenia: tar cf /media/MYDISK/backup.tar mydata

PROBLEM: Mój biedny laptop zawiesza się i ulega awarii, gdy używam 100% procesora lub 100% dysku (jeśli chcesz o tym zareagować, napisz tutaj ) . Więc chcę pozostać przy około 50% CPU i 50% dysku maks.

Moje pytanie: jak dławić procesor i dysk za pomocą tarpolecenia?

Rsync ma opcję --bwlimit, ale chcę archiwum, ponieważ 1) istnieje wiele małych plików 2) Wolę zarządzać pojedynczym plikiem zamiast drzewa. Dlatego używam tar.

Nicolas Raoul
źródło
1
Co za sprytny pomysł na stworzenie tak dużego tarballa: DDD A co z „ładnym” poleceniem?
jirib
1
@JiriXichtkniha: nicenie zapobiegnie 100% zużyciu procesora
Nicolas Raoul

Odpowiedzi:

22

Możesz użyć pvdo ograniczenia przepustowości rury. Ponieważ twój przypadek użycia jest silnie związany z IO, dodatkowe obciążenie procesora związane z przejściem przez potok nie powinno być zauważalne i nie musisz wykonywać żadnych operacji dławienia procesora.

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar
Gilles „SO- przestań być zły”
źródło
1
Nawet lepiej niż się spodziewałem! Ograniczam IO do 5 Mb / s, a procesor pozostaje na poziomie 13% (wydaje się rozsądne przy trwającym szyfrowaniu).
Nicolas Raoul
1
Bardzo dobrze!. Być może polecam także opcję -q, aby wyeliminować pasek postępu.
szabgab
takie świetne polecenie !!! Jeśli nie masz go w swoim Debianie / Ubuntu, po prostu uruchom apt-get install pv. Polecam dodanie `-b` po -L 1m: w ten sposób będzie drukowany przyrostowy licznik bajtów, aktualizowany co sekundę. W ten sposób wiesz, ile bajtów zostało napisanych do tej pory
lucaferrario
Pamiętaj również, że jeśli kompresujesz dane wyjściowe (używając tar czfzamiast tar cf), limit odnosi się do danych skompresowanych (więc przy -L 1mzapisie na dysku nie przekroczysz 1 MB / s .... ale odczyt dysku prawdopodobnie będzie wynosił między 1 MB / s i 5 MB / s, w zależności od typu zawartości)
lucaferrario,
Świetna sztuczka! Podczas kompresji za pomocą xz, najpierw przepuszczam pv, a następnie przez xz.
Jean-Bernard Jansen,
8

Możesz wypróbować narzędzie cpulimit, które ogranicza procent procesora. To nie jest standardowe narzędzie, więc musisz je zainstalować. Oto krótki fragment README:

„Cpulimit to narzędzie, które próbuje ograniczyć użycie procesora przez proces (wyrażone w procentach, a nie w czasie procesora). [...] Kontrola używanej ilości procesora odbywa się poprzez wysyłanie sygnałów SIGSTOP i SIGCONT POSIX do procesów. Wszystkie procesy potomne i wątki określonego procesu będą miały ten sam procent procesora ”.

W takim razie poleciłbym ionice do ograniczenia użycia IO, chociaż ograniczony byłby równoczesny dostęp, a nie maksymalna przepustowość ... Jednak nie mniej tutaj jest jak z niego korzystać:

ionice -c 3 <your_command>
Huygens
źródło
Świetny! Wygląda na to, że szukałem cpulimit.
Nicolas Raoul
2

Tak naprawdę nie można uzyskać mniejszego procesu . Możesz użyć, niceaby nadać mu niższy priorytet, ale dotyczy to innych procesów. Sposobem na uruchomienie procesora chłodzącego podczas działania procesu jest usleep(3)wymuszenie przez proces określonego czasu, ale wymagałoby to łatania tarlub użycia LD_PRELOADmechanizmu w celu zapewnienia łatanej funkcji, która tarczęsto wykorzystuje (np. fopen(3)).

Podejrzewam, że twoje najlepsze obejścia to sprzętowe, o których wspomniałeś w SuperUser: utrzymywanie chłodu laptopa i / lub obniżanie zegara procesora.

Irytujące, ale prawdopodobnie realne obejście (kludge, naprawdę) działa na poziomie „makroskopowym”. Zamiast taruruchamiać 100 ms co 200 ms, możesz sprawić, że będzie działać o jedną sekundę na każde dwa. Uwaga: to jest okropna, okropna kludge. Ale hej, to może nawet zadziałać!

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

Pierwszy sleepdostosowuje czas snu, drugi dostosowuje czas działania. W obecnej postaci ma 50% cyklu pracy. Aby utrzymać niską temperaturę, najprawdopodobniej będziesz musiał zmniejszyć cykl pracy do około 25% lub mniej (1 sekunda pracy, 3 sekundy snu = 1 na każde 4 sekundy = 25% cyklu pracy). Nawiasem sleepmówiąc, polecenie powłoki może zajmować ułamkowe czasy. Więc możesz nawet powiedzieć sleep 0.1. Dla pewności trzymaj go powyżej 0,001 i nie zapominaj, że wykonywanie skryptu również wydłuża czas.

Alexios
źródło
+1 Fajny pomysł! Wydaje mi się, że jest podobny do narzędzia cpulimit, które sugeruje Huygens.
Nicolas Raoul
Tyle że narzędzie Huuygensa jest znacznie lepsze i bardziej praktyczne, dlatego ta odpowiedź otrzymała moją +1. :)
Alexios
0

Bardziej ogólnym sposobem ograniczenia procesora jest użycie /sys. Wydaje się, że i tak chcesz, ponieważ rzeczy inne niż tarsą w stanie wykonywać kosztownie obliczeniowe zadania, po prostu to, co widzisz, tarrobi to najbardziej.

Sposobem na to jest:

  1. przejdź do /sys/devices/system/cpu/cpuX/cpufreqkażdego procesora (zamień na cpuXkażdy procesor).
  2. Następnie sprawdź w pliku, scaling_available_frequenciesjakie częstotliwości obsługuje Twój procesor.
  3. Wybierz częstotliwość (powiedzmy 1234567) i zrób echo 1234567 > scaling_max_freq

Zapobiegnie to przekroczeniu przez procesor częstotliwości powyżej określonej częstotliwości.

Patrick
źródło
Dzięki, ale jestem już na najniższej możliwej częstotliwości. Powinienem o tym wspomnieć. Zacząłem podkręcać, gdy tylko pojawiły się te problemy.
Nicolas Raoul,