我们经常需要在两台主机之间传输大型文件(超过 50 GB),但传输速率似乎永远无法达到网络的预期吞吐量。有几个点可能是瓶颈,但它们的理论上限分别是方式超过实际传输速率。以下是典型设置:
笔记本电脑 --> 802.11n --> AP --> CAT 6 电缆 --> 10/100 Mbits 路由器 --> 台式机
在这方面,瓶颈显然是路由器,它将传输速率限制在 100 Mbits/sec。即便如此,我也很少看到传输速率(使用 scp)超过 9.5 MB/s,这代表 76 Mbits/sec,或仅为理论最大限值的 76%。
接入点真的会有 24% 的开销吗,还是有其他因素限制了速度?可能是磁盘 I/O(尽管 SATA 的额定速度为 1.5 Gbps),也可能是主板上磁盘和 NIC 之间的任何东西(我该如何测量?)。
有没有办法确切地知道(*)瓶颈在哪里?如果我无法从 100 Mbps 路由器获得超过 76 Mbps 的速度,那么将网络升级到千兆位是否会增加吞吐量,还是我仍然会获得 76 Mbps,因为瓶颈在其他地方?
(*)或者至少以足够有说服力的方式让老板同意投资升级网络的一部分
答案1
你的问题是你同时测试了太多东西:
- 磁盘读取速度
- SSH 加密
- 无线的
- SSH 解密
- 磁盘写入速度
既然您提到了 SSH,我假设这是一个 unix 系统......
您可以使用简单的方法排除磁盘读取速度的任何问题
dd if=yourfile of=/dev/null #or
pv yourfile > /dev/null
在接收端,你可以做一个简单的磁盘写入测试
dd if=/dev/zero of=testfile bs=1M count=2000 # or
dd if=/dev/zero bs=1M count=2000 | pv > testfile
dd 并不是真正的“基准”,但由于 scp 使用顺序 IO,因此它足够接近
你也可以通过以下方式测试 SSH
dd if=/dev/zero bs=1M count=100 | ssh server dd of=/dev/null # or
dd if=/dev/zero bs=1M count=100 | pv | ssh server dd of=/dev/null
最后,为了排除 SSH 是瓶颈,你可以使用 nc 来测试网络性能
server$ nc -l 1234 > /dev/null
client$ dd if=/dev/zero bs=1M count=100 | pv | nc server 1234 # or
client$ dd if=/dev/zero bs=1M count=100 | nc server 1234
如果您确实想正确测试网络,请安装并使用 iperf 之类的程序,但 nc 是一个很好的开始。
我会先进行 nc 测试,因为这样可以排除大多数问题。您也一定要在不使用无线的情况下运行测试。802.11n 可以轻松达到 100mbit 端口的最大速度,但前提是您已正确设置它。
(Ubuntu >= 12.04 默认为 netcat-openbsd。nc -l -p 1234 > /dev/null
如果您使用 netcat-traditional,这可能是您想要的)。
答案2
这样想想;
您有一个运行着一个或另一个文件系统的慢速 SATA 磁盘(笔记本电脑磁盘很慢),然后该磁盘会变成基于 IP 的文件共享协议,例如 SMB。然后,它会变成 wifi 格式,然后到达 AP,然后通过有线以太网(这确实需要重新格式化)到达一个速度相当慢的交换机。路由器,然后到达一个可能速度相当慢的桌面,分解成您选择的文件系统格式,最后到达磁盘。所有这些都发生在每个数据包上,大多数(如果不是全部)数据包都需要在发送下一个数据包之前发回确认数据包。
我很惊讶你能看到如此快的速度!
这里有一条提示,当您需要传输文件时,将笔记本电脑连接到 100Mbps 交换机/路由器 - 真的,这样会快得多。另外还要考虑两端更快的磁盘,并确保您也使用高效的文件传输机制。
希望这可以帮助。
答案3
正如 Chopper3 所暗示的,也请尝试使用 rsync-over-ssh 来传输这种大小的文件,因为很有可能出错;没有什么比通过 50GB 的传输获得 45GB 并失败更糟糕的了。它也可能减少您的开销,但我个人还没有对这么大的文件进行过测试。
当传输数千个小文件时,rsync 也可以显著减少开销——我曾经运行过一个 75K 文件/1500 目录/5.6K 平均文件大小的测试,使用 FTP 和 SFTP 需要 12 分钟,使用 SCP 需要 10 分钟,但使用 rsync-over-ssh 只需 1 分 50 秒,因为减少了设置/拆卸开销。不使用 SSH 的 Rsync 只快了 20 秒,为 1 分 33 秒。
答案4
您可以使用此命令来测量磁盘的读取速度:
hdparm -tT /dev/sdX
(将 X 替换为驱动器号)
1.5/3/6gbps 在技术上是 SATA 传输速度,但大多数磁盘只能实现 50-60mbps 的连续读取速度。