Могу ли я скопировать файл на два диска одновременно с одного чтения? (Скопируйте один-два за одну операцию, предпочтительно в rsync)

Мне часто требуется резервное копирование исходного диска на несколько целевых дисков . На данный момент рабочий процесс rsync от источника до target1 , затем dd clone target1 в target2 .
Было бы прекрасно, если бы я мог rsync от источника до target1 + target2 последовательно в одной операции чтения, чтобы значительно ускорить процесс. Прочтите файл в память один раз и запишите его на два отдельных жестких диска в большой синхронности.
Есть ли способ, чтобы rsync считывал файл в память и передавал вывод по конвейеру до двух операций записи одновременно? не должно быть как rsync , но это было бы предпочтительнее.

4
задан 11 July 2021 в 17:02

2 ответа

rsync имеет пакетный режим , с которым вы можете поэкспериментировать. Когда вы выполняете rsync --write-batch = foo from to , он выполняет обычное копирование, но также реплицирует инструкции и данные в файл foo . Если вместо файла это FIFO, вы можете использовать второй rsync параллельно для чтения FIFO и выполнения нового rsync в другое место назначения. Очевидно, что новый пункт назначения должен быть достаточно похож на исходный, чтобы иметь смысл.

Например, по сети вы можете попробовать

mkfifo myfifo
ssh remotec 'rsync -av --read-batch=- destc' <myfifo &
sleep 1
rsync -av --write-batch=myfifo srca/ remoteb:destb

- пакетное чтение не может использоваться с адресатом в стиле remote: destc .

2
ответ дан 28 July 2021 в 11:20

Собирая информацию из нескольких источников, есть несколько вариантов.

Вывод таков, что только с командой parallel вы можете получить то, что хотите, см. Ниже.

Важные примечания:

  1. Я провел тесты с cp для копирования. Вы также должны учитывать увеличение (или уменьшение!) Ускорения, полученное с помощью rsync vs cp или других альтернативных команд в сочетании с parallel .
  2. Я тестировал копирование только одного файла. Результаты могут измениться при копировании большого количества файлов (например,, комбинируя несколько больших файлов по мере необходимости со многими другими небольшими файлами и подкаталогами).

Для каждого из вариантов я протестировал оба
time <option #N, copying to one target>
time <option #N, copying to two targets>

, чтобы получить сравнение, с файлом размером 1,2 ГБ. Более того, в некоторых случаях я тестировал два или три раза больше та же команда, чтобы оценить разброс результатов. Я не вычислял средние значения и стандартные отклонения, но результаты очевидны.

Это то, что я получил в условиях тестирования, указанных выше, с краткими комментариями. Я объединил в одну строку результаты нескольких тестов, когда они доступны.

Базовый вариант :

$ time cp -p source/file1 target1/

real    0m0,846s    0m0,680s    0m0,659s
user    0m0,000s    0m0,001s    0m0,016s
sys     0m0,777s    0m0,662s    0m0,643s

Параметры копирования :

  1. Параметр параллельный

     $ parallel cp -p source / file1 ::: target1 / 
    real 0m0,745s 0m0,740s 
    user 0m0,121s 0m0,108s 
    sys 0m0,609s 0m0,619s 
     
     $ parallel cp - p source / file1 ::: target1 / target2 / 
    real 0m0,794s 0m0,860s 
    user 0m0,116s 0m0,134s 
    sys 0m1,300s 0m1,380s {{1 }} 
  2. Параметр tee (добавление > / dev / null , чтобы избежать вывода в stdout )

     $ tee target1 / file1  / dev / null 
    real 0m0,874s 0m1,040s 0m1,028s 
    user 0m0,160s 0m0,172s 0m0,137s 
    sys 0m0,714s 0m0,868s 0m0,887s 
     
     $ tee target1 / file1 target2 / file1  / dev / null 
    real 0m1,802s 0m1,680s 0m1,833s 
    user 0m0, 136s 0m0,212s 0m0,197s 
    sys 0m1,642s 0m1,468s 0m1,619s 
     

    Копирование на две целевые s примерно удваивает время для одной target , что немного больше, чем время для базы дело .

  3. Опция xargs

     $ echo target1 | xargs -n 1 cp -p source / file1 
    real 0m0,666s 
    user 0m0,021s 
    sys 0m0,646s 
     
     $ echo target1 target2 | xargs -n 1 cp -p source / file1 
    real 0m1,197s 
    user 0m0,018s 
    sys 0m1,173s 
     

    Копирование на два target s примерно удваивает время для одной цели , что аналогично времени для базового случая .

  4. Параметр find

     $ find target1 -exec cp -p source / file1 {} \; 
    real 0m2,167s 
    user 0m0,017s 
    sys 0m1,627s 
     
     $ find target1 target2 -exec cp -p source / file1 {} \; 
    real 0m3,905s 
    user 0m0,020s {{1 }} sys 0m3,185s 
     

    Копирование в две target s примерно удваивает время для одной target , что намного больше, чем время для ] базовый вариант ... явный неудачник.

Источники для «множественного копирования» :

  1. https://www.cyberciti.biz/faq/linux-unix-copy-a-file-to-multiple-directories-using-cp-command/
  2. Как скопировать файл в несколько папок с помощью командной строки?
  3. -gnu-cp-command

Источники производительности cp vs. rsync :

  1. https://unix.stackexchange.com/questions/91382/rsync-is- очень-медленный-фактор-8-к-10-по сравнению с-cp-on-copying-files-from-nfs-sha
  2. https://lwn.net/Articles/400489/
  3. https: / /superuser.com/questions/1170636/why-is-there-a-write-speed-difference-between-dd-cp-rsync-and-macos-finder-to
  4. В чем разница между `cp` и ` rsync `?
5
ответ дан 28 July 2021 в 11:20

Другие вопросы по тегам:

Похожие вопросы: