inotify e rsync em um grande número de arquivos

5

Estou usando o inotify para assistir a um diretório e sincronizar arquivos entre servidores usando o rsync. A sincronização funciona perfeitamente e o uso da memória não é um problema. No entanto, recentemente, um grande número de arquivos foi adicionado (350k) e isso afetou o desempenho, especificamente na CPU. Agora, quando o rsync é executado, o uso da CPU aumenta para 90% / 100% e o rsync demora para ser concluído, há 650k arquivos sendo assistidos / sincronizados.

Existe alguma maneira de acelerar o rsync e apenas rsync o diretório que foi alterado? Ou, alternativamente, configurar múltiplas inotifywaits em diretórios separados. O script sendo usado está abaixo.

UPDATE: eu adicionei o sinalizador --update e o uso parece praticamente inalterado

#! /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)
    
por kyleredon 05.12.2013 / 14:28

2 respostas

4

Se o servidor tiver um processador lento, evite somas de verificação e compactação com o rsync. Gostaria de remover a opção ht "-z" no comando rsync.

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

Note que não irá evitar que o rsync compare os arquivos 650k. Você pode rsync subdiretórios de / var / www, um por um para reduzir o número de arquivos verificados de uma só vez.

    
por 05.12.2013 / 15:23
1

Obrigado por postar sua resposta - isso realmente me ajudou. Eu acho que você pode simplificar o loop:

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
)

Você pode precisar ajustar um pouco, mas a essência deve ser clara. Eu estou usando uma variante com o AWS s3 sync da Amazon, então eu posso ter substituído o seu comando rsync de forma incorreta.

    
por 19.08.2014 / 05:18

Tags