nc
、を使用してscp
、wget
専用の 2Mbps リンク上の 2 台のマシン間でファイルを転送すると、速度は 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
、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
時間の経過とともにパケットが失われ続けるホップを見つけたら、そしてその背後のホップでパケットが失われている場合は、そのパケット損失の原因となっているものを修正する必要があります。私は通常、少なくとも 5 分から 10 分間測定します。問題がすぐに見つからない場合は、数時間測定することがよくあります。
もう一つの状況は遅延です...誰かがこれに応答する前に、エンドツーエンドの遅延と src/dest OS 情報の詳細を使用して、問題をさらに定量化する必要があります。
したがって、いくつかの選択肢があります...次のいずれかです:
- パフォーマンスが低下する原因を突き止める
- 転送を複数のファイルに分割し、それらを並行して転送します(現在スループットを低下させている要因を克服するため)