RegisterVariable bei großen Datenmengen in kurzer Zeit

Ich experimentiere gerade ein wenig mit der Auswertung eines seriellen Datenstroms. Dazu zerlege ich die Daten vom I/O via Cutter und leite sie an eine RegisterVariable weiter. Soweit so schön.

Nun kann es aber hin und wieder vorkommen, dass der I/O sehr viele Daten in kurzer Zeit empfängt. Viel bezieht sich jetzt weniger auf die absolute Datenmenge sondern viel mehr darauf, wie viele zu verarbeitende Datenblöcke in einem bestimmten Intervall eintreffen.

Nun stelle ich mir die Frage, wie die RegisterVariable damit umgeht, wenn schneller neue Daten reinkommen als das zugehörige Skript sie abarbeiten kann. Für den I/O und Splitter stellt das kein Problem dar. Die reichen die Daten ruck zuck an die RegisterVariable weiter und diese fängt dann an, das Skript mehrmals parallel aufzurufen und die Daten dann irgendwann zu buffern und nach und nach dem Skript zu servieren.

Mich würde nun interessieren, wie robust das ganze ist. Ab einem gewissen Punkt wird es ja kritisch werden, wenn die Daten längere Zeit schneller rein kommen als sie abgearbeitet werden können. Gibt es da seitens der RegisterVariablen irgendwelche Schutzmechanismen, die das System vor Überlast schützen? Oder macht die Instanz so lange weiter, bis nichts mehr geht?

Gibt es irgendwelche Konzepte, wie man mit solchen Situationen umgeht? Kann ich irgendwie steuern, dass ich bei zu vielen Daten temporär keine weiteren Daten mehr ans Skript weiterleite und die Verarbeitung erst wieder ab einer bestimmten Grenze starte?

Die Verwendung eines Buffers wird mir ja nicht helfen, da ich das Skript der RegisterVariablen ja trotzdem aufrufen muss, um den Buffer zu lesen/schreiben.

Die Frage ist im Moment noch eher theoretischer Natur. Da ich aber zeitweise 30-50 zu verarbeitende Datensätze pro Sekunde habe, würde ich gerne die Grenzen kennen und wie man sowas am besten händelt.

Ich habe mal testweise für 5 Sekunden 30 Datensätze pro Sekunde über den I/O empfangen und an die RegisterVariable gegeben. Dem Skript habe ich spaßeshalber eine Ausführungszeit von 500 ms je Aufruf verpasst. Dann sieht man schön, wie sich die RegisterVariable noch eine ganze Zeit lang nach dem Ende der letzten Datenlieferung mit der Abarbeitung beschäftigt. Da läuft dann immer 2-3 mal das Skript parallel, bis der Puffer der Instanz irgendwann leer ist.

Bei dem Test habe ich außer der hohen Latenz bei der Datenverarbeitung noch keine Probleme festgestellt. Ich würde trotzdem gerne die Grenzen der RegisterVariablen kennen und ob man sowas überhaupt sinnvoll damit bearbeiten kann.

Gruß
Slummi

1 „Gefällt mir“

Robust → Ja. Wir sammeln die Daten in einer Queue und wir arbeiten die nacheinander in der korrekten Reihenfolge ab. D.h. nicht parallel (sonst hättest du Probleme beim Zusammenstecken), sondern nacheinander. Das ganze ist auch darauf ausgelegt, dass es mal solche Bursts gibt.

Theoretisch, wenn du mehr Daten „rein“ bekommst als du verarbeiten kannst, hättest du auf lange Sicht ein Speicherleck und einen Absturz wegen RAM Mangels. Aber ich habe soeben einen Patch vorbereitet, den ich noch in die 6.3 einbringen werde, der die interne Queue auf 512kB Daten limitiert und danach den Puffer wegwirft und mit einer Fehlermeldung im Log quittiert, um genau dieses Speicherleck zu verhindern.

Somit Danke für die kritische Frage und ein potenzielles Problem weniger.

Ich empfehle die Daten über den Cutter zu „zerlegen“, damit du weniger Einzelpakete hast, die dann ins Skript weitergereicht werden müssen, sofern es geht.

Der Cutter ist gegen dieses Problem übrigens abgesichert und macht ab 64kB Daten im Puffer stress.

paresy

1 „Gefällt mir“

Ich teste jetzt seit einiger Zeit die RegisterVariable unter der 6.3 und sehe seit dem Fix einige Minuten nach jedem IPS-Start einmal die Fehlermeldung „Größe der Warteschlange ist über >512kb. Verwerfe!“.

So ganz verstehe ich das allerdings nicht. An die RegisterVariable schickt als einziges ein Cutter alle 20 Minuten einen Datensatz mit 31 Byte. Wieso kommt dann dieser Fehler?
Kann es sein, dass die Fehlemerldung jedes Mal generiert wird, wenn die Instanz erstmals Daten empfängt? Ich nutze in der RegisterVariable lediglich die Systemvariable, um die empfangenen Daten zu verarbeiten. Einen Puffer setze ich nicht ein. Da kann also eigentlich nichts überlaufen. Tut es ja auch im normalen Betrieb nicht. Immer nur nach Dienststart.

Ich muss mich da anschliessen.

Ich habe eine Registervariable, über die ich Daten von meiner Telefonanlage (3CX) bekomme, sobald ein Gespräch beendet wurde (Call-Data für eine Gesprächsliste) via ServerSocket.
Ziemlich alte Funktion, immer unproblematisch.
Mit Update auf IPS 6.3 wirf er bei jedem Reboot die o.g. Fehlermeldung

08.11.2022 17:53:22 | 25965 | ERROR   | Register Variable    | Größe der Warteschlange ist über >512kb. Verwerfe!

Zum einen ist da kein Gespräch, d.h. es kommen keine Daten. Zum anderen sind die Datenmengen viel zu klein, ein Datensatz sind vielleicht 200 Bytes.

Ich vermute hier eher ein Initialiserungs-/Reihenfolgeproblem.

Ist bei mir auch nach wie vor so. Nach jedem Neustart des Dienstes kommt nach einer Weile einmal die Fehlermeldung. Probleme verursacht das nicht und danach ist auch bis zum nächsten Neustart Ruhe.

Ja, eine Funktionseinschränkung habe ich auch nicht festgestellt, die Daten der Telefonanlage kommen einwandfrei und wie gewohnt durch.

Bei mir kommt unter V6.3 auch öfters die Fehlermeldung:
09.11.2022, 19:30:41 | Register Variable | Größe der Warteschlange ist über >512kb. Verwerfe!

Scheint aus verschiedenen RegisterVariablen zu kommen. Bei Auswertung USB-WDE1 kommen kaum Daten an.
Bei Tempest sind es etwas mehr aber doch keine >512kb.
Beim Fritz Callmonitor kommt die Meldung auch zwischendurch.

Bei mir seit dem heutigen Stable-Update auch die Fehlermeldung bei allen Registervariablen.

Gibt es da eine Lösung?
Oder muss ich einen Spezialschalter wieder aktivieren (habe noch nicht gesucht)?

Viele Grüße aus dem Unterallgäu
Harry

Jupp. Da fehlt eine saubere Initialisierung. Fix kommt zum nächsten Update.

paresy

1 „Gefällt mir“

Das passt. Ich bin zurück auf die vorherige Stable: Fehler weg

Viele Grüße aus dem Unterallgäu
Harry

Das ist purer Zufall, da die Variable nicht korrekt initialisiert wurde. D.h. beim nächsten Neustart kann es wieder passieren (muss aber nicht)

paresy

Ich hatte vor dem gestrigen Update überhaupt keine Probleme mit meinen verschiedenen Registervariablen (die Fehlermeldung kam jeweils für alle RegVars!) und Neustarts mache ich aus verschiedenen Gründen immer mal wieder. Für mich ist da schon ein klarer Zusammenhang gewesen und kein Zufall erkennbar.

Jetzt läuft die vorherige Stable-Version und die Fehler sind (auch nach dem dritten Neustart) bei allen RegVars weg.

Gruß Harry

Bei mir tritt der Fehler seit der ersten 6.3 auf, wo paresy die RegisterVariable erstmals angepasst hatte und zieht sich durch alle Folgeversionen durch.

Dann hatte ich wohl nur Glück. Ich bin am 07.11. auf die 6.3 gewechselt und war vom 8. bis 11. im Krankenhaus ohne IPS zu beachten.

Egal - der Fehler ist erkannt und wird zur nächsten Stable gefixt. Danke.

Gruß
Harry