1

いくつかのソケットに関する質問があり、明確な「はい」または「いいえ」を見つけることができなかったので、再投稿である場合は事前にお詫び申し上げます:) プラットフォームは Linux 2.6.30、C++ アプリです。ネットワーキングにはまだ非常に慣れていないため、スピードを上げています。

  1. ソケット API スレッドは安全ですか? たとえば、ミューテックスを使用せずに複数のスレッドから送信した場合、または独自のミューテックスを使用してそれを確認する必要がありますか?

  2. 送信を行って送信APIの内部キューイングに送信を任せるよりも、送信がブロックされてから送信を行うかどうかを確認するためにポーリング/選択する方が良いですか? とにかくスレッドがブロックされる場合 (つまり、タイムアウトを使用しない場合)、ポーリングとそれに続く送信が必要な理由がわかりません。

  3. Linux ではソケットはデフォルトでゼロコピーですか、それともコピーが関係していますか? コピーがある場合のサイズ制限はありますか (API の観点ではなく、粒度の観点から)? 答えが、カーネルがコピーを行うというものである場合、ゼロ コピー ソケットはありますか?

  4. 2 台のマシン間で通信する必要がある場合、単一のソケットよりも複数のソケットの方が帯域幅をはるかにうまく利用できると思います。それは正しい仮定でしょうか?2 台の通常の Linux マシン間で全帯域幅を利用する最善の方法は何ですか?

5.インターフェイスの現在の帯域幅使用量を測定するためのお気に入りのツールは何ですか? これはおそらく単なる好みです。私は iptraf などを見ましたが、他の人が何を使用し、最も気に入っているのかを知りたいと思います。

4

2 に答える 2

3
  1. ソケット API は、ソケットごとに確実にスレッド セーフです。つまり、特定のソケットが 1 つのスレッドのみによってアクセスされる限り、他のスレッドは問題なく他のソケットに同時にアクセスできます。複数のスレッドが同時に同じソケットにアクセスすることは、「スレッドセーフ」である場合とそうでない場合がありますが (スレッドセーフの定義によっては)、結果として生じる動作を簡単に予測できないため、いずれにしても推奨されません。(たとえば、2 つのスレッドがほぼ同時に同じソケットで recv() を呼び出した場合、どのスレッドが着信 TCP ストリームからどのバイトを取得するかは神のみぞ知る)

  2. ブロッキング I/O を使用している場合、send() を呼び出す前に poll/select() でチェックすることはあまり役に立ちません。とりあえず。(たとえば、バッファに 32 バイトのスペースがあり、64 バイトを送信しようとすると、send() はブロックされます)。select() と poll() は、ノンブロッキング I/O と組み合わせるとより便利です。

  3. Linux ソケットのゼロコピーの状態についてはよくわかりませんが、ウィキペディアの記事では、sendfile()、sendfile64()、または splice() 呼び出しを使用している場合にのみ Linux がゼロコピーを行うことを示唆しているようです。最新の CPU を考えると、それがそれほど重要であるとは思えません。最も高性能なプログラムを除くすべてのプログラムは、ネットワーク データをコピーするために十分な CPU サイクルを利用できます。ボトルネックになるのは、ネットワーク インターフェイス自体の速度です。

  4. 複数のソケットを使用しても、単一のソケットよりも帯域幅の使用率が向上するわけではありません。単一のソケットは、ネットワーク接続を介して十分に迅速にデータを送り込むと、ネットワーク接続を簡単に飽和させる可能性があります。特に複数の TCP 接続では、一般に、単一の TCP 接続よりも帯域幅の使用率が低くなります。これは、各 TCP 接続が独自の伝送オーバーヘッドを発生させ、さらに悪いことに、複数の TCP 接続が帯域幅をめぐって競合し、ある時点で互いにパケットをドロップし始めるためです。 、輻輳を軽減するために送信レートを下げることで対応します。

  5. Linux についてはお答えできません。MacOS/X アクティビティ モニターでは、ネットワーク帯域幅の使用状況が表示されます。

于 2012-04-30T04:34:24.873 に答える
1

ジェレミーのポイント#3はやや不正確です。複数の高速ネットワークインターフェイスと大量のデータが移動するため、ゼロコピーが非常に重要になります。メモリ内のバッファのコピーに費やされる時間は、スループットとレイテンシに影響を与えます。非同期IOとスキャッター/ギャザーのサポートは、高速のネットワークシステムにとって重要です。

于 2012-08-20T16:07:15.373 に答える