Паралельна rsync за допомогою GNU Parallel


18

Я використовую 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(після cding до каталогу джерел), і на виконання було потрібно 12 хвилин 37 секунд:

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

Це повинно було зайняти в 5 разів менше часу, але це не так. Я думаю, я кудись помиляюся.

Як я можу запустити кілька rsyncпроцесів, щоб скоротити час виконання?


1
Ви обмежені пропускною здатністю мережі? Дисковий іопс? Пропускна здатність диска?
Оле Танге

Якщо можливо, ми хотіли б використовувати 50% загальної пропускної здатності. Але паралелізація множинних rsyncs - наш перший пріоритет.
Mandar Shinde

Чи можете ви повідомити нам про: пропускну здатність мережі, іопс диска, пропускну здатність диска та фактично використану пропускну здатність?
Оле Танге

Насправді я не знаю про вищевказані параметри. На даний момент ми можемо нехтувати частиною оптимізації. Кілька rsyncs паралельно є основним фокусом зараз.
Mandar Shinde

Немає сенсу йти паралельно, якщо обмеження не CPU. Це може / навіть погіршить (конфліктні рухи диска на вихідному або цільовому диску).
ксеноїд

Відповіді:


16

Наступні кроки зробили для мене роботу:

  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до parallel, щоб rsyncпаралельно запускати 5 с, таким чином:
$ 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параметр ( посилання ) гарантував, що структура каталогу для файлів, які впливають на них, у джерелі та адресата, залишається такою ж (всередині /data/каталогу), тому команда повинна виконуватися у вихідній папці (наприклад, /data/projects).


5
Це зробить rsync на файл. Напевно, було б ефективніше розділити весь список файлів, використовуючи splitта передаючи ці файли паралельно. Потім використовуйте rsync, --files-fromщоб отримати імена файлів з кожного файлу та синхронізувати їх. rm резервного копіювання. * розділити -l 3000 резервних копій. резервні копії. * | паралельно --line-буфера --verbose -j 5 Rsync --progress -av --files-від {} / LOCAL / БАТЬКО / ШЛЯХ / REMOTE_HOST: REMOTE_PATH /
Сандип Бхаттачарія

1
Як друга команда rsync обробляє рядки в result.log, які не є файлами? тобто receiving file list ... done created directory /data/.
Майк Д

1
У новіших версіях rsync (3.1.0+) ви можете використовувати --info=nameзамість -v, і ви отримаєте лише назви файлів та каталогів. Можливо, ви також хочете використовувати --protect-args для "внутрішнього" передачі rsync, якщо в будь-яких файлах можуть бути пробіли або метахарактори оболонки.
Гепард

13

Я особисто використовую цей простий:

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

Що корисно лише тоді, коли у вас є більше декількох каталогів, які не є порожніми, в іншому випадку у вас закінчиться майже кожен rsyncзавершення роботи, а останній виконує всю роботу в поодинці.


Це чудово працює - важко зрозуміти, чи робиться щось, тому параметр -v паралельно робить його більш балаканим. Крім того, -j 30 паралельно (тобто перед командою rsync) змушує його виконувати 30 завдань, а не лише одне ядро ​​CPU, яке є типовим.
Criggie

12

Я б сильно заважав нікому не використовувати прийняту відповідь, краще рішення - сканувати каталог верхнього рівня та запускати пропорційну кількість операцій з синхронізацією.

У мене великий обсяг zfs, і моїм джерелом було кріплення cifs. Обидва пов'язані з 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

іометр показує:

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. Але не створюйте нових примірників для кожного файлу.


5

Тестований спосіб зробити паралелізовану rsync: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync

rsync - чудовий інструмент, але іноді він не заповнить наявну пропускну здатність. Це часто є проблемою при копіюванні декількох великих файлів на високошвидкісних з'єднаннях.

Далі розпочнеться один rsync на великий файл у src-dir до dest-dir на нижньому сервері:

cd src-dir; find . -type f -size +100000 | \
parallel -v ssh fooserver mkdir -p /dest-dir/{//}\; \
  rsync -s -Havessh {} fooserver:/dest-dir/{} 

Створені каталоги можуть мати неправильні дозволи, і менші файли не передаються. Щоб виправити ці функції запуску rsync:

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

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

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

Будь-яка інша альтернатива, щоб уникнути find?
Mandar Shinde

1
Обмежте-maxxdepth знахідки.
Оле Танге

Якщо я використовую --dry-runопцію в rsync, у мене буде список файлів, які будуть передані. Чи можу я надати цей список файлів parallel, щоб паралелізувати процес?
Mandar Shinde

1
файли котів | паралельно -v ssh fooserver mkdir -p / dest-dir / {//} \; rsync -s -Havessh {} fooserver: / dest-dir / {}
Ole Tange

Чи можете ви поясніть, будь ласка, mkdir -p /dest-dir/{//}\;частину? Особливо {//}річ трохи заплутана.
Mandar Shinde

1

Для декількох синхронізацій призначення я використовую

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

Підказка: Усі ssh-з'єднання встановлюються з відкритими ключами в ~/.ssh/authorized_keys


1

Я завжди google для паралельної rsync, оскільки завжди забуваю повну команду, але жодне рішення не працювало для мене так, як я хотів - або воно включає кілька кроків або потребує встановлення parallel. Я в кінцевому підсумку використовував цей однокласник для синхронізації кількох папок:

find dir/ -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo dir/%/ host:/dir/%/)'

-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має два каталоги) із наступними аргументами:

rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
rsync -a --delete --bwlimit=50000 /home/dir1/ host:/home/dir1/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.