TCPソケットの代わりにPOSIXメッセージキューを使用する-“接続”を確立する方法
-
03-07-2019 - |
質問
現在、TCPを介して通信するクライアントプログラムとサーバープログラムがあります。代わりにPOSIXメッセージキューを使用しようとしています(もちろん、クライアントとサーバーが同じマシン上にある場合)。私の希望は、それがパフォーマンスを改善することです(具体的にはレイテンシーの短縮による)。
ほとんどの作業は完了しましたが、1つのことについてはわかりません。「接続」を確立する方法です。サーバーは複数のクライアントからの接続を同時に受け入れるため、TCP接続確立プロセスを次のようにエミュレートしたいと思います。
- サーバーは、既知の名前でキューを開き、それから連続的に読み取ります(TCPと同様に
select(2)
を使用できます)。 - クライアントは3つのキューを開きます。2つは任意の名前(衝突を避けるためのPIDなどの一意性を含む)、もう1つはサーバーが使用する既知の名前です。
- クライアントが「接続」を投稿します;クライアントのキュー名を含むサーバーのキューへのメッセージ(1つはクライアントからサーバーへのトラフィック用に指定され、もう1つは逆に指定されます)。
- サーバーは、クライアントの接続メッセージで指定されたキューを開き、クライアントからサーバーへの読み取り(選択)を開始します。
- クライアントは、既知の名前でサーバーキューを閉じます。双方向通信は、クライアントによって指定された2つのキュー(各方向に1つ)を使用して進行します。
このスキームが一般的なTCP方式とどのように似ているかはおそらくわかるでしょう。それは偶然ではありません。ただし、知りたいのは:
- より良い方法を考えてもらえますか?
- メソッドに潜在的な問題がありますか?
- 同じマシンでTCPの代わりにメッセージキューを使用すると、実際にパフォーマンス(遅延)が改善される可能性についてなど、他に考えはありますか?
以前にPOSIXメッセージキューを使用したことがないことに注意してください(以前はIBM WebSphere MQを使用していましたが、それはかなり異なります)。プラットフォームはLinuxです。
解決 2
基本的に説明したとおり、いくつかの機能強化を加えて実装しました:
- ステップ2では、クライアントのPIDを組み込む代わりに、キュー名にGUIDを使用しました。
- ステップ4で、「承認」の送信を追加しました。サーバーからクライアントへのメッセージ。
- どちらかの側が通信を終了したい場合、「切断」を送信します。メッセージ。
ハンドシェイクはTCPよりも簡単ですが、十分なようです。
待ち時間については、はるかに優れています。同じマシンでTCPの代わりにPOSIXメッセージキューを使用すると、レイテンシが約75%減少します。私のメッセージはそれぞれ100バイトのオーダーです。
他のヒント
-
より良い方法を考えていただけますか?
おそらくfifo(別名名前付きパイプ)をご覧ください。これらはネットワークソケットに似ていますが、ローカルマシン用です。これらは単方向であるため、各方向に1つずつ、2つ作成する必要がある場合があります。あなたの質問には、この変更を具体的に行っているなぜの理由がありません。プロセス間通信にソケットを使用しても問題はありません。双方向、効率的、広くサポートされており、後でマシン間でプロセスを自由に分離できます。
-
メソッドに潜在的な問題がありますか?
System Vメッセージキューとfifo名前付きパイプはどちらもまったく問題ありません。 Fifoパイプは通常のパイプに似ているため、最小限のコード変更でread()およびwrite()できます。 System Vメッセージキューでは、データを構造体に配置し、msgsnd()を呼び出す必要があります。ただし、どちらのアプローチでも問題ありません。
-
同じマシンでTCPの代わりにメッセージキューを使用すると、実際にパフォーマンス(遅延)が改善される可能性についてなど、他に考えはありますか?
他の考えは、あなたが言ったように、各クライアントが一意の識別子を持つようにテクニックを開発する必要があるということです。 1つのアプローチは、渡される構造にpidを追加するか、最初に親/マスターと一意のIDをネゴシエートすることです。もう1つ注意すべきことは、System Vメッセージキューの利点は、「選択的」をリッスンすることです。理想的には、サーバーからすべてのクライアントに1つのキューを使用し、各クライアントが異なるメッセージを待機できるようにします。
どの技術があなたのソフトウェアで最も最適なスループットを提供するかについてはわかりません。 System Vメッセージキューを使用する価値はないかもしれませんが、あなただけがその決定を下すことができます。
Philluminati
posix MQとTCP / IPソケットのペアのパフォーマンスを比較しました。
デモプログラムには、書き込み用と読み取り用の2つのスレッドがあります。
結果として、posix MQの方が高速になります、
- MQ 460000 tps
- ソケットペア400000 tps
同様の問題に遭遇しました。リアルタイムアプリケーションを開発し、ソケット機能に似た遅延の少ないIPCテクニックが必要です。
POSIX-MQベースのソリューションとUNIXローカルソケットまたはTCPソケットのみを比較しましたか?
ありがとう
select()がメッセージキューで機能しない場合、どうしましたか? Sys VまたはPOSIXとは何ですか? PIDが一意であることが保証され、より小さなストレージ(整数)である場合、PIDルックアップテーブルへのGUIDの作成に余分な労力を費やすのはなぜですか?
/ blee /
異なるマシンにあるプログラムでIPCのメッセージキューを使用することもできます。そのような場合は、ZeroMQ( http: //www.zeromq.org )またはその他のメッセージキューAPI、それらを検討し、テストすることもお勧めします。