inotify и rsync для большого количества файлов

Я использую inotify для просмотра каталога и синхронизации файлов между серверами с помощью rsync. Синхронизация работает отлично, а использование памяти в основном не является проблемой. Однако недавно было добавлено большое количество файлов (350 тыс.), Что сказалось на производительности, особенно на процессоре. Теперь, когда rsync запускается, загрузка процессора достигает 90% / 100%, а rsync занимает много времени, есть файлы 650k, которые просматриваются / синхронизируются.

Есть ли способ ускорить rsync и только rsync каталог, который был изменен? Или, альтернативно, настроить несколько inotifywaits в отдельных каталогах. Используемый сценарий ниже.

UPDATE: я добавил флаг –update, и использование кажется, в основном, неизменным

#! /bin/bash EVENTS="CREATE,DELETE,MODIFY,MOVED_FROM,MOVED_TO" inotifywait -e "$EVENTS" -m -r --format '%:e %f' /var/www/ --exclude '/var/www/.*cache.*' | ( WAITING=""; while true; do LINE=""; read -t 1 LINE; if test -z "$LINE"; then if test ! -z "$WAITING"; then echo "CHANGE"; WAITING=""; rsync --update -alvzr --exclude '*cache*' --exclude '*.git*' /var/www/* root@secondwebserver:/var/www/ fi; else WAITING=1; fi; done) 

2 Solutions collect form web for “inotify и rsync для большого количества файлов”

Если сервер имеет медленный процессор, избегайте контрольных сумм и сжатия с помощью rsync. Я бы удалил параметр ht "-z" в команде rsync.

 rsync --update -alvr --exclude '*cache*' --exclude '*.git*' /var/www/* root@secondwebserver:/var/www/ 

Обратите внимание, что это не позволит избежать rsync для сравнения файлов 650k. Вы можете rsync подкаталоги / var / www поочередно, чтобы уменьшить количество файлов, проверенных за один раз.

Спасибо, что опубликовали свой ответ – это действительно помогло мне. Я думаю, вы можете упростить цикл:

 EVENTS="CREATE,DELETE,MODIFY,MOVED_FROM,MOVED_TO" sync() { rsync --update -alvzr --exclude '*cache*' --exclude '*.git*' /var/www/* root@secondwebserver:/var/www/ } watch() { inotifywait -e "$EVENTS" -m -r --format '%:e %f' /var/www/ --exclude '/var/www/.*cache.*' } watch | ( while true ; do read -t 1 LINE && sync done ) 

Возможно, вам придется немного подкорректировать, но суть должна быть четкой. Я использую вариант с асинхронной синхронизацией AWS s3, поэтому я, возможно, неправильно заменил вашу команду rsync.

  • Rsync - сохранить метаданные владельца / группы, но не как локальные пользователи
  • Правила rsync только для синхронизации конкретных субдиров в длинных путях
  • Ошибка при использовании rsync и scp
  • Случайный код ошибки rsync 12 «Сброс соединения с помощью peer (104)» из задачи cron, которая запускается каждые 20 минут
  • rsync все каталоги, начинающиеся с определенной цифры
  • rsync: --fuzzy не определяет изменения имени с помощью link-dest
  • Крон: Мои кронабы вообще ничего не делают
  • Различия между rsync на удаленном и rsync локальном на смонтированных sshfs?
  • от разреженного файла до блочного устройства по сети
  • Как использовать параметр `~ / .ssh / config` для каждого сервера с помощью` rsync`
  • Лучший способ архивирования после rsync
  • Linux и Unix - лучшая ОС в мире.