Großes MQTT-Topic läßt IPS abstürzen

Hallo,
Ich hatte es vor einigen Wochen schon mal gemeldet finde den Thread aber nicht wieder.

Der MQTT-Server in IPS 5.5 #793ff7db09e6 (Docker 5.5.90) hat arge Probleme mit großen Topics. Letztes Mal waren es wohl um die 60K und jetzt um die 72K. Wenn ich Zigbee2MQTT neu starte überträgt es einen Topic devices indem alle Geräte enthalten sind und dabei muss IPS wohl überfordert sein. Hatte heute 5 Neustarts.

Ideen?

Ralf

Auf welchem System läuft dein IPS? Das Problem liegt wahrscheinlich an einem Bug im Compiler (GCC) bzw. der Standardbibliothek (Regex) welche bei PHP Modulen genutzt wird. Zumindest hatten wir dazu schon einmal einen Problemfall und das war das Ergebnis der Analyse.

paresy

Das hatte wir bei meinem Modul (https://www.symcon.de/forum/threads/43053-Modul-IOTLinkService) mit den Screenshots, die per MQTT geschickt wurden.

Grüße,
Kai

Hi,
ich hatte es auch schon mal bei der Erstellung eines Graphen des Zigbee-Meshs bei mir. Es gibt 3 Arten von Graphen und bei einem gab es auch schon den Absturz. Dieses Problem kann man ja meiden indem das Problem nicht gestartet wird.

Das jetzt kann man kaum vermeiden denn neuere Versionen von Zigbee2MQTT verschicken anscheinend die komplette Datenbank per MQTT beim Start, d.h. Start Zigbee2MQTT = Absturz IPS.

Anbei der Logeintrag mit der gigantischen Payload.

System läuft im Docker auf einer Synology DS 415+. Könnte man mit gdb da helfen? Es sieht so aus als wenn ich es nach Lust und Laune reproduzieren kann.

Ralf

payload.zip (5.18 KB)

Leider lässt sich das Problem nicht so leicht lösen. Wir nutzen GCC auf Docker, Ubuntu, RPi und SymBox und die std::regex Bibliothek hat dort einen Bug, sodass diese bei entsprechend großem Payload einen Absturz provoziert.

Hier der Bugreport: 86164 – std::regex crashes when matching long lines

Wir könnten ggf. eine komplett andere RegEx Bibliothek nutzen, oder für alles auf CLANG (Würde ich bevorzugen :)) wechseln, aber beides ist nicht so ganz schnell gemacht.

paresy

Hi Paresy,
aktuelle Versionen von Zigbee2MQTT scheinen nach Bedarf anscheinend auch so mal die komplette Device-Liste dem MQTT-Server zukommen nicht nur beim Start. Heute bekam ich eine Mail das IPS neu gestartet wurde und ich habe im Z2M-Modul nachgesehen und genau zu diesem Zeitpunkt wurde ein riesiges Topic verschickt.

Gib es vielleicht eine Art BlackList mit der man bestimmte Pakete ignorieren kann?

Würde eine Größenbeschränkung helfen? Kann man vielleicht Pakete >25K ignorieren so das sie RegEX nicht angeboten werden? Die Pakete die zum Absturz führen werden bisher sowieso nicht ausgewertet.

Ralf

ich glaube das ich das selbe Problem haben. Wenn ich per MQTT mir den Standort schicke stürzt nach wenigen Minuten ( nach ca 100-200 Messages) der MQTT Dienst ab. Im Log finde ich leider nichts. Der Rest funktioniert noch aber ich kann dann auch nicht per „sudo /etc/init.d/symcon restart“ den Dienst neu starten da er bei dem Befehl hängen bleibt. Das einzige was hilft ist das ganze Raspi 4 zu rebooten.

Das fände ich auch ganz gut, wenn du diese Pakete allerdings im MQTT Server ignorierst, dann wäre eine Debug Meldung ganz cool.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Ein Fix bzw. Workaround kommt dafür zum nächsten Update. Wir werden die Pakete, sofern ein ReceiveFilter gesetzt ist, entsprechend verwerfen und eine Meldung im Debug Log vermerken, damit der Absturz nicht passiert, bis wir eine gute Lösung gefunden haben.

paresy

Hallo paresy,
danke für die Rückmeldung. Ich wollte schon die Version von Heute installieren weil da auch Änderungen bezüglich MQTT drin sind.

Ralf

Hi Paresy,
ich habe gesehen das es u.a. wegen der Abstürze ein Update gab. Dumme Frage wie setzt ich ein ReceiveDataFilter? Reicht es da einfach ReceiveDataFilter("*"); oder muss das im Modul stehen das MQTT benutzt?

Ralf

Die Frage ist schon falsch :smiley: Sofern du keinen gesetzt hast, triggert der Fehler nicht. Somit ist der beste Fall, dass du keinen hast, wenn du den nicht brauchst :slight_smile: (Und ja, es betrifft nur PHP Module)

paresy

Hi paresy,
scheint zu klappen danke. Ein großes Paket (ca. 80kB) hat IPS schon mal überlebt:-)

Ralf

Super. Vielen Dank für dein Feedback. Ich hoffe, dass in Zukunft der eigentliche Bug dahinter gelöst wird, sodass wir auf den Workaround verzichten können. :slight_smile:

paresy

Hi,
es erleichtert auf jeden Fall MEIN Leben:-) Ich hatte Freitag gerade 2 neue Zigbee2MQTT-Geräte angelernt und auch 2 Abstürze gehabt.

Ralf

Hallo paresy,

ich fuerchte wir haben hier ein groesseres Problem. Bei mir fingen auch die Schwierigkeiten an, als ich auf Zigbee2Mqtt v1.17 upgedatet habe. Dort wird jetzt nach jedem Neustart ein Topic zigbee2mqtt\bridge\devices verschickt. Im Payload werden dabei die Daten aller eingebundenen Zigbee-Devices übertragen. Bei vielen Geraeten (bei mir fast 30) kann das schon mal sehr gross werden. Bei mir stürzt jedes Mal der Symcon Service ab, wenn der integrierte MQTT-Server so ein Topic empfängt. Aber auch wenn ich eine Networkmap abrufe, stürzt Symcon ab. Gut, das zweite kann ich vermeiden, das erste nicht. Ich kann das uebrigens auch reproduzieren, in dem ich nicht aus Zigbee2Mqtt, sondern aus MQTT Explorer oder MQTTfx eine solche Payload an Symcon schicke.

Bei mir laeuft uebrigens IP-Symcon 5.5, Raspberry Pi, 15f964b68d15. Der Fehler scheint da auch noch drin zu sein. Da es mein produktives System betrifft ist das aergerlich.

Aktuell sehe ich für mich nur zwei Workarounds:

  • MQTT auf Symcon deaktivieren, was zwangslaeufig bedeutet, dass ich keine Zigbee-, Tasmota- und Shelly Geräte mehr über MQTT nutzen kann, für mich eigentlich nicht machbar.
  • Ueberwachung mit einem Cronjob (jede Minute), ob Symcon noch läuft und wenn nicht automatischer Neustart (mini bash script ist weiter unten dabei, wenn es jemand braucht). Für diese Holzhammermethode habe ich mich leider entscheiden müssen. Mir ist dabei auch die Gefahr bewusst, dass wichtige Aktionen in den möglichen bis zu mehreren Minuten Symconausfaellen nicht ablaufen werden. Es hilft mir zwar gerade, aber es ist keine echte Lösung.
    #!/bin/bash #Script to start symcon service if not running ps -ef | grep symcon | grep -v grep > /dev/null if [ $? != 0 ] then /etc/init.d/symcon start > /dev/null echo "`date -Is` IPS is down, trying to restart" >> /home/pi/IPS_restart.txt fi

Die aktuelle Situation könnte aber auch durch fehlerhafte oder falsch programmierte z.B. ESP8266-Devices entstehen. Z.B. wenn du in deiner gestrigen Demo (ich fand die neue Art der Veranstaltung echt cool, Lob an euch alle), so eine Monster Payload statt einem Temperaturwert verschickt hättest. Über von bösen Buben bewusst herbeigeführtes DOS möchte ich hier lieber nicht nachdenken.

Vom letzten Absturz habe ich noch eine Hardcopy vom MQTT Server Debug mitgeschickt.

Gruss
Bernd

Teste mal die aktuelle Beta Version von Symcon und berichte nochmal. :slight_smile:

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Wie Kai schon korrekt sagte - das Problem ist erst in der aktuellen Beta-Version gelöst :slight_smile:

paresy

Hi,
andere Möglichkeit wenn er Beta nicht mag wäre Zigbee2MQTT 1.15 denn die Version verschickt die Riesenpakete noch nicht.

Übrigens nicht nur beim Start von Zigbee2MQTT sondern auch bei erfolgreichem OTA-Update eines Gerätes, Pairing eine neuen Gerätes oder 1 von 3 Map-Aufträgen wird das Monsterpaket verschickt.

Map ist bei 1.17 ja kein Problem mehr da Zigbee2MQTT jetzt auch eine Oberfläche hat.

Ralf

Hallo paresy und Kai,

bei einem produktiven System auf beta zu gehen, macht mich immer sehr unruhig. Nicht dass mir jemand in der Firma meine ITIL Certificates abnehmen will, ohne CR geht da bei uns nix ;-). Gesagt getan, gibt wenig andere Möglichkeiten, habe es deshalb aufgespielt und ich kann den Absturz nicht mehr reproduzieren. Soweit scheint jetzt alles OK. Bin jetzt auf der 5.5-109, Raspberry Pi, 27.01.2021, 3dcf60d1362e. Wann ist denn stable geplant?

@paresy, noch eine Bitte, kannst Du den Titel „grroßes MQTT-Topic läßt IPS abstürzen“ irgendwie in „Großes MQTT-Topic läßt IPS abstürzen“ ändern. Die Headline schaut für mich etwas komisch aus, obwohl ich sonst keinen großen Wert auf Typos lege. Sorry dafür, so kurz vor dem geplanten Wechsel der Forensoftware (freue mich übrigens schon darauf).

Gruss
Bernd