rsync / scp通过快速连接的传输速率非常低(<30kB / s)

我正在尝试使用运行Ubuntu 14.04.4 LTS的Digital Ocean VPS上的某些文件的rsync进行备份。

rsync是非常缓慢的,范围从20-50 kB / s ,只有它应该是1% 。 使用scp或者在守护进程模式下使用rsync同样缓慢,所以这对于rsync或者ssh来说似乎不成问题。

我也可以访问另一个VPS(Linode),当使用来自VPS的rsync传输文件时,我得到2-3MB / s的预期传输速度。

此外,当我使用rsync直接从Digital Ocean VPS传输文件到Linode VPS时,我可以获得15MB / s的正常服务器间传输速率。 这些因素结合在一起,表明ssh和rsync在所有机器上工作正常。

现在我已经通过Linode VPS隧道传输ssh连接来避开这个问题,但是我很好奇可能会导致非常低的传输速率。

当你说“主要是15Mb tarballs”时,有多less个小文件? 您是否经常看到缓慢的速度,或者在更大的文件上看起来更快? 由于打开和closures每个文件的文件系统开销(以及任何需要的目录读取/修改操作),rsync(以及几乎任何其他的文件系统操作)在处理许多小文件时比较慢,而不是较less的较大文件操作。 VPS提供商通过将每个VM的IO操作每秒限制到一个固定的最大值来强制公平地使用IO,可能会加剧这种情况。

为了说明这一点:

  1. 创build一个大的(比如〜100Mb)文件,像这样的东西:
    dd if=/dev/urandom of=/tmp/test.file bs=1024 count=102400
    并通过rsync推送该文件
  2. 然后重复许多小文件,例如创build10240 10Kb文件:
    for i in 1 10240 ; do dd if=/dev/urandom of=test.file.$i bs=1024 count=10; done ; do dd if=/dev/urandom of=test.file.$i bs=1024 count=10; done
  3. 重复更小的文件,102400x 1Kb文件创build:
    for i in seq 1 102400 ; do dd if=/dev/urandom of=test.file.$i bs=1024 count=1; done ; do dd if=/dev/urandom of=test.file.$i bs=1024 count=1; done

即使累积的内容大小相同,您也应该看到小文件的处理速度要慢得多。 即使你在本地而不是在networking上做任何事情,情况也是如此(尽pipenetworking显然会在某种程度上放大效果)。 在这里的一个小旧机器上, time rsync * /location/on/another/local/drive/给出了real 0m0.683s, user 0m0.596s, sys 0m0.220s用于1 * 100MB的情况以及real 0m38.793s, user 0m4.664s, sys 0m15.657s为102,400 * 1Kb – 相差〜57x。