Предотвращение использования tar слишком большого количества процессора и диска (старый ноутбук вылетает, если 100%)


15

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

Я использую эту команду: tar cf /media/MYDISK/backup.tar mydata

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

Мой вопрос: как дросселировать процессор и диск с помощью tarкоманды?

В Rsync есть опция --bwlimit, но я хочу архив, потому что 1) есть много маленьких файлов 2) я предпочитаю управлять одним файлом, а не деревом. Вот почему я использую tar.


1
Какая умная идея сделать такой огромный тарбол: DDD А как насчет «милой» команды?
Джириб

1
@JiriXichtkniha: niceне помешает 100% загрузки процессора
Николас Рауль

Ответы:


22

Вы можете использовать pvдля регулирования пропускной способности канала. Так как ваш сценарий использования строго связан с вводом-выводом, дополнительные накладные расходы ЦП при прохождении канала не должны быть заметны, и вам не нужно выполнять какое-либо регулирование ЦП.

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

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

1
Очень хорошо!. Может также порекомендовать флаг -q, чтобы убрать индикатор выполнения.
Сабгаб

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

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

Отличный трюк! При сжатии с помощью xz я сначала передаю pv, а затем через xz.
Жан-Бернар Янсен

8

Вы можете попробовать инструмент cpulimit, который ограничивает процент загрузки процессора. Это не стандартный инструмент, поэтому вам придется установить его. Вот краткая выдержка из README:

«Cpulimit - это инструмент, который пытается ограничить использование процессором ЦП (выраженное в процентах, а не во времени ЦП). [...] Контроль используемого количества ЦП осуществляется путем отправки сигналов SIGSTOP и SIGCONT POSIX процессам. Все дочерние процессы и потоки указанного процесса будут использовать один и тот же процент процессоров. "

Тогда я бы порекомендовал ionice для ограничения использования ввода-вывода, хотя именно параллельный доступ будет ограничен, а не максимальная пропускная способность ... Тем не менее, вот как это использовать:

ionice -c 3 <your_command>

Большой! Кажется, что я искал cpulimit.
Николас Рауль

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, который предлагает Гюйгенс.
Николас Рауль

За исключением того, что инструмент Huuygens гораздо лучше и практичнее, поэтому этот ответ получил мой +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.