Я пытаюсь передать тысячи небольших файлов с одного сервера на другой, используя следующую команду:
rsync -zr --delete /home/user/ user@10.1.1.1::backup
На данный момент перевод занимает много времени (я еще не рассчитывал). Есть ли способ сделать это быстрее? Стоит ли использовать другой инструмент? Должен ли я использовать rsync вместо ssh вместо протокола rsync?
Вам необходимо определить узкое место. Это не rsync. Вероятно, дело не в пропускной способности вашей сети. Так как @Zoredache предположил, что это, скорее всего, огромное количество операций ввода-вывода в секунду, генерируемых всеми stat()
звонки. Любой инструмент синхронизации должен будет статировать файлы. Во время синхронизации бега iostat
проверять.
Итак, вопрос становится; как оптимизировать статистику? Два простых ответа:
noatime
и добавить dir_index
).Если по какой-то причине ограничение iops на вашем диске не является, вы можете поэкспериментировать с разделением дерева каталогов на несколько отдельных деревьев и запустить несколько rsync.
Сжатие не очень полезно для небольших файлов (скажем, менее 100 байт). Для небольших файлов иногда сжатая версия может быть даже больше оригинала. Попробуйте rsync
команда без -z
флаг.
ssh
Это хорошо для безопасности, но не ускорит передачу. Фактически, это замедлит передачу из-за необходимости шифрования / дешифрования.
rsync
может показаться не быстрым при первом запуске из-за большого объема данных для передачи. Однако, если вы планируете периодически запускать эту команду, последующие запуски могут быть намного быстрее, поскольку rsync
умно не передавать файлы, которые не изменились.
Если задействованы файловые системы ext3 или ext4, убедитесь, что обе имеют функция dir_index включен! В моем случае это утроило пропускную способность rsync.
Подробности см. В моем ответе по адресу: https://serverfault.com/a/759421/80414
Какую версию rsync вы используете? Все, что старше 3.0.0 (на обоих концах), не имеет функции инкрементного списка файлов, которая ускоряет большие передачи.
Добавить -v --progress
в вашу командную строку rsync
rsync выполняется в 2 этапа:
Если вы используете rsync для тысяч маленьких файлов во вложенных каталогах, это может быть просто так, что rsync тратит большую часть этого времени на вход в подкаталоги и поиск всех файлов.
Если время не тратится на просмотр, это время может быть просто связано с добавлением всех задержек, начиная с каждой новой передачи файла.