我正在尝试使用 rsync 对运行 Ubuntu 14.04.4 LTS 的 Digital Ocean VPS 上的一些文件进行备份。
rsync 速度极慢,范围从20-50 kB/秒, 仅有的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 连接解决了这个问题,但我很好奇是什么原因导致传输速率非常低。
答案1
当您说“主要是 15Mb tarball”时,有多少个较小的文件?您是否一直看到速度缓慢,还是在较大的文件上速度更快?rsync(以及几乎所有其他文件系统操作)在处理许多小文件时比处理较少的大文件时速度慢,这是由于打开和关闭每个文件(以及任何所需的目录读取/修改操作)的文件系统开销。VPS 提供商通过将每个 VM 的每秒 IO 操作限制为固定的最大值来强制公平(更公平)IO 使用,这可能会加剧这种情况。
为了说明这一点:
- 使用类似以下命令创建一个大文件(比如~100Mb):
dd if=/dev/urandom of=/tmp/test.file bs=1024 count=102400
然后通过 rsync 推送该文件 - 然后重复创建多个小文件,例如使用以下命令创建的 10240 个 10Kb 文件:
for i in
seq 1 10240; do dd if=/dev/urandom of=test.file.$i bs=1024 count=10; done
- 使用更小的文件重复上述操作,102400x 1Kb 文件创建方式:
for i in
seq 1 102400; do dd if=/dev/urandom of=test.file.$i bs=1024 count=1; done
您应该会看到,对于较小的文件,处理速度要慢得多,即使累积的内容大小相同。即使您在本地执行所有操作,而不是通过网络执行,情况也是如此(尽管网络显然会在一定程度上放大效果)。在一台较旧的机器上,time rsync * /location/on/another/local/drive/
1 real 0m0.683s, user 0m0.596s, sys 0m0.220s
*100MB 的情况和
real 0m38.793s, user 0m4.664s, sys 0m15.657s
102,400*1Kb 的情况相差约 57 倍。