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

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

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

ОБНОВЛЕНИЕ: я добавил флаг --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)

person kyleredon    schedule 04.12.2013    source источник


Ответы (2)


В итоге я удалил параметр сжатия (z) и увеличил значение WAITING var до 10 (секунд). Кажется, это помогло, rsync по-прежнему увеличивает загрузку процессора, но его жизнь короче. Кредит принадлежит ответу на unix stackexchange

person kyleredon    schedule 17.12.2013

Вы используете rsync для синхронизации корневого каталога большого дерева, поэтому я не удивлен потерей производительности.
Одно из возможных решений — синхронизировать только измененные файлы/каталоги, а не весь корневой каталог.< br> Например, файлы file1, file2 и file3 находятся в разделе from/dir. Когда в эти 3 файла вносятся изменения, используйте

rsync --update -alvzr из/каталог/файл1 из/каталог/файл2 из/каталог/файл3 в/каталог

скорее, чем

rsync --update -alvzr из/каталог/* в/каталог

Но у этого есть потенциальная ошибка: rsync не будет автоматически создавать каталоги, если целевые папки не существуют. Однако вы можете использовать ssh для выполнения удаленных команд и создания каталогов самостоятельно.
Возможно, вам также потребуется установить аутентификацию с открытым ключом SSH, но, судя по вставленной вами командной строке rsync, я предполагаю, что вы уже сделали это .

ссылка:
rsync - создать все отсутствующие родительские каталоги?
rsync: как я могу настроить его на создать целевой каталог на сервере?
Как использовать SSH для запуска сценария оболочки на удаленном компьютере?
Ошибка SSH при выполнении удаленной команды: stdin: is not tty

person zeekvfu    schedule 05.12.2013
comment
Спасибо. Это идеальная ситуация, но как мне узнать, какие файлы передать rsync? Есть ли способ для inotify сообщить мне, какие файлы были изменены, и синхронизировать только их? - person kyleredon; 05.12.2013
comment
inotifywait -rm может отслеживать каталог и сообщать об изменениях файлов. - person zeekvfu; 05.12.2013