加速/避免 rsync 文件列表的计算

AF7*_*AF7 21 backup rsync

我使用 rsync 3.1.1 使两张光盘保持同步,其中一张在网络上并作为 samba 共享安装在/mnt/ROUTER_WD_2TB/. 这是源,由于网络限制,速度最高为 30-40MB/s。另一个目标是本地安装(峰值 110MB/s)并且是/mnt/BACKUP_HITACHI_2TB/.

我使用以下 rsync 命令:

rsync  -haAXi --quiet --append-verify --delete /mnt/ROUTER_WD_2TB/* /mnt/BACKUP_HITACHI_2TB/.
Run Code Online (Sandbox Code Playgroud)

磁盘包含许多文件,其中大部分很小。

问题是 rsync开始移动任何文件之前需要很长时间(10-20m),我猜是因为它必须为大量小文件计算文件列表。在此期间,newtwork 利用率处于较低的 200-500KB/s,而在传输文件时,速度约为 40MB/s。

通常情况下,rsync 需要大约 15m 才能最终找到它必须复制的内容,然后需要 5 秒来复制它,然后继续检查其他一些文件要复制另外 5 分钟。总而言之,一个 5 秒的文件副本最终会持续 20 分钟!

除了排除文件夹之外,我是否可以采取任何措施来避免在复制文件之前的这段时间?我可以实现任何类型的“缓存”,以便 rsync 不必从头开始重建所有文件列表?

roa*_*ima 8

rsync您在两个本地文件树之间进行复制而言,它禁用了大部分优化(包括其著名的增量算法)。如果您可以rsync在远程服务器上运行一个(这样您就可以通过网络获得真正的客户端-服务器场景),您将获得很大的吸引力。

尽管如此,这里还有其他选择需要考虑

  1. 复制而不必担心删除旧文件。这可能允许您更频繁地执行更快的传输,并将较慢的清理归为一天一次:

    cp -au /mnt/ROUTER_WD_2TB/. /mnt/BACKUP_HITACHI_2TB/
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用rsync的默认删除算法的变体以避免在传输之前构建完整的文件列表:

    rsync -haAXi --quiet --delete --delete-during /mnt/ROUTER_WD_2TB/ /mnt/BACKUP_HITACHI_2TB/
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将顶级目录拆分为单独的任务并并行运行。您可能会发现,如果您受磁盘 IO 限制,那么这将无济于事,而且对于旋转盘片,它几乎肯定会使事情变得更糟。

    for d in /mnt/ROUTER_WD_2TB/*
    do
        rsync -haAXi --quiet --delete --delete-during "$d" /mnt/BACKUP_HITACHI_2TB/ >"/tmp/rsync.${d/*\/}.log" 2>&1 &
    done
    wait
    cat /tmp/rsync.*.log
    rm -f /tmp/rsync.*.log
    
    Run Code Online (Sandbox Code Playgroud)

如果没有这些建议有助于那么这将是值得加入另一个--verbosersync看到它在做什么。我怀疑它正在浏览所有未更改的文件,如果您有足够的文件,这只会花费很长时间。