Как я могу уменьшить использование ресурсов при копировании большого файла?

8

Мне нужно переместить большой файл (поврежденная таблица MySQL ~ 40 ГБ) на отдельный сервер, чтобы восстановить его. (При попытке восстановить на моем производственном сервере, он быстро убил сервер).

Для этого я хочу rsync файлы .frm, .MYI и .MYD с моего производственного сервера на облачный сервер.

Я копирую файлы из / var / lib / mysql / {database} / в / home / {myuser}, так что мне не нужно включать корневой доступ для команды rsync и я на 100% уверен, что файл базы данных не используется (это не должно быть записано или прочитано, но, очевидно, я не хочу закрывать производственную базу данных, чтобы убедиться).

Первый файл, который я попытался скопировать, был размером около 10 ГБ. Я перемещаюсь с одной части моего производственного сервера на другую, то есть на тот же массив дисков.

К сожалению, команда копирования "cp filename newfilename" заняла столько ресурсов, что остановила сервер.

Как я могу использовать меньше ресурсов при копировании файла в другой каталог? (Неважно, сколько времени это займет).

Предполагая, что мне удастся сделать это, какое использование ресурсов можно ожидать при повторном синхронизировании файла в облаке?

Кто-нибудь может предложить лучший способ сделать это? У меня быстро заканчивается свободное место на диске, поэтому мне нужно как можно быстрее восстановить и заархивировать эту таблицу.

Джон М
источник

Ответы:

5

Вы пробовали nice -n10префикс к команде?

10значение по умолчанию. Диапазон изменяется от -20(самый высокий приоритет) до 19(самый низкий).

Джонатан Росс
источник
@Jonathan Насколько я понимаю, это ограничит использование только процессора, а не дискового ввода-вывода и ОЗУ: linux.com/archive/feed/58638
Jon M
Да, но это начало, с точки зрения уменьшения одного из узких мест - этого может быть достаточно, чтобы остановить зависание машины.
Джонатан Росс
Спасибо @Jonathan Ross, в соответствии с этим: linux.die.net/man/1/ionice «Программы наследуют хорошие настройки CPU для приоритетов io.», Так что это может просто сработать, но я изучаю комбинацию «nice» и "Ионис"
Джон М
Хорошая мысль. Я всегда начинал с niceпривычки. iotopтакже твой друг.
Джонатан Росс
3
Последняя команда, которую я nice -n 20 ionice -c 3 cp /var/lib/mysql/{database}/{table}.MYI /home/{USER}/выполнил, была: « Это увеличило нагрузку на мой сервер, немного замедляя его, но веб-сайт был доступен на время передачи
Jon M
10

Два варианта помимо ограничения пропускной способности rsync:

  • ionice -c 3 cp foo bar
  • buffer -u 150 -m 16m -s 100m -p 75 -i foo -o bar

ioniceбудет взаимодействовать с планировщиком ввода / вывода. bufferпредставляет собой кольцевой буфер, предназначенный для повышения эффективности работы символьных устройств, но -u 150он делает паузу в 150 микросекунд между операциями записи, которых, согласно руководству, может быть достаточно, чтобы освободить место на диске.

И то, ioniceи другое bufferдоступно в стандартной сборке Ubuntu. iotopудобно, если в вашем ядре сконфигурировано CONFIG_TASK_DELAY_ACCT, но мой Ubuntu не сделал этого, что серьезно ограничивает удобство использования команды. Я уже знаю, какая команда топит мой жесткий диск, я просто хочу дать ему немного места для дыхания.

Кроме того, пока идет копирование, посмотрите на вывод iostat -x 1(обычно в пакете sysstat) и убедитесь, что поле% busy для вашего устройства составляет 90% или меньше во время копирования. Если он равен 99-100%, то вы не хотите использовать другие процессы для ввода-вывода.

zerolagtime
источник
Спасибо за ваш ответ @zerolagtime. В итоге я использовал аналогичную команду ionice, но пометил предыдущий ответ как правильный
Jon M
ionice -c 3 -p $pidUnisonработает на унисон на внешнем HDD, спасибо !!
Водолей Сила
6

используйте rsync с ключом --bwlimit = KBPS (ограничить пропускную способность ввода-вывода; кбайт в секунду). поиграйте с меньшим файлом и постарайтесь найти оптимальное сочетание между скоростью передачи и использованием системы. Монитор во второй оболочке с "vmstat 1"

shakalandy
источник
Я, конечно, попробую это ограничить ресурсы команды RSYNC, но в данный момент я просто пытаюсь скопировать файл в другое место на моем сервере с помощью команды "cp".
Джон М
Вы также можете использовать rsync для копирования локального файла и ограничения полосы пропускания с помощью ключа --bwlimit.
Шакаланды
rsyncбудет копировать файлы локально. Думай, rsync --bwlimit=28000 foo.frm /bar/foo.frmа потом смотри iostat. Я не уверен, почему vmstatбы сказать вам, если вы насыщали диск. Ищите% занят в iostat.
zerolagtime
хорошо, vmstat показывает ваш ввод-вывод на блочных устройствах. Кроме того, вы можете увидеть что-то еще, что важно для использования машины (процессор, пользовательские процессы, ожидание процессора, обмен, ...)
shakalandy
0

Одна из альтернатив:

scp -l ${KBPS} ${src} ${dest}

Но я не думаю, что это сработает, если $ {src} - растущий файл ... Можете ли вы предложить способ копирования и ожидания закрытия источника ...

RZR
источник