Запобігання використанню смоли занадто багато процесора та диска (старий ноутбук виходить з ладу, якщо на 100%)


15

Я хочу створити резервну копію 1 терабайт даних на зовнішній диск.

Я використовую цю команду: tar cf /media/MYDISK/backup.tar mydata

ПРОБЛЕМА: Мій поганий ноутбук зависає та виходить з ладу щоразу, коли я використовую 100% процесор або 100% диск (якщо ви хочете на це відреагувати, напишіть тут ) . Тому я хочу залишатися на рівні близько 50% процесора та 50% диска максимум.

Моє запитання: Як придушити процесор і диск за допомогою tarкоманди?

У Rsync є варіант --bwlimit, але я хочу архів, оскільки 1) є багато невеликих файлів 2) Я вважаю за краще керувати одним файлом, а не деревом. Тому я і використовую tar.


1
Яка розумна ідея зробити такий величезний тарбол: DDD Що з командою 'nice'?
джибір

1
@JiriXichtkniha: niceне завадить 100% використання процесора
Nicolas Raoul

Відповіді:


22

Можна використовувати pvдля придушення пропускної здатності труби. Оскільки ваш випадок використання сильно пов'язаний з IO, додані накладні витрати процесора на проходження труби не повинні бути помітними, і вам не потрібно робити жодне процесорування.

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

1
Навіть краще, ніж те, що я очікував! Я обмежую IO до 5 Мб / секунду, а процесор залишається на рівні 13% (здається розумним, коли шифрування триває).
Ніколя Рауль

1
Дуже хороша!. Може також рекомендувати прапор -q для усунення панелі прогресу.
szabgab

така велика команда !!! Якщо у вас немає Debian / Ubuntu, просто запустіть apt-get install pv. Рекомендую після -L 1mцього додати `-b` : таким чином буде надруковано додатковий байтовий лічильник, який оновлюється щосекунди. Таким чином ви знаєте, скільки байтів було написано дотепер
lucaferrario

Крім того, зауважте, що якщо ви стискаєте вихід (використовуючи tar czfзамість tar cf), то ліміт стосується стисненого виводу (так що запис на -L 1mдиску не перевищує 1 Мб / с .... і 5 Мб / с, залежно від типу вмісту)
lucaferrario

Чудова хитрість! При стисканні з xz я проводжу спочатку через pv, потім через xz.
Жан-Бернар Янсен

8

Ви можете спробувати інструмент cpulimit, який обмежує відсоток процесора. Це не стандартний інструмент, тому вам доведеться його встановити. Ось короткий уривок README:

"Cpulimit - це інструмент, який намагається обмежити використання процесора процесом (виражається у відсотках, а не в процесі процесора). [...] Контроль використовуваної кількості процесора здійснюється надсиланням сигналів SIGSTOP та SIGCONT POSIX процесам. Усі дочірні процеси та нитки зазначеного процесу поділять однаковий відсоток процесора ".

Тоді я б рекомендував ionice для обмеження використання IO, хоча саме паралельний доступ був би обмеженим, а не максимальною пропускною здатністю ... Ніколи тут не застосовується:

ionice -c 3 <your_command>

Чудово! Схоже, що я шукав cpulimit.
Nicolas Raoul

2

Ви дійсно не можете змусити процес запускати менше . Ви можете використовувати його, niceщоб надати йому нижчий пріоритет, але це стосується інших процесів. Спосіб запуску кулера процесора під час запуску процесу полягає у використанні, usleep(3)щоб витіснити процес із стану запуску певний проміжок часу, але це передбачало б виправлення tarабо використання LD_PRELOADмеханізму для надання виправленої функції, яка tarвикористовує багато (наприклад, fopen(3)).

Я підозрюю, що ваші найкращі шляхи вирішення - саме ті апаратні, які ви згадали на SuperUser: підтримка ноутбука в прохолоді та / або зниження годинника процесора.

Дратівливий, але можливо життєздатний спосіб вирішення проблеми (насправді неприємність) працює на "макроскопічному" рівні. Замість того, щоб робити tarпробіг 100 м кожні 200 мс, ви можете змусити його пробігати одну секунду кожні два. Примітка: це жахливий, жахливий хитрощі. Але ей, це може навіть спрацювати!

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

Перший sleepрегулює час сну, другий - регулює час виконання. Як зараз, це має 50% робочий цикл. Щоб знизити температуру, вам, швидше за все, потрібно буде зменшити робочий цикл до, можливо, 25% або нижче (1 секунда пробігу, 3 секунди сну = 1 кожні 4 секунди = 25% робочого циклу). Команда оболонки sleep, до речі, може приймати дробові часи. Так ви могли навіть сказати sleep 0.1. Тримайте його понад 0,001, щоб бути впевненим, і не забувайте, що виконання сценарію також додає часу.


+1 Приємна ідея! Я думаю, це схоже на інструмент cpulimit, який пропонує Гюйгенс.
Nicolas Raoul

За винятком того, що інструмент Гюйгенса набагато кращий та практичніший, саме тому ця відповідь отримала мій власний +1. :)
Олексій

0

Більш загальним способом обмеження процесора є використання /sys. Це схоже на те, що ви хочете в будь-якому випадку, оскільки речі, крім tarяких здатні виконувати обчислювально дорогі завдання, його саме те, що ви бачите, tarробить це найбільше.

Спосіб це зробити:

  1. перейдіть на /sys/devices/system/cpu/cpuX/cpufreqкожен ваш процесор (замініть cpuXкожен процесор).
  2. Потім перегляньте файл, scaling_available_frequenciesщоб побачити, які частоти підтримує ваш процесор.
  3. Виберіть частоту (скажімо, 1234567) і зробіть echo 1234567 > scaling_max_freq

Це не дасть процесору колись перевищувати задану частоту.


Дякую, але я вже на мінімально можливій частоті. Я мав це сказати. Я почав розблокувати, як тільки ці проблеми почали з’являтися.
Ніколя Рауль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.