rsync --info=progress2 复制大型目录的完成百分比是不均匀的,因为最后 10% 似乎比前 90% 花费的时间更长。
为什么会这样?有没有办法使它成为更统一的进度指示器?
答案1
观察到的行为的原因是可能A文件系统缓存:
当文件被写入时(确实如此rsync
),通常数据会先写入缓存(内存中),然后写入操作几乎立即返回。然后数据在后台写入磁盘,此时用户可以做其他事情。
如果缓存足够大,可以容纳要写入的数据,那么写入速度就会非常快。
如果要写入的数据无法容纳在文件系统缓存中,那么多余的数据实际上会在写入操作完成之前写入磁盘,而写入磁盘的速度比写入内存缓存要慢。
多余的数据不会旁路缓存,而是等待以前的内容从缓存移动到磁盘,从而再次在缓存中腾出一些可用空间,以便将新数据写入缓存。
因此,数据的第一部分(在您的情况下为 90%)似乎在瞬间写入(缓存),而最后 10% 则需要更多时间,因为实际的磁盘操作随后才开始。
答案2
除了 PerlDuck 的回答之外,值得注意的是,写入一个大文件比写入大量加起来大小相同的文件要快。
例如:您复制一个 4GB 的文件和一个包含 100000 个文件(总计 1GB)的目录。如果先传输单个文件,则前 80% 将比后 20% 快得多。
答案3
显示的百分比只是 rsync 已扫描文件总大小的百分比。--info=progress2
例如,在 的输出中:
71,256,901,358 99% 36.30MB/s 0:31:12 (xfr#173389, ir-chk=1000/361047)
最后一个数字 361047 是迄今为止已扫描的文件数。当您递归复制包含大量子目录和文件的大型目录时,此数字通常会持续增长,直到操作几乎完成为止,并且已扫描但尚未复制的文件通常只占文件总数的一小部分,因此除非扫描但未复制异常大的文件,否则已扫描文件中的大多数数据都已被复制,因此该百分比在大多数情况下通常会超过 90%。