Быстрее rsync огромного каталога, который не был изменен


13

Мы используем rsync для резервного копирования серверов.

К сожалению, сеть на некоторых серверах работает медленно.

Rsync обнаруживает, что в огромных каталогах ничего не изменилось. Эти огромные деревья каталогов содержат много маленьких файлов (около 80 тыс. Файлов).

Я предполагаю, что клиенты rsync отправляют данные для каждого из файлов 80k.

Поскольку сеть работает медленно, я хотел бы избежать отправки 80к раз информации о каждом файле.

Есть ли способ сказать rsync сделать хэш-сумму дерева подкаталогов?

Таким образом, клиент rsync отправит только несколько байтов для огромного дерева каталогов.

Обновить

До сих пор моя стратегия заключается в использовании rsync. Но если здесь подходят другие инструменты, я могу переключиться. Оба (сервер и клиент) находятся под моим контролем.

Update2

В одном дереве каталогов находится 80 тыс. Файлов . В каждом отдельном каталоге не более 2 тыс. Файлов или подкаталогов.

Update3

Подробности о медлительности сети:

time ssh einswp 'cd attachments/200 && ls -lLR' >/tmp/list
real    0m2.645s

Размер файла tmp / list: 2MByte

time scp einswp:/tmp/list tmp/
real    0m2.821s

Вывод: у scp одинаковая скорость (не удивительно)

time scp einswp:tmp/100MB tmp/
real    1m24.049s

Скорость: 1,2 МБ / с


1
Вы можете прочитать о zsync. Я не использовал его сам, но из того, что я прочитал, он предварительно отображает метаданные на стороне сервера и может просто ускорить передачу в вашем случае. В любом случае, возможно, стоит попробовать. Кроме того, единственное известное мне решение - это синхронизация на уровне блоков в реальном времени, которая поставляется с некоторыми решениями san / nas.
Аарон

Ответы:


36

Некоторые несвязанные моменты:

80K - это много файлов.

80000 файлов в одном каталоге? Ни одна операционная система или приложение по умолчанию не справляются с этой ситуацией. Вы просто заметили эту проблему с rsync.

Проверьте версию rsync

Современный rsync обрабатывает большие каталоги намного лучше, чем в прошлом. Убедитесь, что вы используете последнюю версию.

Даже старый rsync довольно хорошо обрабатывает большие каталоги по ссылкам с высокой задержкой ... но файлы размером 80 КБ не велики ... они огромны!

Тем не менее, использование памяти rsync прямо пропорционально количеству файлов в дереве. Большие каталоги занимают большое количество оперативной памяти. Замедление может быть связано с нехваткой оперативной памяти с обеих сторон. Сделайте тестовый прогон, наблюдая за использованием памяти. Linux использует любую оставшуюся оперативную память в качестве дискового кэша, поэтому, если у вас мало оперативной памяти, кеширование диска уменьшается. Если у вас заканчивается ОЗУ и система начинает использовать своп, производительность будет очень плохой.

Убедитесь, что --checksum не используется

--checksum(или -c) требует чтения каждого блока каждого файла. Вы, вероятно, можете обойтись с поведением по умолчанию, просто читая времена модификации (хранящиеся в inode).

Разделите работу на небольшие партии.

Есть некоторые проекты, такие как Gigasync, которые « уменьшают рабочую нагрузку, используя perl для рекурсии дерева каталогов, создавая небольшие списки файлов для передачи с помощью rsync».

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

По умолчанию ОС не созданы для этой ситуации.

Если вы используете Linux / FreeBSD / etc со всеми настройками по умолчанию, производительность будет ужасной для всех ваших приложений. Значения по умолчанию предполагают меньшие каталоги, чтобы не тратить ОЗУ на кэши большого размера.

Настройте свою файловую систему так, чтобы она лучше справлялась с большими каталогами: замедляют ли папки большого размера производительность ввода-вывода?

Посмотрите на "кэш имен"

Подобные BSD операционные системы имеют кэш, который ускоряет поиск имени в inode (кэш "namei"). Для каждого каталога есть кэш namei. Если он слишком мал, он является помехой, а не оптимизацией. Поскольку rsync выполняет lstat () для каждого файла, для каждого из файлов размером 80 тыс. Осуществляется доступ к inode. Это может привести к перегрузке вашего кэша. Узнайте, как настроить производительность файловых каталогов в вашей системе.

Рассмотрим другую файловую систему

XFS была разработана для обработки больших каталогов. Смотрите Файловая система большое количество файлов в одном каталоге

Возможно, 5 минут - лучшее, что вы можете сделать.

Подумайте о том, как рассчитать, сколько дисковых блоков читается, и подсчитайте, как быстро вы должны ожидать, что аппаратное обеспечение сможет читать такое количество блоков.

Может быть, ваши ожидания слишком высоки. Подумайте, сколько дисковых блоков нужно прочитать, чтобы выполнить rsync без измененных файлов: каждому серверу нужно будет прочитать каталог и прочитать по одному индексу на файл. Давайте предположим, что ничего не кешируется, потому что, ну, 80к файлов, вероятно, испортили ваш кеш. Скажем, это 80k блоков для простоты математики. Это около 40 миллионов данных, которые должны быть прочитаны в течение нескольких секунд. Однако, если между каждым блоком требуется поиск диска, это может занять гораздо больше времени.

Итак, вам нужно прочитать около 80000 дисковых блоков. Как быстро ваш жесткий диск может это сделать? Учитывая, что это случайный ввод-вывод, а не длинное линейное чтение, 5 минут могут быть довольно хорошими. Это 1 / (80000/600), или чтение диска каждые 7,5 мс. Это быстро или медленно для вашего жесткого диска? Это зависит от модели.

Бенчмарк против чего-то похожего

Еще один способ думать об этом - это. Если никакие файлы не были изменены, ls -Llrвыполняет ту же самую активность диска, но никогда не читает данные файла (только метаданные). Время, ls -Llrнеобходимое для запуска - ваша верхняя граница.

  • Является ли rsync (без изменения файлов) значительно медленнее, чем ls -Llr? Тогда параметры, которые вы используете для rsync, могут быть улучшены. Возможно -c, включен или какой-то другой флаг, который читает больше, чем просто каталоги и метаданные (данные inode).

  • Является ли rsync (без изменения файлов) почти так же быстро, как ls -Llr? Тогда вы настроили Rsync как можно лучше. Вы должны настроить ОС, добавить оперативную память, получить более быстрые диски, изменить файловые системы и т. Д.

Поговорите с вашими разработчиками

80k файлов - это просто плохой дизайн. Очень немногие файловые системы и системные инструменты очень хорошо справляются с такими большими каталогами. Если имена файлов - abcdefg.txt, попробуйте сохранить их в файле abdc / abcdefg.txt (обратите внимание на повторение). Это разбивает каталоги на более мелкие, но не требует огромных изменений в коде.

Также .... рассмотрите возможность использования базы данных. Если у вас есть 80 тыс. Файлов в каталоге, возможно, ваши разработчики работают над тем, что им действительно нужна база данных. MariaDB или MySQL или PostgreSQL были бы намного лучшим вариантом для хранения больших объемов данных.

Эй, что не так с 5 минут?

Наконец, 5 минут действительно так плохо? Если вы запускаете эту резервную копию один раз в день, 5 минут - это не много времени. Да, я люблю скорость. Однако, если 5 минут «достаточно хорошо» для ваших клиентов, то это достаточно хорошо для вас. Если у вас нет подписанного SLA, как насчет неофициальной дискуссии с вашими пользователями, чтобы узнать, насколько быстро они ожидают создания резервных копий.

Я предполагаю, что вы не задавали этот вопрос, если не было необходимости улучшать производительность. Однако, если ваши клиенты довольны 5 минутами, объявите победу и переходите к другим проектам, которые требуют ваших усилий.

Обновление: после некоторого обсуждения мы определили, что узким местом является сеть. Я собираюсь рекомендовать 2 вещи, прежде чем я сдаюсь :-).

  • Попробуйте выжать из канала больше пропускной способности при сжатии. Однако сжатие требует больше ресурсов процессора, поэтому, если ваш процессор перегружен, производительность может ухудшиться. Попробуйте rsync с и без -z, и настройте ваш ssh с и без сжатия. Время все 4 комбинации, чтобы увидеть, если какие-либо из них работают значительно лучше, чем другие.
  • Наблюдайте за сетевым трафиком, чтобы увидеть, есть ли какие-либо паузы. Если есть паузы, вы можете найти, что их вызывает, и оптимизировать их там. Если rsync всегда отправляет, то вы действительно находитесь на своем пределе. Ваш выбор:
    • более быстрая сеть
    • что-то кроме rsync
    • переместите источник и пункт назначения ближе друг к другу. Если вы не можете этого сделать, можете ли вы rsync на локальный компьютер, а затем rsync к реальному месту назначения? Это может быть полезно, если во время начальной rsync система не работает.

80K - это много файлов. В одном дереве каталогов находится 80k файлов . В каждом отдельном каталоге не более 2 тыс. Файлов / подкаталогов.
Геттли

Проверьте версию rsync: выполнено, убедитесь, что --checksum не используется: выполнено. Разделите работу на небольшие партии: Спасибо, я посмотрю на gigasync. По умолчанию ОС не созданы для этой ситуации: сделано (узким местом является сеть, а не ОС). Посмотрите на «кэш имен»: сделано (нет, не ОС). Рассмотрим другую файловую систему: опять чистая, а не ОС. Может быть, 5 минут - лучшее, что ты можешь сделать. Я думаю, что это может быть намного быстрее. Поговорите с вашими разработчиками (используйте DB): это будет гигантским изменением. Возможно, файловая система с лучшей поддержкой резервного копирования решит эту проблему.
Геттли

2k файлов в каталоге намного лучше. Спасибо за обновление. Вы не упомянули, что сеть была медленной. Это низкая пропускная способность, высокая задержка или оба? rsync обычно хорошо работает на каналах с высокой задержкой (он был разработан кем-то, работающим над его докторской степенью из Австралии и работающим с компьютерами в США). Попробуйте сделать это «ls-lLR» по ssh и сколько времени потребуется для передачи результата. msgstr "time ssh remotehost 'cd / dest && ls -lLR'> / tmp / list". Убедитесь, что / tmp / list создается на локальном хосте.
TomOnTime

да сеть медленная Жаль.
Геттли

Как медленно? Если вы используете «scp» для копирования файла 100M, сколько времени это займет? Кроме того, что выводит "time ssh remotehost 'cd / dest && ls -lLR'> / tmp / list"?
TomOnTime

2

Нет, это не возможно с rsync, и это было бы совершенно неэффективно в другом отношении:

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


1
AFAIK rsync проверяет время и размер. Если оба совпадения, файл не передается снова (по крайней мере, в настройках по умолчанию). Было бы достаточно отправить хэш кортежей (имя файла, размер, mtime). Там нет необходимости для контрольной суммы содержимого.
Геттли

Да, вы правы, но в любом случае rsyncне делают этого.
Свен

2

Для синхронизации большого количества файлов (где мало что изменилось) стоит также установить noatimeразделы источника и назначения. Это экономит время записи на диск для каждого неизмененного файла.


Да, вариант noatime имеет смысл. Мы используем его с нескольких лет. Я думаю, что нужна альтернатива rsync.
Геттли

2

Вы также можете попробовать lsyncd, который будет rsync только при обнаружении изменений в файловой системе и только в измененных подкаталогах. Я использовал его для каталогов с до двух миллионов файлов на приличном сервере.


1

Используйте rsync в режиме демона на стороне сервера, чтобы ускорить процесс листинга / контрольной суммы:

Обратите внимание, что он не зашифрован, но может быть в состоянии туннелироваться без потери производительности листинга.

Также использование rsync делает сжатие, а не ssh должно улучшить производительность.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.