Frage

Ich habe Client- und Server-Programme, die jetzt über TCP kommunizieren. Ich versuche Verwendung von POSIX Message Queues statt (in Fällen, in denen der Client und Server auf der gleichen Maschine sind, natürlich). Meine Hoffnung ist, dass es die Leistung verbessern wird (und zwar über geringere Latenz).

Ich habe davon ausgearbeitet meisten, aber ich bin nicht sicher, über eine Sache: „Verbindung“, wie die etablieren Der Server akzeptiert Verbindungen von mehreren Clients gleichzeitig, so dass ich die TCP-Verbindung Prozess wie so etablieren zu emulieren versucht:

  1. Server öffnet eine Warteschlange mit einem bekannten Namen und liest daraus kontinuierlich (es select(2) wie bei TCP verwenden kann).
  2. Client öffnet drei Warteschlangen. Zwei mit beliebigen Namen (darunter auch einige Einzigartigkeit wie PID-Kollisionen zu vermeiden), und eine mit dem bekannten Namen vom Server verwendet
  3. Client sendet eine „connect“ Nachricht an die Warteschlange des Servers, einschließlich der Warteschlangennamen des Clients (eine ist bezeichnet für Client-Server-Datenverkehr und die andere für die Umkehrung).
  4. öffnen Server die genannten Warteschlangen in dem Connect-Nachricht des Clients und beginnt (Auswahl) zu lesen, von dem Client-zu-Server ein.
  5. Client schließt die Server-Warteschlange mit dem bekannten Namen. Zwei-Wege-Kommunikation schreitet mit den beiden von der Client mit dem Namen Warteschlangen (eine für jede Richtung).

Sie können sich wahrscheinlich sehen, wie dieses System mit der gemeinsamen TCP-Methode ähnlich ist, und das ist kein Zufall. Ich würde aber gerne wissen:

  1. Können Sie sich einen besseren Weg, es zu tun?
  2. Sehen Sie mögliche Probleme mit meiner Methode?
  3. anstelle von TCP-Warteschlangen auf der gleichen Maschine
  4. Haben Sie noch andere Gedanken haben, über die Wahrscheinlichkeit einschließlich der Nachricht unter Verwendung tatsächlich Leistung (Latenz) verbessern?

Beachten Sie, dass ich nicht POSIX-Nachrichtenwarteschlangen verwendet haben vor (ich benutze habe IBM WebSphere MQ eine Weile zurück, aber das ist etwas anders). Die Plattform ist Linux.

War es hilfreich?

Lösung 2

Ich landete es im Grunde der Umsetzung, wie ich beschrieben, mit einigen Verbesserungen:

  • In Schritt 2 I verwendet GUIDs für die Queue-Namen anstelle des Kunden PID enthält.
  • In Schritt 4 habe ich das Senden einer "accept" Nachricht vom Server zum Client.
  • Wenn auf beiden Seiten wünscht Kommunikation zu beenden, sendet er eine „disconnect“ -Meldung.

Der Handshaking ist einfacher als TCP, scheint aber ausreichend.

Wie für Latenz: es ist viel besser. Etwa 75% weniger Latenz POSIX-Nachrichtenwarteschlangen verwenden anstelle von TCP auf der gleichen Maschine. Meine Nachrichten sind in der Größenordnung von 100 Bytes je.

Andere Tipps

  1.   

    Können Sie sich einen besseren Weg, es zu tun?

    Vielleicht einen Blick auf fifos hat (auch bekannt als Named Pipes). Sie sind wie Netzwerk-Sockets aber für die lokale Maschine. Sie sind unidirektionale so müssen Sie möglicherweise zwei, für jede Richtung eine erstellen. Ihre Frage nicht fehlt aus irgendeinem Grund von Warum Sie sind speziell diese Änderung. Es ist nichts falsch mit Steckdosen für Prozess mit Kommunikation zu verarbeiten. Sie sind bi-direktional, effizient, breit abgestützte und geben Ihnen die Freiheit, später die Prozesse zwischen den Maschinen zu trennen.

  2.   

    Sehen Sie mögliche Probleme mit meiner Methode?

    System V Message Queues und Fifo Named Pipes sind beide absolut in Ordnung. Fifo-Rohre sind wie normale Rohre, so dass Sie lesen können () und () mit minimalen Änderungen am Code schreiben. System V Nachrichtenwarteschlangen erfordern, um die Daten in eine Struktur setzen und Aufrufe msgsnd (). Entweder Ansatz wäre jedoch in Ordnung sein.

  3.   

    Haben Sie noch andere Gedanken haben, darunter etwa die Wahrscheinlichkeit, dass Nachricht unter Verwendung von Warteschlangen anstelle von TCP auf der gleichen Maschine tatsächlich die Leistung verbessern (Latenz)?

    Meine andere Gedanken sind, dass, wie Sie gesagt, Sie brauchen eine Technik zu entwickeln, so dass jeder Kunde eine eindeutige Kennung hat. Ein Ansatz wäre die pid auf die Struktur, die Sie über geben hinzuzufügen, oder eine eindeutige ID mit den Eltern / Master am Anfang zu verhandeln. Die andere Sache zu beachten ist, dass der Nutzen von System V Message Queues sind, dass Sie für „selektiv“ Nachrichten abhören, so dass Sie idealerweise eine Warteschlange vom Server an alle Clients verwenden können, mit jedem Kunden für eine andere Nachricht zu warten.

    Ich habe keine Ahnung, über die Technik, die Ihnen die optimale Durchsatz in der Software gibt. Es könnte wirklich nicht wert sein System V Message Queues verwenden, aber nur können Sie diese Entscheidung treffen.

Philluminati

Ich vergleichen die Leistung von Posix MQ und ein Paar von TCP / IP-Sockets.

Das Demo-Programm hat zwei Threads eine zum Schreiben und der andere zum Lesen.

Das Ergebnis ist, dass Posix MQ ist schneller,

  • MQ 460000 tps
  • socket 400000 tps

ich getroffen habe ähnliches Problem, ich entwickeln Anwendung in Echtzeit und muß IPC-Technik mit ähnlich wie Steckdosen Funktionalität und minimaler Latenz.

Haben Sie nur Ihre POSIX-MQ-basierte Lösung mit UNIX lokalen Sockets oder TCP-Sockets verglichen?

Danke

Wie haben Sie dies tun, wenn select () funktioniert nicht auf Nachrichtenwarteschlangen? Was es Sys V oder POSIX? Warum nehmen Sie den zusätzlichen Aufwand bei der Erstellung GUID PID-Lookup-Tabelle, wenn PID garantiert eindeutig sein, und ist kleiner Speicher (integer)?

/ blee /

Sie können auch Message Queues für IPC in Programmen verwenden, die auf verschiedenen Maschinen befinden, in solchen Fällen können Sie verwenden ZeroMQ ( http: //www.zeromq.org ) oder andere Nachrichtenwarteschlange APIs, empfehle ich Ihnen auch, sie zu betrachten, und sie zu testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top