TCP クライアント サーバー通信を使用して、複数のソケットを使用してデータを転送するモジュールを作成しました。これで 20MB のファイルが 10 秒で転送されます。
複数のソケットは、それぞれの個別のスレッドでデータを送受信します。
別のワーカー スレッドからモジュールを起動すると、同じファイルの送信にかかる時間が 40 秒に増加します。
タイムラグを回避する解決策を教えてください。
TCP クライアント サーバー通信を使用して、複数のソケットを使用してデータを転送するモジュールを作成しました。これで 20MB のファイルが 10 秒で転送されます。
複数のソケットは、それぞれの個別のスレッドでデータを送受信します。
別のワーカー スレッドからモジュールを起動すると、同じファイルの送信にかかる時間が 40 秒に増加します。
タイムラグを回避する解決策を教えてください。
クライアント側でファイルからコンテンツを読み取り、サーバー側でファイルに書き戻すためにスレッドを同期していますか? これにより時間が追加されます。
これに加えて、デフォルトでは、クライアントとサーバーの両方で複数のスレッド間でコンテキストの切り替え時間が発生します。
問題の 1 つは、ディスクのキャッシングとシークです。まだこれを行っていない場合は、異なるスレッドによって転送されたブロックをより細かくインターリーブしてみてください (たとえば、4KB など)。つまり、バイト 0...4095 は 1 番目のスレッドによって転送され、4096...8191 は 2 番目のスレッドによって転送されます。
また、スレッドの開始時に各スレッドが読み取りと送信、または書き込みと受信を行うことになっていることを認識させるなどして、ミューテックスを回避します。これにより、スレッド間通信が不要になります。転送全体の中止は、ミューテックスの代わりにアトミックフラグ変数 (ブロック転送後に各スレッドによってチェックされる) によって行うことができます。
また、受信側では、メモリ内でバッファリングを行って、宛先ファイルに順番に書き込むようにしてください。つまり、あるスレッドが他のスレッドよりも速くブロックを転送する場合、それらの「初期の」ブロックは、先行するすべてのブロックが受信されて書き込まれるまでメモリに保持されます。
ここでバッファサイズが問題になる場合は、スレッド間同期を一方の端に実装する必要があるかもしれません (受信または送信を遅くするかどうかはあまり重要ではありません)。 、ただし、PC では数十メガバイトのオーダーのファイル サイズの場合、これは問題になりません。