3

それぞれがサーバーに接続し、サーバーからデータを受信する複数のアプリプロセスがあります。多くの場合、接続されているサーバーと取得されているデータはプロセス間で重複しています。そのため、ネットワーク全体でデータが不必要に重複し、必要以上の接続が発生し(サーバーに負担がかかります)、データがアプリのメモリに冗長的に保存されることになります。

1つの解決策は、複数のアプリプロセスを1つのプロセスに結合することですが、ほとんどの場合、それらは実際には論理的に異なり、何年もの作業になる可能性があります。

残念ながら、レイテンシーは非常に重要であり、データの量は膨大です(1つのデータはそれほど大きくない場合がありますが、クライアントがリクエストを行うと、サーバーはデータの変更に応じて更新の高速ストリームを送信します。 20MB /秒。これらはすべて、可能な限り最短の遅延で要求元のアプリに提供する必要があります)。

頭に浮かぶ解決策は、アプリプロセスがデータを要求するローカルデーモンプロセスをコーディングすることです。デーモンは、適切なサーバーへの接続がすでに存在するかどうかを確認し、存在しない場合は接続を確立します。次に、データを取得し、共有メモリを使用して(遅延の懸念があるため、それ以外の場合はソケットを使用します)、要求元のアプリにデータを渡します。

冗長な接続のみを解決する短期的な簡単なアイデアは、unixドメインソケット(これはunix OSで実行されますが、可能な場合はクロスプラットフォームライブラリに固執することを好みます)を使用して、すべてのプロセスなので、単一の接続を共有します。これに関する問題はバッファを消費することです-私はすべてのプロセスがソケットを介して来るすべてを見るようにしたいです、そして私がこのアプローチで正しく理解するならば、ソケットで1つのプロセスを読み込むと他のプロセスが彼らの同じデータを見るのを防ぎます次の読み取り(共有記述子内のオフセットがバンプされます)。

4

2 に答える 2

3

ZeroMQ をご覧になることをお勧めします。これは、問題の解決に役立つ場合があります。20MB/s が非常に高いとは思いません... ZeroMQ で TCP トランスポートを使用するだけで、そのレベルのスループットを達成できるはずです。OpenPGM を使用した信頼できるマルチキャストなど、他のトランスポート メカニズムもサポートされています。トランスポート メカニズムとして UNIX パイプを追加する計画があります。

メッセージングは​​、おそらく共有メモリよりも安全で簡単です。特に、共有メモリの代わりにメッセージングを使用すると、サーバーのクラスター全体でアプリケーション コンポーネントを分割できます。ボトルネックの場所によっては、共有メモリよりもパフォーマンスが大幅に向上する可能性があります。

于 2009-09-30T22:58:35.600 に答える
2

共有メモリを介してデータを公開する専用サービスが最善の策だと思います。それに続くのは、WindowsではなくUnixバリアントをターゲットにしていることを除いて、名前付きパイプを介してデータをマルチキャストするサービスです。

別のオプションはUDPマルチキャストであり、データ複製はハードウェアまたはドライバーレベルで行われます。唯一の問題は、UDPデータ配信が正常であることが保証されておらず、配信がまったく保証されていないことです。

物理ソケットの共有はハックであり、回避する必要があると思います。デーモンに透過的に実行させたいことを実行するドライバーを実装することをお勧めします(たとえば、プロセスは、内部的にソケットがマップされていることを除いて、ソケットを通常のソケットと見なしていました単一のソケット。仮想ソケット間でデータを再ブロードキャストするためのロジックが存在していました。)残念ながら、データを正しく取得するための努力のレベルは重要であり、完了する時間が懸念される場合は、ソケットを共有することは実際には良いルートではありません。取る(ドライバーレベルで行われるか、ソケット記述子のクロスプロセスの共有などの他のハッキーな手段を介して行われるかにかかわらず)。

ソケットの共有は、プッシュのみの接続であることも前提としています。たとえば、アプリレベルでトラフィックネゴシエーションが発生していないことを前提としています(たとえば、データの要求やデータ受信の確認)。

完了するためのクイックパスは、BNCなどのプロジェクトを調べてコードを変換するか、一般的なアイデアをハイジャックして、必要なことを実行することです。すべてのデータレプリケーションでNIC(および関連するバッファ)を実行し、ハードウェアの制限に近づいている(またはドライバが貧弱である、および/またはTCPスタックの実装)すると、サーバーが停止する可能性があります。私が働いている場所では、データ複製タンクがドライバーレベルのギガビットエーテルカードであることがわかったので、前代未聞ではありません。

カーネルまたはハードウェア/ドライバーの変更により5年以内にサポートできなくなる可能性のあるものを導入せずに、プラットフォームに依存せず、パフォーマンスを維持したい場合は、共有メモリが最善の策です。

于 2009-09-30T16:29:30.750 に答える