Linuxネットワークスタックがデータを受信するプロセスは少し複雑です。私はcomprehensive guide to the Linux network stackと書いて、デバイスドライバからユーザーランドプログラムのソケット受信キューまでのすべてのことを説明しています。
バッファは、カーネル内に維持されている多くの場所があります。
- 、彼らが到着した後にパケットがNICによって書かれているDMAリング。
- DMAリング上のパケットへの参照は、パケットを処理するために使用されます。
- 最後に、受信キューがまだいっぱいでない場合は、パケットデータがプロセスの受信キューに追加されます。
- ソケットから読み取ると、プロセスの受信キューからパケットが取得されます。
- パケットスニッフィングが発生している場合、パケットデータは複製され、パケットスニッフィングコードによって追加されたすべてのフィルタに送信されます。
上記のリンク先のブログ記事では、データの移動、説明、および削除(必要な場合)の全プロセスが説明されています。
ここで、メッセージを高速に処理したい場合は、パケット処理の待ち時間を短縮したいと思っていますか?その場合は、SO_BUSYPOLL
を使用することを検討し、パケット処理の待ち時間を短縮することができます。
受信バッファを増やすと、ユーザーランドソケットのキューに入れることができるパケット数が増えます。パケット処理能力を高めるには、ネットワークスタックの各コンポーネントを慎重に監視して調整する必要があります。パケットを処理するCPUの数を増やすには、RPSのようなものを使用する必要があります。
ネットワークスタックの各コンポーネントを監視して、使用可能なバッファとCPU処理能力がパケットワークロードを処理するのに十分であることを確認することもできます。
@downvoterあなたは私をうなずきます。私は確かにオプション名を正確に綴っていますが、それ以外にOPの推薦が当てはまるかどうかは分かりません。 – EJP