/private/var/empty
вероятен messagebus
корневой каталог пользователя. zsh
расширение предложений корневых каталогов, когда это получает аргумент cd
функция, что это думает, похожа на имя пользователя. В Вашем случае, bu
расширен до messagebus
приблизительным matcher, потому что никакой более определенный matcher не инициирует в пустом каталоге (в Вашей системе Linux, обоих uuid
и messagebus
возвращаются как возможные приблизительные соответствия для строки bu
).
Возможно сказать zsh
каких пользователей это должно рассмотреть для расширения при этих обстоятельствах, вставив что-то вроде этого Ваш ~/.zshrc
:
zstyle ':completion:*' users user1 user2 root
Просто перечислите всех пользователей, которых Вы хотите, чтобы оболочка рассмотрела, source ~/.zshrc
для взятия изменений, и Вы больше не должны добираться messagebus
и т.д. как возможные завершения.
За меня сработали следующие шаги:
rsync --dry-run
, чтобы получить список файлов, которые будут затронутый. $ rsync -avzm --stats --safe-links --ignore-existing --dry-run \
--human-readable /data/projects REMOTE-HOST:/data/ > /tmp/transfer.log
cat transfer.log
в параллельно
для параллельного запуска 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
Здесь, - относительная опция
( ссылка ) гарантирует, что структура каталогов для затронутых файлов в источнике и месте назначения остается неизменной (внутри каталога / data /
), поэтому команду необходимо запускать в исходной папке (например, / data / projects
).
Протестированный способ выполнения параллельной rsync: http://www.gnu.org/software/parallel/man.html#EXAMPLE : -Parallelizing-rsync
rsync - отличный инструмент, но иногда он не заполняет доступную полосу пропускания. Это часто является проблемой при копировании нескольких больших файлов по высокоскоростным соединениям.
Следующее будет запускать один rsync для каждого большого файла в каталоге src-dir до каталога-назначения на нижнем сервере:
cd src-dir; найти . -тип f -размер +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 /
Я лично использую этот простой:
ls -1 | parallel rsync -a {} /destination/directory/
Это полезно только тогда, когда у вас несколько непустых каталогов, иначе вы заканчиваются тем, что почти каждый rsync
завершается, а последний выполняет всю работу в одиночку.
Я бы настоятельно не рекомендовал никому использовать принятый ответ, лучшее решение — просканировать каталог верхнего уровня и запустить пропорциональное количество операций rync.
У меня есть большой том 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. Но не создавайте новые экземпляры для каждого файла.
Для синхронизации с несколькими пунктами назначения я использую
parallel rsync -avi /path/to/source ::: host1: host2: host3:
Подсказка: все соединения ssh устанавливаются с открытыми ключами в ~/.ssh/authorized_keys
Я всегда ищу в 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 %
предоставляется путем поиска каталога (, найденного в 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/