Я использую rsync
скрипт для синхронизации данных на одном хосте с данными на другом хосте. Данные содержат множество небольших файлов, размер которых составляет почти 1,2 ТБ.
Для синхронизации этих файлов я использовал rsync
команду следующим образом:
rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/
Содержимое proj.lst выглядит следующим образом:
+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *
В качестве теста я выбрал два из этих проектов (8,5 ГБ данных) и выполнил команду выше. Будучи последовательным процессом, он занимает 14 минут 58 секунд. Таким образом, для 1,2 ТБ данных это займет несколько часов.
Если бы я мог несколько rsync
параллельных процессов ( с использованием &
, xargs
или parallel
), это позволит сэкономить свое время.
Я попытался с помощью команды ниже parallel
(после cd
входа в исходный каталог), и это заняло 12 минут 37 секунд для выполнения:
parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .
Это должно было занять в 5 раз меньше времени, но это не так. Я думаю, я где-то не так.
Как я могу запустить несколько rsync
процессов, чтобы сократить время выполнения?
источник
rsync
s является нашей первоочередной задачей.rsync
параллелей - это основное внимание сейчас.Ответы:
Следующие шаги сделали эту работу за меня:
rsync --dry-run
первый, чтобы получить список файлов, которые будут затронуты.cat transfer.log
toparallel
, чтобы запустить 5rsync
с параллельно, следующим образом:Здесь
--relative
опция ( ссылка ) гарантировала, что структура каталогов для затронутых файлов, в источнике и в месте назначения, останется неизменной (внутри/data/
каталога), поэтому команда должна быть запущена в исходной папке (например,/data/projects
).источник
split
и передать эти имена файлов параллельно. Затем используйте rsync,--files-from
чтобы получить имена файлов из каждого файла и синхронизировать их. rm резервных копий. * split -l 3000 резервных копий. резервные копии ls. * | параллельный --line-buffer --verbose -j 5 rsync --progress -av --files-from {} / ЛОКАЛЬНЫЙ / РОДИТЕЛЬ / ПУТЬ / REMOTE_HOST: REMOTE_PATH /receiving file list ... done
created directory /data/
.--info=name
вместо них-v
, и вы получите только имена файлов и каталогов. Возможно, вы захотите использовать --protect-args для «внутренней» передачи rsync, если в любых файлах могут быть пробелы или метасимволы оболочки.Я лично использую этот простой:
Что полезно, только если у вас есть несколько непустых каталогов, в противном случае вы получите почти все
rsync
завершающие, а последний будет выполнять всю работу в одиночку.источник
Я категорически не рекомендую никому использовать принятый ответ. Лучшее решение - это сканировать каталог верхнего уровня и запускать пропорциональное количество операций rync.
У меня большой том zfs, и моим источником был cifs mount. Оба связаны с 10G, и в некоторых тестах можно насыщать ссылку. Производительность оценивалась с помощью
zpool iostat 1
.Исходный диск был смонтирован так:
Используя один
rsync
процесс:IO метр читает:
Это в синтетических тестах (кристаллический диск), производительность для последовательной записи приближается к 900 МБ / с, что означает, что связь насыщена. 130МБ / с это не очень хорошо, а разница между ожиданием выходных и двух недель.
Итак, я собрал список файлов и попытался снова запустить синхронизацию (у меня 64-ядерный компьютер):
и у него была такая же производительность!
В качестве альтернативы я просто запустил rsync для корневых папок:
Это фактически повысило производительность:
В заключение, как вспомнил @Sandip Bhattacharya, напишите небольшой скрипт, чтобы получить каталоги и параллельно с ним. Также можно передать список файлов в rsync. Но не создавайте новые экземпляры для каждого файла.
источник
Проверенный способ выполнения параллельной rsync: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync.
источник
find
?--dry-run
опцию вrsync
, у меня будет список файлов, которые будут переданы. Могу ли я предоставить этот список файловparallel
, чтобы распараллелить процесс?mkdir -p /dest-dir/{//}\;
часть? Особенно{//}
это немного смущает.Для многоцелевой синхронизации я использую
Подсказка: все соединения SSH устанавливаются с открытыми ключами в
~/.ssh/authorized_keys
источник
Я всегда гуглю на параллельную rsync, так как всегда забываю полную команду, но ни одно решение не сработало для меня так, как я хотел - оно включает несколько шагов или требует установки
parallel
. В итоге я использовал эту однострочную синхронизацию для нескольких папок:-P 5
это количество процессов, которые вы хотите порождать - используйте 0 для неограниченного (очевидно, не рекомендуется).--bwlimit
чтобы избежать использования всей полосы пропускания.-I %
аргумент предоставлен find (каталог найден вdir/
)$(echo dir/%/ host:/dir/%/)
- печатает каталоги источника и назначения, которые rsync читает как аргументы. % заменяется наxargs
имя каталога, найденное с помощьюfind
.Предположим, у меня есть две директории
/home
:dir1
иdir2
. Я бегуfind /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'
. Поэтому команда rsync будет работать как два процесса (два процесса, потому что/home
имеет два каталога) со следующими аргументами:источник