通过networking复制大文件的性能下降(scp)

我有一个我用作文件服务器的Linux机器。 我有一个每月的cron工作,加快了数据驱动器的内容,然后通过scp复制到另一台机器,以保持安全。 由此产生的tarball大小约为300GB,通常需要大约一天半时间才能完成复制(通过802.11g Wi-Fi连接)。

今天我注意到我的备份工作还没有完成,而且已经运行了3天。 检查目标机器,我可以看到只有大约三分之一的数据已被复制到目前为止,它似乎正在以<300KB /秒的速度增长。

在两台机器之间使用iperf ,我可以看到我的networking吞吐量大约是20Mbits / sec,这大约与802.11g连接相当。

在源机器上使用dd if=srcfile of=/dev/null ,我可以从源驱动器(外部USB驱动器)读取大约45MB /秒的数据。

在目标机器上使用dd if=/dev/zero of=/destdrive/tmp.dat ,我可以向目标驱动器(内部SATA驱动器)写入大约30MB / sec。 似乎有点缓慢的SATA驱动器,但不是不合理的缓慢(当然不是300KB /秒慢)。

所以我似乎排除了两端的networking吞吐量和驱动器吞吐量,那么我还能从哪里find瓶颈的来源?

为什么你首先使用scp来复制大文件? scp有自己的开销(encryption,真实性检查等)。

你可以使用rsync (rsync非常适合通过ssh传输大文件,因为它可以继续传输,由于某种原因被中断,因为它使用散列函数来检测相同的文件块,所以continuefunction是相当强大的),或者一些其他的工具。

请看这个post。 通过networking复制大文件,速度更快

如果你想使用scp,那么你应该使用traceroutetcpdumpiftop来查看从源到目的地的数据包。 可能是你发现不寻常的东西。

检查以确保-l选项未启用以限制带宽。 另外,看起来有一个-v会让人知道下一轮正在发生的事情。

详细模式。 导致scp和ssh(1)打印有关其进度的debugging消息。 这有助于debugging连接,身份validation和configuration问题。

之前已经回答了。 从答案引用。

scp正在使用交互式terminal来打印那个奇特的进度条。 将输出打印到文件根本没有意义,所以scp会检测输出何时redirect到terminal以外的其他位置,并禁用该输出。

完整答案

https://stackoverflow.com/questions/3890809/bash-stdout-redirect-of-commands-like-scp

SCP手册页

https://linux.die.net/man/1/scp