2010-05-18 20 views
6

Ich versuche, eine Echtzeit-Anwendung zu implementieren, die IPC über verschiedene Module beteiligt. Die Module führen eine datenintensive Verarbeitung durch. Ich benutze Message Queue als Backbone (Activemq) für IPC im Prototyp, was einfach ist (wenn ich bedenke, dass ich ein vollkommen neuer IPC bin), aber es ist sehr, sehr langsam.IPC-Geschwindigkeit und vergleichen

Hier ist meine Situation:

  • ich den IPC Teil isoliert haben, so dass ich es andere Möglichkeiten, in Zukunft ändern könnte.
  • Ich habe 3 Wochen, um eine andere schnellere Version zu implementieren. ;-(
  • sollte IPC schnell sein, aber auch vergleichsweise einfach

ich in verschiedene IPC Ansätze gesucht haben zu holen. Buchse, Rohr, gemeinsam genutzten Speicher jedoch habe ich keine Erfahrung in IPC und es ist definitiv nicht so, wie ich diese Demo in 3 Wochen ausfallen könnte ... Welche wird IPC den sicheren Weg mit

? starten

Dank. Lily

Antwort

4

gewesen, eine ähnliche Frage selbst gegenüber.

Ich habe Folgende Seiten sind hilfreich - IPC performance: Named Pipe vs Socket (insbesondere) und Sockets vs named pipes for local IPC on Windows?.

Es klingt wie der Konsens ist, dass Shared Memory ist der Weg zu gehen, wenn Sie wirklich über die Leistung besorgt sind, aber wenn das aktuelle System, das Sie haben, eine Nachrichtenwarteschlange ist, könnte es eine ... andere Struktur sein . Ein Sockel und/oder Named Pipe könnte einfacher zu implementieren sein, und wenn beide Ihre Spezifikationen erfüllen, dann sind Sie dort fertig.

3

Unter Windows können Sie WM_COPYDATA verwenden, eine spezielle Art von Shared Memory-basierten IPC. Dies ist eine alte, aber einfache Technik: "Prozess A" sendet eine Nachricht, die einen Zeiger auf einige Daten in ihrem Speicher enthält und wartet, bis "Prozess B" die Nachricht verarbeitet (Entschuldigung), z. erstellt eine lokale Kopie der Daten. Diese Methode ist ziemlich schnell und funktioniert auch mit der Windows 8 Developer Preview (siehe meine benchmark). Jede Art von Daten kann auf diese Weise transportiert werden, indem sie auf dem Sender serialisiert und auf der Empfängerseite deserialisiert wird. Es ist auch einfach, Sender- und Empfänger-Nachrichtenwarteschlangen zu implementieren, um die Kommunikation asynchron zu machen.

+0

nach Ihrem Benchmark, ich frage mich nur, warum Win7 hat so schlechte Leistung. – stanleyxu2005

+1

weil es ein Netbook mit einer relativ langsamen Atomkern CPU ist – kol

3

Check-out kann diese Blog-Post https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

Grundsätzlich vergleicht Enduro/X, die auf POSIX-Warteschlangen (Kernel-Warteschlangen IPC) im Vergleich zu ZeroMQ gebaut wird, die Nachrichten gleichzeitig auf mehreren unterschiedlichen Transportklassen liefern kann, inkl. tcp:// (Netzwerk-Sockets), ipc://, inproc://, pgm:// und epgm:// für Multicast.

Aus Diagrammen können Sie sehen, dass irgendwann bei größeren Datenpaketen Enduro/X auf Warteschlangen über die Sockets gewinnt.

Beide Systeme laufen gut mit ~ 400 000 Nachrichten pro Sekunde, aber mit 5 KB Nachrichten, Kernel-Warteschlangen laufen besser.

Source: https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

(Bildquelle: https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/)


UPDATE: Ein weiteres Update als Antwort auf unten Kommentar, ich Rerun Test tat ZeroMQ auf ipc:// zu laufen, sehen die Bild:

Source: https://publicwork.wordpress.com/2016/07/17/endurox-vs-zeromq/

Wie wir sehen, ist der ZeroMQ ipc:// besser, aber wieder in einigen Bereich zeigt Enduro/X die besseren Ergebnisse und dann wieder ZeroMQ übernimmt.

So könnte ich sagen, dass IPC-Auswahl hängt von der Arbeit, die Sie vorhaben zu tun.

Beachten Sie, dass ZeroMQ IPC auf POSIX-Pipes ausgeführt wird. Während Enduro/x auf POSIX-Warteschlangen läuft.

+1

Lassen Sie mich fragen, haben Sie bemerkt, ** der zitierte Test/Vergleich ** ist ** nicht verwenden ZeroMQ auf der gleichen Transportklasse (versucht zu vergleichen a ** 'tcp: //' ** bis ** 'ipc: //' **)? Wären Sie in der Lage, ** einen fairen Vergleich zwischen Apfel und Apfel ** zu liefern, wobei ** sowohl ** Enduro/X als auch ZeroMQ ** "IPC" ** verwenden? – user3666197

+1

Siehe oben, ich habe erneut getestet mit ipc: // –

+0

+1 für die Pflege. Wie würde Enduro/X in Szenarien arbeiten, in denen BLOBs in verteilten Systemen mit mehreren Transportklassen gemischt verarbeitet werden - 'tcp: //' (für Cluster-verteilte SIGs) + 'inproc: // '(für schnellste/niedrigste Latenz In-Prozess Message-Passing) + 'epgm: //' (für das endgültige Content-Streaming)? Wie funktioniert die Leistungsskalierung - nach dem Hinzufügen von 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 Peers unter einer bestimmten Anzahl von I/O-Threads (die '.Context()' Engine kann arbeiten) – user3666197