ネットワークは、オペレーティング システムの中で私が最も苦手とする分野です。不完全な質問をしてしまったことをお許しください。私はこれについて数時間読んでいますが、頭の中を泳いでいます。(私にとって、チップの設計は、ネットワーク プロトコルを理解するよりも簡単だと思います。)
ソケットを介して相互に通信するネットワーク サービスがいくつかあります。具体的には、fd = socket(PF_INET, SOCK_STREAM, 0);
TCP/IP を自動的に取得する でソケットが作成されます。これらのサービスは別のマシンで実行されている可能性があるため、これが基本ケースとして必要です。
しかし、あるプロジェクトでは、Atom Z530P に基づいて、それらすべてを非力な組み込み「アプライアンス」に詰め込もうとしています。そのため、メモリ コピーのオーバーヘッドは最適化できるもののように思えます。私はそれについてここで読んでいます: data-link-access-and-zero-copyおよびLinux_packet_mmapおよびpacket_mmap。
この場合、次のようなソケットを作成しますfd = socket(PF_PACKET, PF_RAW, 0);
。また、リングバッファの割り当て、mmap、ソケットへの関連付けなど、他にもやるべきことがたくさんあります。データの使用sendto
とrecvfrom
送信に制限されているようです。私が理解しているように、ソケットはローカルであるため、信頼できる「ストリーム」タイプのソケットは必要ないため、生のソケットが適切なインターフェイスであり、リングバッファーはページの粒度で使用され、各パケットが(またはデータグラム) はページ境界から始まります。
これをさらに調査するために多大な時間を費やす前に、いくつかの質問で親切な人が私を助けてくれることを期待していました:
- ここで、ゼロコピー ソケットから得られるパフォーマンス上の利点はどれくらいですか? 最後にチェックしたときは、あるプロセスから別のプロセスへ、そして最終的にはディスクへ、最大で 40 MB/秒ほど移動していたと思います。最も基本的なシナリオでは、データはキャプチャ プロセスから 1 対多のプロセス (他のプロセスはストリームをリッスンできます)、ディスクに書き込むアーカイバ プロセスに移動します。これは、ディスクと内部のものを数えない 2 つのホップです。
- Linux はこれを自動的に行い、同じマシン上で実行されているプロセスを最適化しますか?
- いずれにせよ、TCP ポートでリッスン ソケットを使用します。それらを使用してプロセス間の接続を作成できますが、それでもゼロコピーを使用できますか? つまり、PF_PACKET で AF_INET を使用できますか?
- SOCK_RAW を使用した PF_PACKET は、ゼロコピー ソケットの唯一の有効な構成ですか?
- フォールバックとして TCP/IP でゼロコピーを使用する良いサンプル コードはありますか?
- 2 つのプロセスが同じマシン上にあることを検出する最も簡単な方法または最良の方法は何ですか? 彼らはお互いの IP アドレスを知っているので、それぞれに異なるコード パスを比較して使用することができます。これを行う簡単な方法はありますか?
- パケットベースのソケットで write() と read() を使用できますか、それともストリームに対してのみ有効ですか? (すべてのソケット コードを書き直すよりも、接続方法を書き直す方が簡単です。)
- 物事を過度に複雑にしたり、間違ったことを最適化したりしていませんか? OProfiler によると、ほとんどの CPU 時間は (1) zlib と (2) カーネルの 2 つの場所で費やされています。これは、VMLinux を提供しない CentOS 6.2 を使用しているためプロファイルできません。カーネル時間は、アイドル時間とデータのコピーの組み合わせであり、他にはあまりないと思います。
助けてくれてありがとう!