为什么 scp 不显示真实的上传速度?

为什么 scp 不显示真实的上传速度?

每次我尝试使用scp慢速上传连接(~100kb/s)上传文件时,它都会显示如下内容:

test                           27% 2208KB   2.2MB/s   00:02 ETA

在第一秒我就开始了。

显然,它没有传输 2208KB,而且绝对不是以 2.2MB/s 的速度传输。几秒钟后,它会降低到正确的速度,但不会回到之前的位置:相反,当传输完成时,它会挂起几秒钟(或几分钟),直到传输完成。真的完成的。

我发现,在每个 Linux 上,每次使用 scp 时,每次我的传输速度都会低于 1MB/s。

SCP 到底怎么了?

答案1

scp正在测量数据通过的速率

基本上,scp从磁盘读取一些数据并将其通过管道传递到ssh.内核中有一个管道缓冲区,尽管它相当小。然后ssh对其进行加密并将其传递给内核以通过网络发送。该缓冲区可能相当大。

所有缓冲对于应用程序来说都是相当透明的;它只是write对管道或套接字执行调用。内核接受数据,并且不会向应用程序指出它是位于缓冲区中还是实际上已被发送并由远程端确认。应用程序有办法询问——但这对来说很难scp,因为ssh实际上处理套接字也是如此。

然后您看到的是所有缓冲区(主要是 TCP 发送缓冲区)的初始填充发生得很快,并且 scp 将其显示为其传输速率。最后,scp完成读取文件,将其发送到ssh管道,并等待 ssh 完成。ssh看到scp发送完成,并等待内核完成 TCP 缓冲区的刷新。这就是最后的停顿。

我认为唯一的两个解决方案(除了“忽略它”)是获得更快的链接或降低 TCP 发送缓冲区大小。

相关内容