4

ネットワークは、オペレーティング システムの中で私が最も苦手とする分野です。不完全な質問をしてしまったことをお許しください。私はこれについて数時間読んでいますが、頭の中を泳いでいます。(私にとって、チップの設計は、ネットワーク プロトコルを理解するよりも簡単だと思います。)

ソケットを介して相互に通信するネットワーク サービスがいくつかあります。具体的には、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、ソケットへの関連付けなど、他にもやるべきことがたくさんあります。データの使用sendtorecvfrom送信に制限されているようです。私が理解しているように、ソケットはローカルであるため、信頼できる「ストリーム」タイプのソケットは必要ないため、生のソケットが適切なインターフェイスでありリングバッファーはページの粒度で使用され、各パケットが(またはデータグラム) はページ境界から始まります。

これをさらに調査するために多大な時間を費やす前に、いくつかの質問で親切な人が私を助けてくれることを期待していました:

  • ここで、ゼロコピー ソケットから得られるパフォーマンス上の利点はどれくらいですか? 最後にチェックしたときは、あるプロセスから別のプロセスへ、そして最終的にはディスクへ、最大で 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 を使用しているためプロファイルできません。カーネル時間は、アイドル時間とデータのコピーの組み合わせであり、他にはあまりないと思います。

助けてくれてありがとう!

4

2 に答える 2

7

物事を過度に複雑にしたり、間違ったことを最適化したりしていませんか?

おそらく。ソケットの使用PF_PACKETは、特殊なものにのみ使用されます。あなたはおそらく調べたいと思うでしょう

2 つのプロセスが同じマシン上にあることを検出する最も簡単な方法または最良の方法は何ですか?

この情報を単に「忘れる」ことはありません。

Linux はこれを自動的に行い、同じマシン上で実行されているプロセスを最適化しますか?

いいえ、自分で行う必要があります。

于 2011-12-28T21:18:13.000 に答える
2

TCP/IP と raw パケットのどちらを選択するかは、ゼロ コピーの問題よりもはるかに重要だと思います。信頼できるストリームベースの通信が必要な場合は、TCP/IP (つまり、AF_INET+PF_STREAM) が必要です。信頼できないパケットに信頼できるストリームを実装しようとするのは非常に複雑で、すでに完了しています。

@cnicutar が言うように、ゼロ コピーとファイルで TCP/IP を使用する最良の方法は、sendfile(2) と splice(2) です。これらなしでゼロコピーを楽しむ方法があると思います(データを直接ファイルにではなくメモリに読み込みたい場合)が、その方法がわかりません。

また、Centos はオープンソースなので、ソースをダウンロードしてコンパイルすると vmlinux ファイルを取得できます。

于 2012-01-01T09:16:41.547 に答える