Параллельный rsync с использованием GNU Parallel

Я использую скрипт 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 ing в исходный каталог), и для выполнения потребовалось 12 минут 37 секунд:

 parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: . 

Это должно было в 5 раз меньше времени, но это не так. Думаю, я где-то ошибаюсь.

Как я могу запустить несколько процессов rsync , чтобы сократить время выполнения?

5 Solutions collect form web for “Параллельный rsync с использованием GNU Parallel”

Следующие шаги сделали для меня работу:

  1. rsync --dry-run , чтобы получить список файлов, на которые это повлияет.

rsync -avzm --stats --safe-links --ignore-existing --dry-run --human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log

  1. Я cat transfer.log вывод cat transfer.log в parallel чтобы parallel запустить 5 rsync s следующим образом:

cat /tmp/transfer.log | parallel --will-cite -j 5 rsync -avzm --relative --stats --safe-links --ignore-existing --human-readable {} REMOTE-HOST:/data/ > result.log

Здесь, --relative option ( link ) гарантировал, что структура каталогов для затронутых файлов в источнике и получателе остается неизменной (внутри /data/ directory), поэтому команда должна запускаться в исходной папке (например, /data/projects ).

Я лично использую этот простой:

 ls -1 | parallel rsync -a {} /destination/directory/ 

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

Проверенный способ выполнения параллельного rsync: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync

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

Следующее запустит один rsync для большого файла в src-dir для dest-dir на сервере fooserver:

 cd src-dir; find . -type f -size +100000 | \ parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \ rsync -s -Havessh {} fooserver:/dest-dir/{} The dirs created may end up with wrong permissions and smaller files are not being 

переданы. Чтобы исправить эти пробелы rsync в последний раз:

 rsync -Havessh src-dir/ fooserver:/dest-dir/ 

Если вы не можете выталкивать данные, но их нужно вытащить, а файлы называются digits.png (например, 000000.png), которые вы могли бы выполнить:

 seq -w 0 99 | parallel rsync -Havessh fooserver:src/*{}.png destdir/ 

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

У меня большой объем zfs, и мой источник был cifs mount. Оба связаны с 10G, и в некоторых тестах можно насытить ссылку. Производительность оценивалась с использованием zpool iostat 1 .

Источник привода был установлен как:

 mount -t cifs -o username=,password= //static_ip/70tb /mnt/Datahoarder_Mount/ -o vers=3.0 

Используя один процесс rsync :

 rsync -h -v -r -P -t /mnt/Datahoarder_Mount/ /StoragePod 

io-метр гласит:

 StoragePod 30.0T 144T 0 1.61K 0 130M StoragePod 30.0T 144T 0 1.61K 0 130M StoragePod 30.0T 144T 0 1.62K 0 130M 

Это в синтетических тестах (хрустальный диск), производительность для последовательной записи достигает 900 МБ / с, что означает, что ссылка насыщена. 130 МБ / с не очень хорошо, и разница между ожиданием в выходные и две недели.

Итак, я создал список файлов и снова попытался запустить синхронизацию (у меня 64-ядерная машина):

 cat /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount.log | parallel --will-cite -j 16 rsync -avzm --relative --stats --safe-links --size-only --human-readable {} /StoragePod/ > /home/misha/Desktop/rsync_logs_syncs/Datahoarder_Mount_result.log 

и у него была такая же производительность!

 StoragePod 29.9T 144T 0 1.63K 0 130M StoragePod 29.9T 144T 0 1.62K 0 130M StoragePod 29.9T 144T 0 1.56K 0 129M 

В качестве альтернативы я просто запускал rsync в корневых папках:

 rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/Marcello_zinc_bone /StoragePod/Marcello_zinc_bone rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/fibroblast_growth /StoragePod/fibroblast_growth rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/QDIC /StoragePod/QDIC rsync -h -v -r -P -t /mnt/Datahoarder_Mount/Mikhail/sexy_dps_cell /StoragePod/sexy_dps_cell 

Это фактически повысило производительность:

 StoragePod 30.1T 144T 13 3.66K 112K 343M StoragePod 30.1T 144T 24 5.11K 184K 469M StoragePod 30.1T 144T 25 4.30K 196K 373M 

В заключение, как @Sandip Bhattacharya воспитывался, напишите небольшой скрипт, чтобы получить каталоги и параллельно. Кроме того, передайте список файлов в rsync. Но не создавайте новые экземпляры для каждого файла.

Для многоцелевых синхронизаций я использую

 parallel rsync -avi /path/to/source ::: host1: host2: host3: 

Подсказка: все соединения ssh устанавливаются с открытыми ключами в ~/.ssh/authorized_keys

  • Rsync за исключением .svn папок и их содержимого?
  • почему rsync не выполняет дельта-перенос
  • Как rsync только в текущей папке?
  • rsync'ing несколько пар {src, dest}
  • Отображение UID с помощью rsync
  • как заставить rsync связывать идентичные файлы с параметром -link-dest, если старый файл уже существует?
  • Максимальное количество подключений rsync daemon неограниченное
  • Сценарий резервного копирования Rsync для нескольких серверов
  • rsync bash скрипт "не удалось установить"
  • Как rsync через ssh, когда имена каталогов имеют пробелы
  • Инкрементное резервное копирование и восстановление резервных копий с использованием / rsync или rdiff-backup
  • Interesting Posts

    служба init не может включить, как только создается системный файл службы

    Шрифт сбрасывается в виртуальной консоли на GNU / Linux

    Как сделать чистые коммиты с etckeeper?

    XFCE висит с ручным курсором

    Git висит бесконечно, пытаясь нажать – all to GitHub

    Объединение tail && journalctl

    Как настроить сеть для Linux Mint – VM, когда хост-машина использует файл PAC?

    Как прочитать вывод `dmesg`, чтобы определить, сколько памяти используется процессом при вызове oom-killer?

    Общая скорость игры Mplayer / SMPlayer в Ubuntu

    «Нет экранов» при запуске Xorg с startx после установки драйверов Nvidia в Virtualbox

    colordiff – как сохранить цвет при сохранении файла

    Почему используется основная таблица, поскольку я настроил маршрутизацию для использования настраиваемой таблицы маршрутизации?

    Изменение раскладки клавиатуры по ярлыку (только текстовый режим)

    Поиск фразы в recoll

    Ошибка «Недостаточно памяти» при копировании больших файлов с помощью pcmanfm

    Linux и Unix - лучшая ОС в мире.