了解为什么网络传输存在如此差异?

了解为什么网络传输存在如此差异?

概括:

我无法理解网络传输中的特殊差异。

  • 为什么从一台机器到另一台机器的同步存在如此大的差异,反之亦然?

还:

  • 鉴于最大网络传输速度约为 110 M/秒,而类似操作的本地磁盘速度约为 200 M/秒(因此,不存在瓶颈),为什么两台机器之间的 rsync 速度比理论100M/秒?

细节:

首先,服务器是

# uname -a                                                                                                                                                              
FreeBSD das 10.1-RELEASE-p8 FreeBSD 10.1-RELEASE-p8 #25 d0fb866(releng/10.1): Thu Nov     13 07:57:26 EST 2014     root@bellicose:/usr/obj/root/pcbsd-build-10-STABLE/git/freebsd/    sys/GENERIC  amd64

客户是:

# uname -a
Darwin compute.internal 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64

两台机器都有 16GB 内存。

通过在服务器上进行本地 rsync,人们可以知道磁盘速度的预期,至少在这种情况下是这样。

使用二进制文件test.bin,732M,FreeBSD服务器上的本地rsync显示大约200M/秒:

# rsync --stats -h test.bin copy.bin

[....]

sent 732.54M bytes  received 35 bytes  209.30M bytes/sec
total size is 732.36M  speedup is 1.00

大约是 200 M/秒。

在 mac mini 客户端上我几乎有 70M/秒:

# rsync --progress --stats -h   test.bin copy.bin
test.bin
        732.36M 100%   70.06MB/s    0:00:09 (xfr#1, to-chk=0/1)

[....]

sent 732.54M bytes  received 35 bytes  69.77M bytes/sec
total size is 732.36M  speedup is 1.00

现在,使用以下命令进行网络速度测试iperf

在服务器(FreeBSD 服务器)上:

# iperf -f M -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 0.06 MByte (default)
------------------------------------------------------------
[  4] local 192.168.1.5 port 5001 connected with 192.168.1.226 port 50757
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-30.0 sec  3356 MBytes   112 MBytes/sec

在客户端(OS X mac mini)上:

# iperf -f M -M 9000 -c 192.168.1.5 -t 30 -w 80K
WARNING: attempt to set TCP maxmimum segment size to 9000 failed.
Setting the MSS may not be implemented on this OS.
------------------------------------------------------------
Client connecting to 192.168.1.5, TCP port 5001
TCP window size: 0.08 MByte (WARNING: requested 0.08 MByte)
------------------------------------------------------------
[  4] local 192.168.1.226 port 50757 connected with 192.168.1.5 port 5001
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-30.0 sec  3356 MBytes   112 MBytes/sec

因此,我可以假设网络连接(两个网卡之间的直 Cat 7 电缆)约为 110 M/秒。

现在,这是令人困惑的情况:

如果我从 FreeBSD 服务器 rsync 到 mac mini,我得到的传输速度约为 50 M/秒:

# rsync --progress --stats -h test.bin -e "ssh -l gsl" '192.168.1.226:/tmp/'
Password:
test.bin
        732.36M 100%   57.10MB/s    0:00:12 (xfr#1, to-chk=0/1)

[....]

sent 732.45M bytes  received 46 bytes  50.51M bytes/sec
total size is 732.36M  speedup is 1.00

但相反方向的 rsync 给出的传输速率要低得多,为 20M/秒:

# rsync --progress --stats -h   test.bin -e "ssh -l gsl" '192.168.1.6:/tmp/'
test.bin
        732.36M 100%   19.55MB/s    0:00:35 (xfr#1, to-chk=0/1)

[....]

sent 732.54M bytes  received 35 bytes  20.07M bytes/sec
total size is 732.36M  speedup is 1.00

我的两个问题:

  • 为什么从一台机器到另一台机器的同步存在如此大的差异,反之亦然?

还:

  • 鉴于最大网络传输速度约为 110 M/秒,而类似操作的本地磁盘速度约为 200 M/秒(因此,不存在瓶颈),为什么两台机器之间的 rsync 速度比理论100M/秒?

有人可以帮助理解这一点,也许提供一些关于如何提高传输速度的建议吗?


更新:根据@dhag的回答,我尝试使用 复制文件netcat,即不使用压缩:

在“服务器”(推送)端:

time cat test.bin | nc -l 2020
nc -l 2020  0.25s user 6.29s system 77% cpu 8.462 total

在接收端(FreeBSD):

time nc 192.168.1.226 2020 > test.bin
nc 192.168.1.226 2020 > test.bin  0.09s user 4.00s system 62% cpu 6.560 total

如果我没记错的话,这应该意味着 732M/6.29s = 117M/sec,这超出了iperf统计数据。也许是缓存问题?


更新 2:使用完全不加密的 rsync(仅在使用守护程序和 rsync:// 协议时才可能):

# rsync  --progress --stats -h  test.bin rsync://[email protected]/share        ⏎
test.bin
     732.36M 100%  112.23MB/s    0:00:06 (xfer#1, to-check=0/1)

[....]

sent 732.45M bytes  received 38 bytes  112.69M bytes/sec
total size is 732.36M  speedup is 1.00

这也证实了@dhag的想法。

答案1

我只能提供一个猜测,即差异是通过两台主机的不同计算、内存、缓存或磁盘特性来解释的:

  • 如果我们假设 CPU 是瓶颈,那么如果较慢的机器发送速度较慢,那就有意义了(这假设加密比解密的计算量更大)。这可以通过切换到更容易计算的密码来测试(尝试添加-c arcfour到 SSH 命令行;在本例中,传递--rsh="ssh -c arcfour"rsync)。

  • 如果我们假设文件直接从磁盘读取/写入到磁盘,那么磁盘可能会成为瓶颈; 100 MBps 的读取速度对于更现代的计算机来说完全可以达到,但对于老式计算机或在笔记本电脑级驱动器上运行的计算机(例如,我相信,Mac Mini)来说则不然。

  • 如果我们进一步假设操作系统使用文件系统缓存,情况可能会进一步复杂:

    • 如果源文件包含在 RAM 中的文件系统缓存中,则读取速度可以比 100 MBps 快得多;

    • 如果目标系统应用写入缓存并且能够将文件的重要部分放入 RAM(在您的情况下应该如此,因为 RAM 比您的测试文件大得多),那么它可以声称写入在它之前完成实际上已到达磁盘(这可能意味着您测得的速度为 200MBps)。

磁盘与缓存的未知数可以通过在读取之前刷新文件系统缓存来测试(如何执行此操作取决于操作系统):然后发送文件的速度至少会与磁盘指示的一样慢。相反,通过在发送之前完全读取文件(可能使用cat file.bin >/dev/null),可以影响操作系统对其进行缓存。

top为了进一步调查 CPU 是否存在问题,在传输正在进行时运行是有意义的;如果rsyncorssh进程占用了 100% 的核心,那么这将是一个瓶颈。

相关内容