あなたはTCP/IP上のチャンクに任意の長さのファイルを転送しているとしましょう:send()を使用するとき、「最適な」バッファサイズはありますか?
looping...
read(buffer, LENGTH)
send(mysocket, buffer, LENGTH, flags)
私の質問があり、長さの最適値何でしょうか?それとも全く問題ではないのですか?私は使用されている256バイトから8192バイトまでのすべてを見てきました。
あなたはTCP/IP上のチャンクに任意の長さのファイルを転送しているとしましょう:send()を使用するとき、「最適な」バッファサイズはありますか?
looping...
read(buffer, LENGTH)
send(mysocket, buffer, LENGTH, flags)
私の質問があり、長さの最適値何でしょうか?それとも全く問題ではないのですか?私は使用されている256バイトから8192バイトまでのすべてを見てきました。
あなたが最適なものに依存します。帯域幅を最適に使用するには、パケットサイズを最大にして、少なくともネットワークパケットサイズ(イーサネットでは通常約1500バイト)を送信します。あなたがディスク4096または8192バイトから読んでいるなら、良い値になります。
サイズは通常、メモリ操作を最適化するためにシステムページサイズの倍数になるように選択されます。 http://en.wikipedia.org/wiki/Page_(computer_memory) –
バッファサイズがパケットサイズに変換された場合、パケットエラーが発生した場合には、バッファのサイズを小さくするほど再送が少なくなります。
ATMはこれを54バイトのパケットで極限までとらえました。
しかし、あなたのライブラリに応じて、独自のバッファリングとパケットサイズの設定を独立して行っている可能性があります。 YMMV。
各パケットには固定サイズのものが添付されているので、パケットサイズを小さくすると、実際のデータで使用される帯域幅が減少します。 –
高レイテンシ接続で大量のデータを送信する場合は、送信バッファを大きくしてスループットを向上させることができます。これは良い説明です: http://www.onlamp.com/pub/a/onlamp/2005/11/17/tcp_tuning.html
このループは既に間違っています。 send()呼び出しに供給される長さは、read()呼び出しによって返される長さでなければなりません。あなたはそれがバッファに満ちていると仮定することはできません。 – EJP