为什么我的 rsync 会随着时间的推移而变慢?

为什么我的 rsync 会随着时间的推移而变慢?

我正在尝试使用 rsync 将一些文件从我的电脑备份到外部硬盘驱动器。复制工作正常,但即使对于标准 USB 2.0 也需要花费大量时间。对于USB 2.0来说,实际传输速度应该在30MB/s左右,在我的测试中,速度有时达到2MB/s。我使用的笔式驱动器是一个良好的 32GB USB3.0,FAT32 fs。

注意:在每次测试之前,我都会擦除笔式驱动器的全部内容,并且还在不同的 USB 端口上进行了尝试。

我正在使用的部分脚本如下:

mkdir /media/eusbd0
mount -t vfat -o shortname=mixed,iocharset=utf8 /dev/sdb1 /media/eusbd0 

# copy only data between date1 to date2
for dir in $(find /home/records -type d -newermt "2016-08-04" ! -newermt "2016-08-18" 2>&1); do
    if [ "/home/records" != "$dir" ]; then # skip parent dir
        rsync -ravP --inplace --modify-window=2 --log-file=/var/log/download_records "$dir" /media/eusbd0 > /var/log/rsync_report.txt
    fi     
done
#sync    
umount -l /media/eusbd0

这是 rsync 的部分输出:

    sending incremental file list 2016-08-11/ 2016-08-11/gps_00000

     44,179 100%   10.88MB/s    0:00:00 (xfr#1, to-chk=34/36) 2016-08-11/log

    106,792 100%  101.84MB/s    0:00:00 (xfr#2, to-chk=33/36) 2016-08-11/log_cam0

      5,532 100%    5.28MB/s    0:00:00 (xfr#3, to-chk=32/36) 2016-08-11/rec_2016-08-11.13_57_22.mov

  3,513,782 100%  108.10MB/s    0:00:00 (xfr#4, to-chk=31/36) 2016-08-11/rec_2016-08-11.13_59_00.mov

  4,281,177 100%   63.79MB/s    0:00:00 (xfr#5, to-chk=30/36) 2016-08-11/rec_2016-08-11.14_02_09.mov

  3,359,207 100%   36.82MB/s    0:00:00 (xfr#6, to-chk=29/36) 2016-08-11/rec_2016-08-11.14_04_16.mov

  1,877,863 100%   17.91MB/s    0:00:00 (xfr#7, to-chk=28/36) 2016-08-11/rec_2016-08-11.14_05_42.mov


........

 50,482,791 100%  114.90MB/s    0:00:00 (xfr#20, to-chk=15/36) 2016-08-11/rec_2016-08-11.15_14_53.mov

 19,291,527 100%   34.52MB/s    0:00:00 (xfr#21, to-chk=14/36) 2016-08-11/rec_2016-08-11.15_18_42.mov

 50,700,461 100%   58.68MB/s    0:00:00 (xfr#22, to-chk=13/36) 2016-08-11/rec_2016-08-11.15_20_20.mov

.......

sent 802,030,914 bytes  received 685 bytes  94,356,658.71 bytes/sec

total size is 801,832,718  speedup is 1.00 tail:

/var/log/rsync_report.txt: file truncated sending incremental file

list 2016-08-16/ 2016-08-16/log

     41,966 100%    8.77MB/s    0:00:00 (xfr#1, to-chk=16/18) 2016-08-16/obd_00000

     46,798 100%   44.63MB/s    0:00:00 (xfr#2, to-chk=15/18) 2016-08-16/rec_2016-08-16.16_24_12.mov

 50,649,317 100%   18.64MB/s    0:00:02 (xfr#3, to-chk=14/18) 2016-08-16/rec_2016-08-16.16_25_50.mov

 25,602,242 100%    7.78MB/s    0:00:03 (xfr#4, to-chk=13/18) 2016-08-16/rec_2016-08-16.16_57_42.mov

 50,496,580 100%   15.18MB/s    0:00:03 (xfr#5, to-chk=12/18) 2016-08-16/rec_2016-08-16.16_59_20.mov

 50,617,906 100%   13.29MB/s    0:00:03 (xfr#6, to-chk=11/18) 2016-08-16/rec_2016-08-16.17_00_58.mov

 50,759,115 100%   10.16MB/s    0:00:04 (xfr#7, to-chk=10/18) 2016-08-16/rec_2016-08-16.17_02_36.mov

 50,883,325 100%    6.81MB/s    0:00:07 (xfr#8, to-chk=9/18) 2016-08-16/rec_2016-08-16.17_04_14.mov

 47,995,074 100%    4.41MB/s    0:00:10 (xfr#9, to-chk=8/18) 2016-08-16/rec_2016-08-16.17_09_44.mov

 50,813,636 100%    2.35MB/s    0:00:20 (xfr#10, to-chk=7/18) 2016-08-16/rec_2016-08-16.17_11_22.mov

 50,953,015 100%    2.52MB/s    0:00:19 (xfr#11, to-chk=6/18) 2016-08-16/rec_2016-08-16.17_13_00.mov

 50,221,069 100%    2.93MB/s    0:00:16 (xfr#12, to-chk=5/18) 2016-08-16/rec_2016-08-16.17_14_38.mov

 50,445,757 100%    2.87MB/s    0:00:16 (xfr#13, to-chk=4/18) 2016-08-16/rec_2016-08-16.17_16_16.mov

 51,036,959 100%    3.16MB/s    0:00:15 (xfr#14, to-chk=3/18) 2016-08-16/rec_2016-08-16.17_17_54.mov

 51,056,196 100%    3.19MB/s    0:00:15 (xfr#15, to-chk=2/18) 2016-08-16/rec_2016-08-16.17_19_32.mov

 50,434,922 100%    3.12MB/s    0:00:15 (xfr#16, to-chk=1/18) 2016-08-16/rec_2016-08-16.17_21_10.mov

 19,456,000 100%    2.71MB/s    0:00:06 (xfr#17, to-chk=0/18)

sent 701,682,372 bytes  received 343 bytes  4,512,429.04 bytes/sec

total size is 701,509,877  speedup is 1.00

输出中可以注意到,开始时速度非常高,而最后速度变得越来越慢。为什么会发生这种情况?

我正在复制的文件几乎相同(除了大小可能略有不同),而且它们的数量非常低,不到 100 个文件。我也尝试过其他笔式驱动器,但得到了相同的结果。

谢谢!

新实验:

我尝试使用 cpio 而不是 rsync 来复制相同的文件。修改后的脚本:

mkdir /media/eusbd0
mount -t vfat -o shortname=mixed,iocharset=utf8 /dev/sdb1 /media/eusbd0 

# copy only data between date1 to date2
for dir in $(find /home/records -type d -newermt "2016-08-04" ! -newermt "2016-08-18" 2>&1); do
    if [ "/home/records" != "$dir" ]; then # skip parent dir
        find "$dir" -print | cpio -pdm /media/eusbd0 > /var/log/rsync_report.txt
    fi     
done
#sync    
umount -l /media/eusbd0

要复制的数据量约为 3GB,cpio 所需的时间为 900 秒,这意味着平均传输速度为 3-4 MB/s。问题似乎与硬件或驱动器有关,因为 rsync 速度也接近该值。

更新 我尝试使用其他 3 个 FAT32 格式的笔式驱动器,但也得到了同样的结果。然后我尝试了 NTFS fs,得到了 >30MB/s 的良好结果,但不幸的是仅在我拥有的 4 个 USB 记忆棒中的一个上。其他使用外部 HDD 和 SSD 的实验也显示出一些相当好的结果 >20MB/s。

总而言之,我的主板(或驱动程序)可能不喜欢 USB 记忆棒,也不喜欢 FAT32 fs。外部硬盘驱动器(无论是否通电)至少在 NTFS 中按预期工作。而且,我不知道为什么会发生这种情况。

答案1

rsync不是复制的最佳解决方案。这是同步文件的最佳解决方案。大多数数据写入/读取的速度取决于缓冲区。在写入文件的情况下,缓冲区会被填满,并且您会看到更高的速度。一旦缓冲区被写入设备(缓冲区刷新),速度就会下降。设备的写入速度不仅取决于规格(USB 2.0 或 3.0 ...),还取决于协议(实现)、驱动程序、块大小。有时,最好复制整个文件,而不是让同步程序首先扫描更改。这会带来开销并降低本地连接设备的速度。如果您通过网络执行此操作,情况可能会有所不同。

答案2

您的一些问题来自于使用廉价的 USB 记忆棒,这些记忆棒的性能非常难以预测。

但逐渐减慢的传输速度是 rsync 的 delta-xfer 算法造成的。

您可以通过指定 -W 标志来避免这种情况:

rsync -ravP -W "$dir" /media/eusbd0

这样,即使文件非常大,传输也不会随着时间的推移而减慢。

但有一个问题,如果文件发生变化,未来的更新将不得不再次复制整个文件并且不能使用增量增量,因此您必须权衡一个缓慢来源(低效的增量xfer)以换取另一个来源(完整文件副本)。也许仅使用 -W 进行初始传输。

答案3

30 MB/s 相当快阅读闪存驱动器的速度(在撰写此答案时 - 几年后速度有所提高)。写作速度慢了很多。 (这里是一些基准测试示例。)限制因素不是 USB 连接,而是驱动器物理特性。并且写入单独的文件比您在基准测试中看到的原始写入速度慢:写入元数据也需要时间。

您一开始看到的快速速度是写入某处的写入缓冲区。在某些时候缓冲区已满,然后实际磁盘写入速度就很重要。

您可能还会看到其他减速效果,尽管由于您只填充了新格式化驱动器的 1/4,所以我认为您还没有达到它们开始的程度。如果文件系统接近满并且有许多已删除的文件,它可能会开始变得碎片化,因此需要更长的时间才能在这里或那里为文件找到一点空间(这主要是旋转媒体的问题,这对存储文件有很大帮助)能够以大的连续块存储文件)。在闪存介质上,当使用了很大一部分并已被删除时,数据会在单元之间传播;每个单元都需要作为一个整体进行擦除,因此如果许多单元部分受到写入的影响,则需要擦除和部分重写大量单元。此外,在旋转介质上,数据访问速度取决于数据距中心的距离,但在闪存驱动器上,它们在任何地方都是相同的。

相关内容