Raspi Performance Probleme (--> Konsequenz: KNX Gateway Verbindungsabbrüche)

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

Ich konnte es weiter eingrenzen:
Das KNX-Problem ist nur eine Konsequenz daraus, dass das System sporadisch während Ausführung eines der Skripte sehr träge wird. htop bleibt hängen. vim via SSH hängt. Die Konsole verliert das WebSocket.
Schleierhaft bleibt leider warum. Den Nice-Level auf vorübergehend 10 im PHP-Skript zu setzen, schafft auch keine Abhilfe. Mit den File-Locks hat es nichts zu tun. RAM ist auch genug frei.

Warum der Raspi kurz massiv ausgelastet ist und anschließend wieder normal läuft, kann ich aktuell nicht nachvollziehen. Ich bin für jede Idee dankbar.

Das klingt definitiv nach einer Nachvollziehbaren Ursachen. Wenn das Gateway und Daten sendet und wir aber keine ACKs mehr schicken (weil scheinbar etwas komplett „hängt“) will das KNX Gateway irgendwann nicht mehr und initiiert einen Disconnect (bzw. benachrichtigt und eher darüber, dass es die Verbindung entsorgen wird)

Zur Ursache kann ich noch nicht so viel sagen - aber hast du mal versucht die Berechnung auszulagern und z.B. über einen Cron-Job auszuführen und dann nur die Ergebnisse in IP-Symcon einzusammeln?

paresy

Lösung nachfolgend, falls hier mal wieder jemand drüber stolpert.

Ich hatte die Skripte vorübergehend deaktiviert, was in den letzten Monaten zu deutlich selteneren Verbindungsabbrüchen geführt hat. Aber verschwunden waren sie nicht. Im TCP-Dump sieht man live ziemlich deutlich, dass der Raspi an sich nicht hängt (Pakete des Gateways werden live ohne Verzug aufgezeichnet), Symcon aber teilweise 3s nicht reagiert.

Vor drei Wochen bin ich auf einen Raspi 4B 8GB umgezogen, in der Hoffnung, dass tatsächlich die Systemlast ursächlich ist. (OS Update, Repartitionierung…) Situation blieb unverändert. Was mir dabei auffiel, war die bescheidene Schreibgeschwindigkeit auf der verwendeten SD-Karte (ca. 3MB/s am MacBook).

Daraufhin habe ich vor zwei Wochen ich die SD-Karte getauscht. Nun 50MB/s Schreibgeschwindigkeit. PROBLEM BEHOBEN. Seit 2 Wochen keinen einzigen Verbindungsabriss.

(Aufgrund der 8GB RAM rendert der Raspi jetzt auch 10 Wetterradarbilder gleichzeitig ohne Probleme.)

Patrick

Ich würde mich langfristig von einer SD-Karte verabschieden. Da gibt es auch für den Pi deutlich sicherere Löungen.

Gruß
Andreas