2012-12-13 3 views
6

Ich habe eine Anwendung, die in regelmäßigen Abständen eine Momentaufnahme seines aktuellen Zustandes senden muss, die derzeit von etwa 500.000 64-Byte-Nachrichten dargestellt werden. Ich habe Schwierigkeiten, diese vielen Nachrichten schnell und zuverlässig mit ZMQ zu senden und zu empfangen.Welche Einstellungen sind für ZMQ beim Senden von 500K 64-Byte-Nachrichten geeignet?

Ich habe PUB/SUB über Tcp verwendet, um dies zu tun, aber ich bin weder mit dem Muster noch dem Protokoll verbunden, solange es die Arbeit erledigt. In meinen Experimenten habe ich mich darauf konzentriert, mit der Sende- und Empfangs-Hochwassermarke herumzuspielen, Puffereinstellungen zu senden und zu empfangen und der Sendeschleife etwas Schlaf hinzuzufügen, um zu versuchen, sie ein wenig zu verlangsamen. Mit Einstellungen, die mir ziemlich großzügig erschienen (500K HWM, 10MB Puffer) und die nur eine Loopback-Verbindung verwenden, werden die Nachrichten nicht immer konsistent empfangen.

Ich interessiere mich für die entsprechenden Einstellungen für diese oder andere Tuning-Parameter, und im weiteren Sinne in Bezug auf die Auswirkungen verschiedener Einstellungen.

Einige weitere Details, die eine angemessene Antwort geben kann helfen:

  • Die Verteilung ist eine von vielen. Die erwartete Anzahl der Empfänger liegt bei 20.

  • Jede Nachricht stellt eine Reihe von Informationen über ein anderes Finanzinstrument dar, die alle gleichzeitig beobachtet werden. Meiner Meinung nach können Argumente dafür angeführt werden, beides zu einer einzigen großen Nachricht zusammenzufassen (die Menge aller Nachrichten besteht logischerweise aus einem kompletten Schnappschuss) und getrennt zu halten (Kunden können möglicherweise nur an einigen Instrumenten interessiert sein, und ich denke, das würde helfen) filtere sie leichter heraus).

  • Die beabsichtigte Häufigkeit von Nachrichten ist grundsätzlich nicht schneller als alle 20 Millisekunden und nicht langsamer als 5 Sekunden. Wo ich tatsächlich lande, hängt wahrscheinlich von Leistungsaspekten ab (dh wie schnell mein Server die Nachrichten tatsächlich pumpen kann und welche Art von Datenrate für die Kunden überwältigend sein würde).

+0

Was ist Ihre Verteilung? 1 zu 1, eins zu vielen, eins von vielen? Wie oft senden Sie den Status aus? Veröffentlichen Sie wirklich einen 32 MB-Zustand? Warum senden Sie es als 500K einzelne Nachrichten? Warum nicht eine Nachricht? Was ist die Begründung? Bitte erläutern Sie Ihren Anwendungsfall genauer, wenn Sie nützliche Antworten wünschen. –

Antwort

1

Nach einem Tag des Experimentierens halb zufällig mit verschiedenen Kombinationen, ich habe auf die folgenden vorläufigen Schlussfolgerungen kommen:

  • Schlaf-Anweisungen in der Schleife meine send Hinzufügen der Nachrichtenrate verbessert die Zuverlässigkeit zu begrenzen mit im Grunde jeder Reihe von Optionen.

  • Das Senden der 500.000 Nachrichten als Rahmen einer einzelnen Nachricht statt 500K einzelner Nachrichten verbessert die Zuverlässigkeit.

  • Die Verwendung von epgm anstelle des tcp-Protokolls ermöglicht einen höheren Durchsatz.

  • Bei epgm muss die Multicast-Rate-Option mit der gewünschten Nachrichtenrate übereinstimmen, die von den Sleep-Anweisungen erreicht wird.

  • Die Erhöhung der oberen Grenze und der Puffer erhöhen die Zuverlässigkeit, aber Sie müssen beide Einstellungen erhöhen, und zwar sowohl auf dem Client als auch auf dem Server. Wenn nicht alles in Kombination gemacht wird, hilft es nicht. Sie müssen diese ziemlich hoch setzen, um irgendeine Art von Zuverlässigkeit zu erreichen, die mit einzelnen Nachrichten läuft (im Gegensatz zu Frames einer einzelnen Nachricht). In diesem Fall habe ich keine guten Ergebnisse erhalten, bis die High Water Mark auf 1.000.000 und die Puffer auf 65 MB gesetzt wurden. (Doppelt so groß wie die Menge der Nachrichten, die ich senden wollte.) Das war viel höher, als ich instinktiv dachte, um es zu versuchen.Dieser Fall pausierte 5 Sekunden zwischen jeder Runde von 500K Nachrichten. Wenn ich das Intervall auf 1 Sekunde heruntersetzte, musste ich sie sogar noch höher schieben, auf das Vierfache eines einzelnen Nachrichtenstapels.

  • Mit epgm hilft die Einstellung des Wiederherstellungsintervalls nicht viel.

+0

Ich bin immer noch daran interessiert, besser zu verstehen, warum die Einstellungen so funktionieren, wie sie es tun. Ich würde eine Antwort in Erwägung ziehen, die gut erklären konnte, warum die verschiedenen Einstellungen meinem eigenen geholfen oder nicht überlegen waren. – scott

5

Lasst uns das brechen.

Erstens, warum die HWM nicht „arbeiten“:

Der HWM ist keine exakte Grenze, da interne Puffer gefüllt sind und durch zwei separate Threads geleert, und die Anzahl der verfügbaren Raum kann durchaus eine Verzögerung viel, wenn es viel Aktivität gibt. Die 0MQ zmq_setsockopt-Manpage sagt, "0MQ garantiert nicht, dass der Socket so viele ZMQ_SNDHWM-Nachrichten akzeptiert, und das tatsächliche Limit kann je nach Nachrichtenfluss auf dem Socket bis zu 60-70% niedriger sein."

Zweitens, warum sind Sie verlieren Nachrichten:

Wie Sie 0,5M Nachrichten (x 20) in die Puffer Steckdosen-Dump, Sie treffen zufällig die HWM und das Verhalten des PUB-Buchse dann ist die Nachrichten-Drop kann nicht in die Warteschlange gestellt werden.

Drittens, wie dieses Problem zu lösen:

Es gibt null Grund, den Staat in einzelne Nachrichten zu brechen; Die einzige Begründung dafür wäre, wenn der Staat nicht in die Erinnerung passt, was er leicht macht. Als Multipart senden (ZMQ_SNDMORE); Dies erstellt eine einzelne effektive Nachricht, die 1 Platz im ausgehenden Puffer benötigt.

Entfernen Sie dann Ihr 500K HWM-Limit und kehren Sie zum Standard (1000) zurück, was mehr als ausreichend ist.

Viertens, wie eine bessere Leistung zu erhalten:

Offensichtlich Profil und Ihre Verleger- und Abonnenten Code wie möglich zu verbessern; Dies sind die üblichen Engpässe.

Betrachten Sie dann eine Form der Komprimierung für die Nachricht, wenn sie spärlich ist und Sie dies ohne zu hohe CPU-Kosten tun können. Bei 20 Teilnehmern werden Sie normalerweise mehr vom Netzwerk-Overhead profitieren, als Sie von CPU-Kosten verlieren.

Schließlich, wenn Sie zu mehr Abonnenten wachsen und es ist ein kritisches System, schauen Sie sich PGM Multicast, die effektiv die Netzwerkkosten entfernen wird.

+0

Wenn ich den Status in separate Nachrichten brechen, dann kann ich sie auf der Client-Seite mit ZMQ_SUBSCRIBE filtern, richtig? Ist das möglich, wenn Sie sie als Rahmen innerhalb derselben Nachricht senden? – scott

Verwandte Themen