Как я могу замедлить rsync?

35

Я пытаюсь скопировать содержимое неисправного флэш-накопителя USB. Если я читаю данные слишком быстро, микросхема контроллера накопителя перегревается и накопитель исчезает из системы. Когда это происходит, мне нужно отключить диск, подождать минутку или около того, чтобы он остыл, снова подключить его и перезапустить копию.

У меня есть старая резервная копия содержимого диска, поэтому очевидный способ получить оставшуюся часть данных - использовать ее rsyncдля обновления резервной копии, но это приводит к целому «слишком быстрое чтение, диск исчезает» и мне нужно начать заново ». Есть ли способ сказать, rsyncчтобы прочитать только X мегабайт данных в минуту? В качестве альтернативы, можно ли сказать ему, чтобы приостановить операции, когда диск исчезает, и возобновить, когда он снова подключен?

отметка
источник
24
Вы думали об охлаждении диска?
AEonAX
3
Насколько полон диск? Если накопитель заполнен более чем на 50%, вероятно, лучше сначала просто отразить отказавший диск, а затем только начинать работать с более сложными вещами на зеркале.
kasperd
1
@AEonAX: Несмотря на то, что это классная (оригинальная) идея, я бы не советовал: вы подвергаете устройство дополнительному тепловому напряжению, и оно может полностью выйти из строя.
Писквор

Ответы:

46

В отличие от опыта DopeGhoti, этот --bwlimitфлаг ограничивает передачу данных с помощью моего rsync (v3.1.2).

тест:

$ dd if=/dev/urandom bs=1M count=10 of=data
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0871822 s, 120 MB/s

$ du -h data
10M     data

$ time rsync -q data fast
0.065 seconds

$ time rsync -q --bwlimit=1M data slow
10.004 seconds

(примечание: мой timeвывод выглядит иначе, чем большинство timeвызовов ( zshфункция), эти времена не редактировались мной)

В противном случае, возможно , что - то вдоль линий двойного -execдюйма find. Я считаю, что rsync -Rследует создавать и копировать родительские папки, но если это не так, то cp --parentsследует.

$ find /failing/usb -exec rsync -R {} /somewhere/safe/ \; -exec sleep 1 \;

Примечание : также проверьте ddrescue , это может быть правильным, что вы ищете :)

абрикосовый мальчик
источник
1
Ага. Возможно, DG запутался в слове «полоса пропускания», но это относится к любому каналу передачи данных, а не только к сети. На странице --bwlimit=KBPS limit I/O bandwidth; KBytes per secondруководства конкретно сказано: нет упоминаний о сети. Случайный просмотр кода, это ограничивает скорость чтения , независимо от места назначения. Плюс, анекдот: я использую эту опцию в течение многих лет, чтобы ограничить локальную скорость записи. linux.die.net/man/1/rsync
Писквор
1
Хорошо, на втором взгляде, он фактически подсчитывает количество записанных байтов и спит в течение рассчитанного времени. io.c, строки 832-3: if (bwlimit_writemax) sleep_for_bwlimit(n);в любом случае, это, вероятно, будет работать так, как задумано, читать короткими очередями и спать между ними. Я бы порекомендовал начать с низкого значения и осторожно увеличивать, или просто позволить медленной передаче работать всю ночь.
Писквор
25

В некотором роде решение MacGyver, но в прошлом у меня был хороший успех:
поместите старый USB 1-хаб между флешкой и компьютером. Ни в коем случае, черт возьми, он так быстро не скопирует :-)

Другая возможность: если у вас есть другая доступная флешка, подключите ее к другому USB-порту, подключенному к тому же корневому концентратору (чтобы он разделял пропускную способность с вашей проблемной флешкой).
Теперь запустите большую операцию записи на дополнительную палку, чтобы обе палочки конкурировали за пропускную способность. Для дальнейшего контроля вы можете использовать ionice, чтобы еще больше снизить приоритет на проблемной ручке.

Tonny
источник
1
Я уверен, что должен быть способ заставить порты работать как USB 1.1 через программное решение, возможно, путем предоставления опций модулю ядра USB.
Андре Бори
@ AndréBorie: есть - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 , но поскольку в SW имеются эффективные дроссели, это немного грубое решение.
Писквор
@Piskvor согласовывает более низкую скорость передачи данных с устройством, как если бы использовался концентратор USB 1. Я не вижу в этом ничего "грубой силы".
Андре Бори
Хорошо, плохой выбор слова, я признаю. Но ИМХО для перенастройки устройств потребуются особые привилегии (root или как минимум% adm), в то время как управление скоростью чтения для каждого процесса будет проще. (Плюс, есть устройства, которые вообще не работают вне USB 2.0 - в нарушение спецификации)
Piskvor
13

Вы можете использовать rsync --bwlimit=RATEдля регулирования скорости передачи файлов, которая, основываясь на комментариях ниже, на самом деле, по-видимому, работает, ограничивая скорость чтения данных, которая является именно тем, что вы ищете.

DopeGhoti
источник
6
ionice? linux.die.net/man/1/ionice
Стив
3
ionice просто отдает приоритет, если две вещи читаются тогда, по умолчанию они получают 50/50. Ионис может отрегулировать это, но если будет прочитано только одно, то получится 100%.
Котейр
@coteyr Вы правы, и поэтому вам нужно объединить его со вторым процессом по пропускной способности на том же корневом USB-концентраторе USB. Смотри мой ответ.
Тонни
2
К счастью, ваш ответ неверен: --bwlimitустанавливает лимит ввода-вывода, а не обязательно лимит сети . Протестировано много раз в различных сценариях: эта опция заставляет rsync ограничивать чтение независимо от места назначения. (Обнаружено это в похожем сценарии, когда быстрые записи на медленное локальное устройство
приводили к
1
@piskvor - спасибо за это! Это то, что я люблю в этом месте; Я продолжаю изучать новые вещи (:
DopeGhoti
8

Больше решений, в дополнение к rsync --bwlimit=100, для 100 КБ / с.

  1. Используйте ddrescueс --max-read-rateопцией для полной копии диска. Это также позволит вам перезапустить полную копию диска, где он остановился после ошибки.

    ddrescue --max-read-rate=100K /failing/usb output.img output.logfile
    

ddrescueТакже есть много других опций, относящихся к восстановлению данных, см. руководство здесь .

  1. Используйте pv(«просмотрщик труб») с --rate-limitпараметром или throttleинструментом для ограничения количества труб. pvтакже может показать прогресс. Вы можете сделать эту работу для любого инструмента, который использует трубу или может использовать трубу:

    tar -cf - /failing/usb | throttle -K 100 | tar -C /your/outputfolder/ -xvf -
    

    или

    tar -cf - /failing/usb | pv --rate-limit 100k | tar -C /your/outputfolder/  -xvf -
    

    Взгляните на страницу руководства pv для получения дополнительных настроек и примеров. Для throttle, вы можете также попробовать -wопцию, которая определяет, как рассчитывается скорость, см. Справочную страницу газа .

jmiserez
источник
Теперь это полезный инструмент, не знаю, спасибо! pvУ manpage есть еще больше примеров различных применений.
Писквор
С pvтех пор я снова и снова открываю для себя дни, когда я играл на кассетах. Назад, когда tar записывал на ленточные накопители. :)
Дэн Гартвейт