FTPおよびHTTP転送用のバッファーサイズの選択
-
08-07-2019 - |
質問
低レベルのHTTPおよびFTP転送を実装する場合、最大スループットのためにバッファのサイズ(ソケットから読み書きするバイト)をどのように選択しますか?私のアプリケーションは、130 Kbpsから3 Mbpsまでのさまざまな接続で、HTTPまたはFTPでデータを転送する必要があります(予想される速度は事前にわかっています)。場合によっては一方向の転送であり、時には双方向で行われます。平均バッファサイズを維持する必要がありますか、または接続速度に応じて変更する必要がありますか?
ありがとう。
解決
まず、測定値を取得します。
その後、信頼性の高いパフォーマンス測定が完了したら、バッファーサイズを変更し、速度とバッファーサイズのグラフをプロットします。
接続速度が事前にわかっているため、実際のバッファサイズが異なる実際の速度の測定値を取得できるはずです。
OS、プロトコルスタック、およびネットワークは複雑すぎて、第一原理から答えを出すことができません。何かをする前に測定する必要があります。
他のヒント
8KBを超えるバッファサイズを選択します。 9000は通常、最速のネットワークでも使用される最大のMTU(最大伝送ユニット)サイズです。
接続のMTUよりも大きいバッファーを使用すると、オペレーティングシステムは必要に応じてMTUサイズの断片に分割するため、MTUを介して使用するものはネットワークパフォーマンスにほとんど影響しません。
ただし、ファイルを転送している場合、大きなバッファを使用するとパフォーマンスに他の影響が生じる可能性があります。大きなバッファを使用すると、読み取りパフォーマンスが向上し、アプリケーションの速度が向上します。
したがって、通常は16 KBのような適切なラウンド数を選択することをお勧めします。 1500未満には絶対にしないでください。ネットワークパフォーマンスに悪影響を及ぼす可能性があります(オペレーティングシステムが時々小さなパケットを送信し、ネットワークのパフォーマンスが低下する可能性があります)。
バッファサイズを取得できます:httpSocket.getReceiveBufferSize(); 読み取りの過程でこのバッファーをRAMに書き込むことを強くお勧めします。 例:ByteArrayOutputStream memoryFile。 バッファをいっぱいにしてからディスクに書き込みます。