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

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

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

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

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

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

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

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

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

«Cpulimit – это инструмент, который пытается ограничить использование процессором процесса (выраженное в процентах, а не в процессорном времени). […] Управление используемой суммой процессора завершается отправкой сигналов SIGSTOP и SIGCONT POSIX в процессы. процессы и потоки дочерних процессов указанного процесса будут обладать одним и тем же процентом процессора ».

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

 ionice -c 3 <your_command> 

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

Я подозреваю, что ваши лучшие обходные решения – это аппаратные функции, о которых вы упоминали в SuperUser: поддержание охлаждения ноутбука и / или снижение тактовых импульсов процессора.

Назойливое, но возможно жизнеспособное обходное решение (kludge, действительно) работает на «макроскопическом» уровне. Вместо того, чтобы делать 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 0.1 . Держите его выше 0,001, чтобы быть уверенным, и не забывайте, что выполнение скрипта добавляет и время.

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

Способ сделать это:

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

Это предотвратит превышение ЦП от указанной частоты.