Hallo zusammen,
ich habe ein Modul gebaut, welches die Regenradar-Rohdaten des DWD herunterlädt, rendert, als Bild ablegt und den lokalen Niederschlag in einer Variablen zur Verfügung stellt.
Soweit funktioniert alles seit 6 Monaten super. Seit dem das Modul in Betrieb ist fiel aber auf, dass die Werte von KNX-Komponenten immer mal wieder nicht aktuell sind - bzw Symcon keine Änderungen auf dem KNX-Bus mitbekommt.
Sobald ich das Grafikrendern abstelle, sind diese Aussetzer verschwunden.
Im Logfile findet sich während das Modul aktiv ist immer wieder nachfolgende Auffälligkeit:
31.08.2021 18:57:52 | 28376 | DEBUG | KNX Gateway | Getrennt auf Anfrage vom Gateway
31.08.2021 18:58:43 | 28376 | DEBUG | KNX Gateway | Stelle Verbindung wieder her...
31.08.2021 18:58:43 | 28376 | DEBUG | KNX Gateway | Verbinde...
31.08.2021 18:58:43 | 28376 | DEBUG | KNX Gateway | Verbundene ID=1
31.08.2021 19:00:50 | 28376 | DEBUG | KNX Gateway | Getrennt auf Anfrage vom Gateway
31.08.2021 19:01:34 | 28376 | DEBUG | KNX Gateway | Stelle Verbindung wieder her...
31.08.2021 19:01:34 | 28376 | DEBUG | KNX Gateway | Verbinde...
31.08.2021 19:01:34 | 28376 | DEBUG | KNX Gateway | Verbundene ID=1
31.08.2021 19:03:55 | 28376 | DEBUG | KNX Gateway | Getrennt auf Anfrage vom Gateway
31.08.2021 19:04:45 | 28376 | DEBUG | KNX Gateway | Stelle Verbindung wieder her...
31.08.2021 19:04:45 | 28376 | DEBUG | KNX Gateway | Verbinde...
31.08.2021 19:04:45 | 28376 | DEBUG | KNX Gateway | Verbundene ID=1
(Normalerweise tritt das Problem 1-2mal pro Stunde auf. Ich habe vier Module in Betrieb. Das Rendering erfolgt bei 3 Instanzen 1/h und meiner einer Instanz 1/5min. Nachfolgender Auszug ist mit grep KNX gefiltert und zeigt die Situation während des Stresstests heute Abend, der zur Reproduktion diente.)
Der PHP Code selbst beinhaltet keinerlei Interaktion mit dem KNX Bus. Das Gateway is ein KNX IP Router von Gira. Die Verbindung mit dem Laptop bleibt problemlos dauerhaft offen.
Das Skript erzeugt über ca. 30s hohe CPU Last. Mehrere Rendervorgänge gleichzeitig erzeugen Abstürze wegen OOM. Aus diesem Grund blockiere ich das gleichzeitige Rendern über eine Semaphore, welche durch ein Filesystem-Lock emuliert wird. Das heißt, das Skript macht vor Renderbeginn ein Datei auf und schießt diese nach Abschluss (in der finally-Sektion) wieder.
Das führt dazu, dass wenn mehrere Module gleichzeitig rendern möchten, diese aufeinander warten. Auch das funktioniert prima.
Das Problem lässt sich reproduzieren, indem ein Skript erstellt wird, welches CPU-Last für einige Sekunden erzeugt und den Filesystem-Lock aktiviert. Wenn dieses Skript dann mehrfach gestartet wird und nacheinander in verschiedenen PHP-Threads abgearbeitet wird, bricht zuverlässig die KNX-Verbindung ab.
Ich habe versuchsweise usleep
-commands in die Schleifen eingebaut, um die CPU-Last vom System zu nehmen. Diese liegt jetzt im Peak bei 70% auf einem Kern. Leider ohne Erfolg.
Habt ihr irgendwelche Ideen, warum die Verbindung zum KNX-Gateway abbricht, wenn 3/4 PHP Threads über mehrere Sekunden arbeiten? Aktuell ist die maximale Thread-Zahl 50.
System ist ein Raspi 4B mit Symcon 6. Das Problem tritt seit Symcon 5.1 auf. Allerdings habe ich zu diesem Zeitpunkt erst begonnen das Regenradar zu rendern. Insofern könnte es auch mit früheren Versionen dieses Problem geben.
Viele Grüße,
Patrick