估计完成 rsync 所需的时间或工作量?

估计完成 rsync 所需的时间或工作量?

当在具有大量文件和多个级别的目录的目录上运行时rsync,我们可以估计完成的工作量或时间吗?

  • 进度选项仅显示传输单个文件的进度,而不显示源目录下所有文件和目录的传输进度。

  • 我猜想的一种方法是查看到目前为止它已传输的目录,并将其与源进行比较。

    rsync如果我知道传输文件和目录的顺序,将会有很大帮助。

    我猜这可能与rsync多个线程每个线程做什么?

    我不确定它选择什么顺序,而且我之前对面包优先顺序的猜测似乎不正确(所以我把它划掉了)。

答案1

rsync -arv /source desc --info=progress2

给出 rsync 完成作业之前的预计时间

2,863,290,944 64%  5.71MB/s  0:04:12

0:04:12 是剩余时间

在 CentOS 7/8 上测试

答案2

您可以rsync使用每个文件打印一行-i,然后使用pv -l根据行数(实际上是文件数)报告进度。

你会需要pv(管道查看器):http://www.ivarch.com/programs/pv.shtml

rsync -ai sourcedir/ targetdir/ | pv -l -s filecount > logfile

使用以下命令获取文件计数:

find sourcedir | wc -l

注意:此命令将根据复制的文件数量显示进度信息。如果有许多小文件,此方法效果最佳。如果只有几个很大的文件,那么你不会有太多乐趣。


要在更新(或比较)现有副本时查看进度:

(更多信息:比较目录但不比较文件内容

rsync -aii --delete sourcedir/ targetdir/ | pv -l -s filecount > logfile

第二个-i使 rsync 为每个文件打印一行,即使它们相等。

添加-n进行比较(实际上不是复制或删除任何内容)。

--delete根据需要省略。

此命令将实时将不同的文件打印到屏幕上:

rsync -aii --delete sourcedir/ targetdir/ | pv -l -s filecount | 
    tee logfile | grep -v "^\."

当存在许多小文件时,上述命令效果最佳。如果您的大文件很少,这里有一些解决方法

Rsync 有一个内置的进度报告。请参阅 rsync 手册页中的-Por--progress--info=progress2。我还没有测试过这些。此外,这些选项也不能很好地与pv.或者至少我还没有找到如何做到的。

这是另一个粗略的解决方法,可以根据大小查看进度:

  • 在使用 复制之前记下目标分区的可用空间df -h
  • 使用 记下源目录的大小du -sh
  • 在目标上使用watch df -h并观察尺寸的增长。

显然,这仅在复制时有效,在更新或比较时无效。

答案3

所以我知道这已经很旧了,但我使用的方法(对我来说)比监视文件计数要好得多。下面是一个根据文件大小进行监控的脚本。

在目标服务器上,您可以像这样运行它:

# rsync-monitor.sh <folder> <expected final size of folder> <seconds between measuring start/stop size>
rsync-monitor /folder 516835 300

这将监控/folder预计它达到 516835MB,并且每 300 秒它会打印出如下内容:

[Sun 21 Mar 2021 03:53:25 PM UTC] Starting              | Sleeping 300s...
[Sun 21 Mar 2021 03:58:25 PM UTC] 11900MB of 516835MB   | ~13MB/s       | 10h 15m 0s remaining  | Sleeping 300s...
[Sun 21 Mar 2021 04:03:27 PM UTC] 16497MB of 516835MB   | ~15MB/s       | 9h 0m 0s remaining    | Sleeping 300s...
[Sun 21 Mar 2021 04:08:29 PM UTC] 20974MB of 516835MB   | ~14MB/s       | 9h 10m 0s remaining   | Sleeping 300s...
[Sun 21 Mar 2021 04:13:31 PM UTC] 25600MB of 516835MB   | ~15MB/s       | 8h 50m 0s remaining   | Sleeping 300s...

这是脚本:

#!/usr/bin/env bash

# The folder
FOLDER=$1

# The expected size of folder
MEGS=$2

# How many seconds to refresh
SLEEP=$3

SECONDSLEFT=1
START=$(du -sm $FOLDER |awk '{print $1}')
echo -e "[$(date)] Starting\t\t| Sleeping ${SLEEP}s..."
while (( $SECONDSLEFT > 0 )); do
        sleep $SLEEP
        END=$(du -sm $FOLDER |awk '{print $1}')
        DOWNLOADED=$(( $END-$START ))
        MEGSPERSECOND=$(( $DOWNLOADED/$SLEEP ))
        SECONDSLEFT=$(( ($MEGS-$END)/$DOWNLOADED*$SLEEP ))
        HOURS=$(( $SECONDSLEFT/60/60 ))
        MINUTES=$(( ($SECONDSLEFT-$HOURS*60*60)/60 ))
        SECONDS=$(( $SECONDSLEFT-$HOURS*60*60-$MINUTES*60 ))
        echo -e "[$(date)] ${END}MB of ${MEGS}MB\t| ~${MEGSPERSECOND}MB/s\t| ${HOURS}h ${MINUTES}m ${SECONDS}s remaining\t| Sleeping ${SLEEP}s..."
        START=$END
done
echo -e "[$(date)] Finished"

答案4

当你想知道估计时间时,你可以使用 $ time rsync * /temp 。在进行 rsync 之前,你应该检查文件的总大小。当您通过网络进行 rsync 时,rsync 的快慢取决于您的网络。你可以使用 $ ls -ltr 来检查哪些目录已经备份过。

相关内容