web-dev-qa-db-ja.com

マルチスレッドのダウンロードがシングルスレッドよりも速いのはなぜですか?

サーバーに1つの大きなファイルがあります。マルチスレッドのダウンロードでは20Mbsが得られますが、シングルスレッドでは10Mbpsが得られますが、誰でもこれを説明できますか?

13
why

通常、これはあなたと他のサーバーの間にファイアウォールがあり、各HTTPストリームが10Mbpsに制限されているためです。マルチスレッドを使用すると、2x 10Mb(スレッドごとに1つ)が得られます。

14
Mark Henderson

これは、ユーザーとサーバー間のpingと、ダウンロードソフトウェアが使用するパケットサイズ/ tcpipウィンドウサイズによるものです。

基本的に、サーバーへの100ミリ秒のpingがあり、100 kbのパケットを要求する場合、インターネット速度が無限であっても、1つの接続を使用して毎秒10パケットしか取得できません。

4
BarsMonster

TCPは、「パイプをフルに保つ」ときに最適に機能します。送信側アプリが送信側TCPスタックに常にデータを供給し続けるように十分な速度でバッファーを送信し続けると、常に「処理中」のデータを持つことができます。ネットワーク、およびレシーバーアプリがレシーバーTCPスタックから十分な速度で読み取りを続けると、レシーバーTCPウィンドウがいっぱいになることはありません(ここでも、送信TCPスタックネットワーク上で常に「処理中」のデータを保持できます)。

1つのバッファーをTCPスタックに渡し、完全にAckedされたことを聞くのを待ってから、別のバッファーを渡す、不適切に作成されたシングルスレッド送信アプリを想像できます。つまり、最初のバッファの終わりがネットワーク上で「処理中」になると、送信するTCPスタックはデータを送信するために不足します。つまり、パイプがドレインし、Ackが完了するまで補充されません。戻ってきて、送信アプリが新しいバッファーを渡します。

また、受信側のTCPスタックから十分な速度で読み取れず、TCPスタックのバッファーがいっぱいになるように作成された、不適切に作成されたシングルスレッドレシーバーアプリも想像できます。 TCPウィンドウがいっぱいになると、送信TCPスタックは、ウィンドウが開くまで送信を停止します。レシーバーのTCPウィンドウサイズを大きくすると、少しは役立つ場合がありますが、このための実際の解決策は、データをより速く読み取ることです。

3
Spiff

まあ、それはおそらく、1つの接続で転送できるデータが多すぎるためです。ただし、マルチスレッドプログラムでは、2つの接続が同時にデータを受信し、取得できる情報量が2倍になります。これには、たとえばダウンロード元のサーバーの速度など、いくつかの制限があります...マルチスレッドダウンローダーを書いた2人の帽子は、簡単に書くことができません。

2
Joshkunz