如何降低rsync的速度?


35

我正在尝试复制出现故障的USB拇指驱动器的内容。如果我读取数据的速度过快,则驱动器的控制器芯片会过热,并且驱动器会从系统中消失。发生这种情况时,我需要拔下驱动器,等待一分钟左右以使其冷却,然后重新插入,然后重新启动副本。

我已经对驱动器的内容进行了旧的备份,因此获取其余数据的明显方法是使用rsync最新的备份,但这会导致整个过程“读取速度太快,驱动器消失了,我需要重新开始”问题。有没有办法告诉rsync每分钟仅读取X兆字节的数据?或者,是否可以告诉它在驱动器消失时暂停操作,并在重新插入驱动器时恢复运行?


24
您是否考虑过冷却驱动器?
AEonAX

3
硬盘有多满?如果驱动器已满50%,最好先先镜像故障驱动器,然后再开始处理镜像上更复杂的内容。
kasperd '16

1
@AEonAX:开箱即用的想法很酷,但我不建议这样做:您在设备上施加了额外的热应力,它可能会完全失效。
Piskvor '16

Answers:


46

与DopeGhoti的经验不同,该--bwlimit标志确实会限制我的rsync(v3.1.2)的数据传输。

测试:

$ dd if=/dev/urandom bs=1M count=10 of=data
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0871822 s, 120 MB/s

$ du -h data
10M     data

$ time rsync -q data fast
0.065 seconds

$ time rsync -q --bwlimit=1M data slow
10.004 seconds

(注意:我的time输出看上去与大多数time调用(zsh功能)不同,那些时间不是我编辑的)

否则,或许还有沿双的线-execfind。我相信rsync -R应该创建和复制的父文件夹,但如果没有,那么cp --parents应该。

$ find /failing/usb -exec rsync -R {} /somewhere/safe/ \; -exec sleep 1 \;

注意:也请检查ddrescue,它可能是您正在寻找的东西:)


1
对。DG可能对“带宽”一词感到困惑-但这不仅适用于网络,而且适用于任何数据传输通道。手册页专门说:--bwlimit=KBPS limit I/O bandwidth; KBytes per second,不提网络。随便浏览代码,这会限制读取速度,无论目的地如何。另外,轶事:我多年来一直在使用此选项来限制本地到本地的写入速度。linux.die.net/man/1/rsync
Piskvor

1
好吧,从第二个角度看,它实际上是计算写入的字节数并在计算的时间内休眠。io.c,第832-3行:if (bwlimit_writemax) sleep_for_bwlimit(n);在任何情况下,这都可能会按预期工作,短暂读取并在两者之间休眠。我建议您从一个低值开始,然后仔细增加,或者让慢速传输运行一整夜。
Piskvor '16

25

有点MacGyver解决方案,但过去我在此方面取得了成功:
将旧的USB 1集线器放在存储棒和计算机之间。没办法,它会以这种方式快速复制:-)

其他可能性:如果您有另一个记忆棒,请将其放在连接到同一根集线器的另一个USB端口上(这样它就可以与问题记忆棒共享带宽)。
现在开始对额外的记忆棒进行大写操作,以便两个记忆棒都在争夺带宽。为了进一步控制,您可以使用ionice进一步降低问题解决方案上的优先级。


1
我确信应该有一种方法可以通过软件解决方案使端口作为USB 1.1起作用,可能是通过为USB内核模块提供选项。
安德烈·博里

@AndréBorie:有-bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593,但是由于SW中有有效的节流阀,因此这有点蛮力。
Piskvor '16

@Piskvor会与设备协商较低的传输速率,就像使用USB 1集线器一样。我看不到任何“蛮力”。
安德烈·博里

好吧,我承认单词选择错误。但是,恕我直言,重新配置设备将需要特殊权限(root或至少%adm),而控制每个进程的读取速度将更加简单。(此外,有些设备根本无法在USB 2.0外部运行-违反规范)
Piskvor

13

您可以rsync --bwlimit=RATE用来限制文件传输速度,根据下面的评论,实际上它可以通过限制数据的读取速度来实际发挥作用,而这正是您要寻找的。



3
ionice仅给出优先级,如果正在读取两个内容,则默认情况下它们的值为50/50。ionice可以调整该值,但是如果只有一件事可以读取,则它将达到100%。
coteyr

@coteyr没错,这就是为什么您需要将其与同一USB根集线器上的第二带宽占用程序结合使用。看我的答案。
托尼

2
幸运的是,您的答案是错误的:--bwlimit设置I / O限制,而不一定是网络限制。在各种情况下经过多次测试:此选项使rsync在读取时限制自身,而不考虑目标位置。(在类似的情况下发现了这一点,快速写入慢速本地设备使它们失败)
Piskvor

1
@piskvor-谢谢!那就是我爱这个地方的原因;我一直在学习新事物(:
DopeGhoti '16

8

除之外,还有更多解决方案,可rsync --bwlimit=100提供100KiB / s的速度。

  1. ddrescue与该--max-read-rate选项一起使用可进行完整磁盘复制。这也将允许您重新启动完整磁盘副本,该副本在发生错误后停止。

    ddrescue --max-read-rate=100K /failing/usb output.img output.logfile
    

ddrescue也有许多其他与数据恢复相关的选项,请参见此处的手册

  1. 使用pv(“管道查看器”)和该--rate-limit选项,或使用throttle工具对管道进行评估。pv也可以显示进度。您可以对使用管道或可以使用管道的任何工具进行此项工作:

    tar -cf - /failing/usb | throttle -K 100 | tar -C /your/outputfolder/ -xvf -
    

    要么

    tar -cf - /failing/usb | pv --rate-limit 100k | tar -C /your/outputfolder/  -xvf -
    

    查看pv联机帮助页以获取更多设置和示例。对于throttle,您可能还想尝试一下-w选项,该选项确定如何计算速度,请参见油门手册


现在这是一个有用的工具,不知道,谢谢!pv联机帮助页提供了更多有关各种用法的示例。
Piskvor '16

pv自从发现磁带兴奋的日子以来,我已经一遍又一遍。当tar写入磁带驱动器时返回。:)
Dan Garthwaite
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.