对大量文件进行 inotify 和 rsync

Posted

技术标签:

【中文标题】对大量文件进行 inotify 和 rsync【英文标题】:inotify and rsync on large number of files 【发布时间】:2013-12-04 08:36:29 【问题描述】:

我正在使用 inotify 监视目录并使用 rsync 在服务器之间同步文件。同步工作完美,内存使用基本上不是问题。但是,最近添加了大量文件 (350k),这影响了性能,特别是 CPU。现在,当 rsync 运行时,CPU 使用率飙升至 90%/100% 并且 rsync 需要很长时间才能完成,有 650k 文件正在被监视/同步。

有什么方法可以加快 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)

【问题讨论】:

【参考方案1】:

我最终删除了压缩选项 (z) 并将 WAITING 变量提高到 10(秒)。这似乎有所帮助,rsync 仍然会增加 CPU 负载,但它的寿命较短。归功于unix stackexchange的答案

【讨论】:

【参考方案2】:

您正在使用rsync 来同步大树的根目录,所以我对性能损失并不感到惊讶。 一种可能的解决方案是仅同步更改的文件/目录,而不是整个根目录。 例如,file1file2file3 位于 from/dir 下。当对这 3 个文件进行更改时,请使用

rsync --update -alvzr from/dir/file1 from/dir/file2 from/dir/file3 to/dir

而不是

rsync --update -alvzr from/dir/* to/dir

但这有一个潜在的错误:如果目标文件夹不存在,rsync 将不会自动创建目录。但是,您可以使用ssh 执行远程命令并自行创建目录。 您可能还需要设置 SSH 公钥身份验证,但根据您粘贴的 rsync 命令行,我假设您已经完成了此操作。

参考:rsync - create all missing parent directories?rsync: how can I configure it to create target directory on server?How to use SSH to run a shell script on a remote machine?SSH error when executing a remote command: "stdin: is not a tty"

【讨论】:

谢谢。这是理想的情况,但我怎么知道哪些文件要传递给 rsync? inotify 有什么方法可以让我知道哪些文件已更改并仅同步这些文件? inotifywait -rm 可以监视目录并报告文件更改。

以上是关于对大量文件进行 inotify 和 rsync的主要内容,如果未能解决你的问题,请参考以下文章

rsync+inotify实时同步

rsync+inotify搭建实时同步系统

Rsync+inotify搭建实时同步系统

inotify+rsync实时备份总结

rsync+inotify实时同步

rsync+inotify文件实时同步