Рейтинг:4

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

флаг cn

Мне часто нужно выполнить резервное копирование исходного диска на несколько целевых дисков. На данный момент рабочий процесс rsync от источник к цель1 тогда дд клон цель1 к цель2.
Было бы прекрасно, если бы я мог rsync от источник к цель1+цель2 последовательно в одной и той же операции чтения, чтобы значительно ускорить процесс. Считайте файл в память один раз и запишите его на два отдельных жестких диска с большой синхронностью.
Возможно, есть способ rsync прочитать файл в память и передать вывод на две операции записи одновременно? Не имеют быть rsync но это было бы гораздо предпочтительнее.

sudodus avatar
флаг jp
Я думаю, что то, что вы хотите, уже происходит в текущих версиях Ubuntu, если есть достаточно свободной оперативной памяти для всего файла или всего пакета файлов, которые rsync или какой-либо другой инструмент должен скопировать. (Но большой файл или пакет файлов может не поместиться в ОЗУ). Я заметил, что когда я создаю загрузочные USB-накопители из файла iso, во второй раз процесс чтения почти не требует времени (но, конечно, процесс записи все равно будет ограничен скоростью записи каждого целевого устройства).
Рейтинг:6
флаг pl

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

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

Важные заметки:

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

время <опция #N, копирование в одну цель>
time <опция #N, копирование в две цели>

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

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

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

$ время cp -p источник/файл1 цель1/

реальный 0м0,846с 0м0,680с 0м0,659с
пользователь 0м0,000с 0м0,001с 0м0,016с
система 0m0,777s 0m0,662s 0m0,643s

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

  1. Вариант параллельно

    $ parallel cp -p источник/файл1 ::: цель1/
    реальный 0м0,745с 0м0,740с
    пользователь 0м0,121с 0м0,108с
    система 0м0,609с 0м0,619с
    
    $ parallel cp -p источник/файл1 ::: цель1/ цель2/
    реальный 0м0,794с 0м0,860с
    пользователь 0м0,116с 0м0,134с
    система 0m1300s 0m1380s
    
  2. Вариант тройник (добавление > /dev/ноль чтобы избежать вывода на стандартный вывод)

    $ tee target1/file1 < источник/file1 > /dev/null
    реальный 0 мин 0,874 с 0 мин 1 040 с 0 мин 1 028 с
    пользователь 0м0,160с 0м0,172с 0м0,137с
    система 0m0,714s 0m0,868s 0m0,887s
    
    $ tee цель1/файл1 цель2/файл1 < источник/файл1 > /dev/null
    реальный 0 мин 1 802 с 0 мин 1 680 с 0 мин 1 833 с
    пользователь 0м0,136с 0м0,212с 0м0,197с
    sys 0m1642s 0m1468s 0m1619s
    

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

  3. Вариант xargs

    $ эхо-цель1 | xargs -n 1 cp -p источник/файл1
    реальное 0м0,666с
    пользователь 0м0,021с
    система 0m0,646s
    
    $ эхо цель1 цель2 | xargs -n 1 cp -p источник/файл1
    реальное 0m1,197s
    пользователь 0м0,018с
    система 0m1,173s
    

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

  4. Вариант найти

    $ find target1 -exec cp -p source/file1 {} \;
    реальное 0м2,167с
    пользователь 0м0,017с
    система 0m1,627s
    
    $ найти цель1 цель2 -exec cp -p источник/файл1 {} \;
    реальное 0м3,905с
    пользователь 0м0,020с
    система 0м3,185с
    

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

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

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

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

  1. https://unix.stackexchange.com/questions/91382/rsync-is-very-slow-factor-8-to-10-compared-to-cp-on-copying-files-from-nfs-sha
  2. https://lwn.net/Статьи/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`?
sudodus avatar
флаг jp
Проверяли ли вы использованное время (с довольно большими файлами), чтобы убедиться, что ваши примеры действительно избегают повторного чтения исходного файла или иным образом улучшают скорость по сравнению с «двойным копированием»?
sancho.s ReinstateMonicaCellio avatar
флаг pl
@sudodus - Вы правы, скоро уточним этот момент.
sudodus avatar
флаг jp
Дайте угадаю: пример с parallel будет лучшим (или хотя бы одним из лучших).
sancho.s ReinstateMonicaCellio avatar
флаг pl
@sudodus - «параллельный» кажется не только лучшим, но и единственным, который достигает цели.
Рейтинг:3
флаг cn

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

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

мкфифо
ssh remotec 'rsync -av --read-batch=- destc' <myfifo &
спать 1
rsync -av --write-batch=myfifo srca/ remoteb:destb

--read-batch нельзя использовать с удаленный: пункт назначения стиль назначения.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.