1

メッセージをより速く処理するためにTCPバッファサイズを増やすように言われています。 私の質問は、TCPのメッセージ(ByteBuffer、DirectByteBufferなど)にどのようなバッファを使用していても、CPUがNICから割り込みを受け取り、ソケットデータを読み込むネットワーク要求を処理するたびに、OSはアドレス空間CPUは、ネットワークデータを受け取り、どのような方法工程(そのソケットをリッスンしているプロセスをIG)プロセスメモリのアドレス空間にTCPバッファがありますか?

または

を要求するのではなく、常にプロセスのアドレス空間のみと(Recv関数「を含む無バッファのバッファに書き込まれます-Q 'と' Send-Q '(netstatコマンドの)がこの通信のために維持されていますか?

答えて

-1

ソケットの送信サイズまたは受信バッファサイズを増やすように指示されています。これらは、カーネルのTCP部分のソケットに関連付けられています。 setsockopt()およびSO_RCVBUFおよびSO_SNDBUFを参照してください。

+0

@downvoterあなたは私をうなずきます。私は確かにオプション名を正確に綴っていますが、それ以外にOPの​​推薦が当てはまるかどうかは分かりません。 – EJP

-1

参照: http://linux.die.net/man/3/setsockopt

オプションはSO_SNDBUFとSO_RCVBUFです。 C-APIを直接使用する場合は、setsockopt自体が呼び出されます。いくつかの種類のフレームワークを使用する場合、ソケットオプションを設定する方法を調べます。これは実際にはカーネル側のバッファであり、プロセスによって保持されるバッファではありません。これは、読み込み/受信呼び出しからフェッチするために、カーネルが保持できるバイト数を決定します。また、TCPのflow controlメカニズムにも影響します。

+0

@downvoterご説明ください。この回答は正しいだけでなく、参照によって裏付けられています。 – EJP

0

Linuxネットワークスタックがデータを受信するプロセスは少し複雑です。私はcomprehensive guide to the Linux network stackと書いて、デバイスドライバからユーザーランドプログラムのソケット受信キューまでのすべてのことを説明しています。

バッファは、カーネル内に維持されている多くの場所があります。

  1. 、彼らが到着した後にパケットがNICによって書かれているDMAリング。
  2. DMAリング上のパケットへの参照は、パケットを処理するために使用されます。
  3. 最後に、受信キューがまだいっぱいでない場合は、パケットデータがプロセスの受信キューに追加されます。
  4. ソケットから読み取ると、プロセスの受信キューからパケットが取得されます。
  5. パケットスニッフィングが発生している場合、パケットデータは複製され、パケットスニッフィングコードによって追加されたすべてのフィルタに送信されます。

上記のリンク先のブログ記事では、データの移動、説明、および削除(必要な場合)の全プロセスが説明されています。

ここで、メッセージを高速に処理したい場合は、パケット処理の待ち時間を短縮したいと思っていますか?その場合は、SO_BUSYPOLLを使用することを検討し、パケット処理の待ち時間を短縮することができます。

受信バッファを増やすと、ユーザーランドソケットのキューに入れることができるパケット数が増えます。パケット処理能力を高めるには、ネットワークスタックの各コンポーネントを慎重に監視して調整する必要があります。パケットを処理するCPUの数を増やすには、RPSのようなものを使用する必要があります。

ネットワークスタックの各コンポーネントを監視して、使用可能なバッファとCPU処理能力がパケットワークロードを処理するのに十分であることを確認することもできます。

関連する問題