Мы используем rsync для резервного копирования серверов.
К сожалению, сеть на некоторых серверах медленная.
Rsync обнаруживает, что в огромных каталогах ничего не изменилось, требуется до пяти минут. Эти огромные деревья каталогов содержат множество маленьких файлов (около 80k файлов).
Я предполагаю, что клиенты rsync отправляют данные для каждого из 80К файлов.
Поскольку сеть медленная, я бы не хотел отправлять 80 тысяч раз информацию о каждом файле.
Есть ли способ указать rsync создать хеш-сумму дерева подкаталогов?
Таким образом, клиент rsync отправит всего несколько байтов для огромного дерева каталогов.
Обновить
До сих пор моя стратегия заключалась в использовании rsync
. Но если здесь лучше подходят другие инструменты, я могу переключиться. Оба (сервер и клиент) находятся под моим контролем.
Обновление2
В одном каталоге 80к файлов дерево. В каждом отдельном каталоге не более 2k файлов или подкаталогов.
Обновление3
Подробности о медлительности сети:
time ssh einswp 'cd attachments/200 && ls -lLR' >/tmp/list
real 0m2.645s
Размер файла tmp / list: 2 МБ
time scp einswp:/tmp/list tmp/
real 0m2.821s
Вывод: у scp одинаковая скорость (неудивительно)
time scp einswp:tmp/100MB tmp/
real 1m24.049s
Скорость: 1,2 МБ / с.
Некоторые несвязанные моменты:
80 000 файлов в одном каталоге? По умолчанию никакая операционная система или приложение не справляется с этой ситуацией очень хорошо. Вы просто случайно заметили эту проблему с rsync.
Современный rsync обрабатывает большие каталоги намного лучше, чем раньше. Убедитесь, что вы используете последнюю версию.
Даже старый rsync довольно хорошо обрабатывает большие каталоги по ссылкам с высокой задержкой ... но файлы размером 80 КБ невелики ... они огромны!
Тем не менее, использование памяти rsync прямо пропорционально количеству файлов в дереве. Большие каталоги занимают большой объем оперативной памяти. Медленность может быть связана с нехваткой оперативной памяти с обеих сторон. Сделайте тестовый запуск, наблюдая за использованием памяти. Linux использует любую оставшуюся ОЗУ в качестве дискового кеша, поэтому, если у вас мало ОЗУ, кэширование диска будет меньше. Если у вас закончится оперативная память и система начнет использовать свопинг, производительность будет очень низкой.
--checksum
(или -c
) требует чтения каждого блока каждого файла. Вы, вероятно, сможете обойтись поведением по умолчанию, просто считывая время модификации (хранящееся в inode).
Есть несколько проектов вроде Gigasync который «сократит рабочую нагрузку, используя perl для рекурсии дерева каталогов, создавая небольшие списки файлов для передачи с помощью rsync».
Дополнительное сканирование каталогов потребует больших затрат, но, возможно, принесет чистую прибыль.
Если вы используете Linux / FreeBSD / etc со всеми значениями по умолчанию, производительность всех ваших приложений будет ужасной. По умолчанию предполагается, что каталоги меньше, чтобы не тратить ОЗУ на кеш-память большого размера.
Настройте свою файловую систему, чтобы лучше обрабатывать большие каталоги: Уменьшают ли большие размеры папок производительность ввода-вывода?
Операционные системы, подобные BSD, имеют кеш, который ускоряет поиск имени в индексном дескрипторе («кеш namei»). Для каждого каталога есть кеш namei. Если он слишком мал, это скорее помеха, чем оптимизация. Поскольку rsync выполняет lstat () для каждого файла, доступ к индексному дескриптору осуществляется для каждого из 80К файлов. Это может разрушить ваш кеш. Изучите, как настроить производительность каталога файлов в вашей системе.
XFS была разработана для обработки больших каталогов. Видеть Файловая система: большое количество файлов в одном каталоге
Рассчитайте, сколько блоков диска читается, и рассчитайте, с какой скоростью вы должны ожидать, что оборудование сможет читать такое количество блоков.
Может быть, ваши ожидания завышены. Подумайте, сколько блоков диска необходимо прочитать, чтобы выполнить rsync без измененных файлов: каждый сервер должен будет прочитать каталог и прочитать один индексный дескриптор для каждого файла. Предположим, что ничего не кэшируется, потому что 80k файлов, вероятно, взорвали ваш кеш. Предположим, что для простоты математики это 80k блоков. Это около 40 МБ данных, которые должны быть прочитаны за несколько секунд. Однако, если между каждым блоком требуется поиск диска, это может занять гораздо больше времени.
Итак, вам нужно прочитать около 80 000 блоков диска. Насколько быстро ваш жесткий диск может это сделать? Учитывая, что это случайный ввод-вывод, а не длинное линейное чтение, 5 минут могут быть очень хорошими. Это 1 / (80000/600), или чтение с диска каждые 7,5 мс. Это быстро или медленно для вашего жесткого диска? Это зависит от модели.
Еще один способ подумать об этом. Если файлы не изменились, ls -Llr
выполняет тот же объем дисковой активности, но никогда не считывает данные файла (только метаданные). Время ls -Llr
требуется, чтобы бежать - это ваша верхняя граница.
Является ли rsync (без изменения файлов) значительно медленнее, чем ls -Llr
? Тогда параметры, которые вы используете для rsync, можно будет улучшить. Может быть -c
включен или какой-либо другой флаг, который читает не только каталоги и метаданные (данные inode).
Rsync (без изменения файлов) почти так же быстр, как ls -Llr
? Тогда вы настроили rsync как можно лучше. Вам нужно настроить ОС, добавить ОЗУ, получить более быстрые диски, изменить файловые системы и т. Д.
80к файлов - это просто плохой дизайн. Очень немногие файловые системы и системные инструменты хорошо справляются с такими большими каталогами. Если имена файлов - abcdefg.txt, подумайте о том, чтобы сохранить их в abdc / abcdefg.txt (обратите внимание на повторение). Это разбивает каталоги на более мелкие, но не требует значительного изменения кода.
Также .... рассмотрите возможность использования базы данных. Если у вас в каталоге 80k файлов, возможно, ваши разработчики работают над тем, что на самом деле им нужна база данных. MariaDB, MySQL или PostgreSQL были бы гораздо лучшим вариантом для хранения больших объемов данных.
Наконец, неужели 5 минут действительно так плохо? Если вы запускаете эту резервную копию один раз в день, 5 минут - это не так много времени. Да, я люблю скорость. Однако, если 5 минут «достаточно» для ваших клиентов, то этого вполне достаточно для вас. Если у вас нет письменного SLA, как насчет неформального обсуждения с вашими пользователями, чтобы узнать, насколько быстро они ожидают резервного копирования.
Я предполагаю, что вы не задавали этот вопрос, если не было необходимости повышать производительность. Однако, если ваши клиенты довольны 5 минутами, объявите победу и переходите к другим проектам, требующим ваших усилий.
Обновить: После некоторого обсуждения мы определили, что узким местом является сеть. Я собираюсь порекомендовать 2 вещи, прежде чем сдаться :-).
-z
и настройте ssh со сжатием и без него. Измерьте время для всех 4 комбинаций, чтобы увидеть, работает ли какая-либо из них значительно лучше других.Вы также можете попробовать lsyncd, который будет выполнять rsync только при обнаружении изменений в файловой системе и только в измененных подкаталогах. Я использовал его для каталогов, содержащих до двух миллионов файлов на приличном сервере.
Нет, это невозможно с rsync и было бы совершенно неэффективно в другом отношении:
Как обычно, rsync
сравнивает только даты модификации файлов и размеры файлов. Ваш подход заставит его прочитать и проверить содержимое все файлы дважды (в локальной и удаленной системе), чтобы найти измененные каталоги.
Для синхронизации большого количества файлов (где мало что изменилось) стоит также установить noatime
на исходном и целевом разделах. Это сокращает время доступа на диск для каждого неизмененного файла.
Используйте rsync в режиме демона на стороне сервера, чтобы ускорить процесс вывода списка / контрольной суммы:
Обратите внимание, что он не зашифрован, но его можно туннелировать без потери улучшения производительности листинга.
Кроме того, использование rsync для сжатия, а не ssh, должно улучшить производительность.