Мне часто требуется резервное копирование исходного диска на несколько целевых дисков . На данный момент рабочий процесс rsync
от источника до target1 , затем dd
clone target1 в target2 .
Было бы прекрасно, если бы я мог rsync
от источника до target1 + target2 последовательно в одной операции чтения, чтобы значительно ускорить процесс. Прочтите файл в память один раз и запишите его на два отдельных жестких диска в большой синхронности.
Есть ли способ, чтобы rsync
считывал файл в память и передавал вывод по конвейеру до двух операций записи одновременно? не должно быть как rsync
, но это было бы предпочтительнее.
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
.
Собирая информацию из нескольких источников, есть несколько вариантов.
Вывод таков, что только с командой parallel
вы можете получить то, что хотите, см. Ниже.
Важные примечания:
cp
для копирования. Вы также должны учитывать увеличение (или уменьшение!) Ускорения, полученное с помощью rsync
vs cp
или других альтернативных команд в сочетании с parallel
. 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
Параметры копирования :
Параметр параллельный
$ 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 }}
Параметр tee
(добавление > / dev / null
, чтобы избежать вывода в stdout
)
$ tee target1 / file1
Копирование на две целевые
s примерно удваивает время для одной target
, что немного больше, чем время для базы дело .
Опция 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 примерно удваивает время для одной цели
, что аналогично времени для базового случая .
Параметр 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
, что намного больше, чем время для ] базовый вариант ... явный неудачник.
Источники для «множественного копирования» :
Источники производительности cp
vs. rsync
: