Запобігання використанню смоли занадто багато процесора та диска (старий ноутбук виходить з ладу, якщо на 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.