概括:
我无法理解网络传输中的特殊差异。
- 为什么从一台机器到另一台机器的同步存在如此大的差异,反之亦然?
还:
- 鉴于最大网络传输速度约为 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 是否存在问题,在传输正在进行时运行是有意义的;如果rsync
orssh
进程占用了 100% 的核心,那么这将是一个瓶颈。