当使用nc
、scp
、wget
在专用 2Mbps 链路上在两台机器之间传输文件时,我获得的速度在 0.5 到 1 Mbps 之间。但是,当我使用iperf -c 10.0.1.4 -t 20 -P 12
(例如)时,我可以将链路速度最大化(获得稳定的 2Mbps)。
有没有办法进行单流传输(例如 所做的传输scp
)以利用所有/大部分链接?某种 tcp 设置或 iptables......?
答案1
首先,我们承认您正在比较苹果和橘子。
nc
,scp
并且wget
通常使用单个 TCP 套接字进行传输。但是,当您使用 时iperf -P 12
,您正在使用十二并行 TCP 套接字。这是一个不小的区别。并行连接越多,带宽消耗就越大。事实上,speedtest.net
使用多个并行 TCP 流来可靠地测量带宽容量,即使您的链路存在严重的数据包丢失,从而导致单个 TCP 套接字受损;我曾看到它们以 1.5% 的丢失率使链路饱和(这会大大降低正常 TCP 套接字的吞吐量)。
单套接字 TCP 传输不理想的主要原因是数据包丢失和延迟/抖动。您需要确定并纠正您的链路中是否存在任何持续的数据包丢失...我通常使用mtr
或者winmtr
为了这...
mpenning@mpenning-T61:~$ mtr -n <destination_ip>
HOST: mpenning-T61 Loss% Snt Last Avg Best Wrst StDev
1. 10.239.84.1 0.0% 407 8.8 9.1 7.7 11.0 1.0
2. 66.68.3.223 0.0% 407 11.5 9.2 7.1 11.5 1.3
3. 66.68.0.8 0.0% 407 19.9 16.7 11.2 21.4 3.5
4. 72.179.205.58 0.0% 407 18.5 23.7 18.5 28.9 4.0
5. 66.109.6.108 5.2% 407 16.6 17.3 15.5 20.7 1.5 <----
6. 66.109.6.181 4.8% 407 18.2 19.1 16.8 23.6 2.3
7. 4.59.32.21 6.3% 407 20.5 26.1 19.5 68.2 14.9
8. 4.69.145.195 6.4% 406 21.4 27.6 19.8 79.1 18.1
9. <destination_ip> 6.8% 406 22.3 23.3 19.4 32.1 3.7
如果你发现某个跳跃在一段时间内持续丢失数据包,和如果后面的跳数丢失了数据包,那么您需要修复导致数据包丢失的任何原因。我通常测量至少五到十分钟……如果我没有立即发现问题,通常会测量几个小时。
另一种情况是延迟......您需要进一步量化问题,提供有关端到端延迟以及源/目标操作系统信息的具体信息,然后才有人对此做出回应。
因此,您有以下选择...可以:
- 找出导致绩效下降的原因
- 将传输拆分为多个文件并并行传输(以克服现在导致吞吐量下降的任何因素)