[Gelöst] Freezes in exaktem Minutenabstand - Bitte um Hilfe bei der Fehlersuche

Begonnen von hauwech, 18 Januar 2019, 10:19:23

Vorheriges Thema - Nächstes Thema

erdo_king

Ich bin um einiges flotter unterwegs:

time /opt/fhem/fhem.pl 7072 "jsonlist2 TYPE=.*:FILTER=state=..*:FILTER=model!=CCU-FHEM:FILTER=model!=ActionDetector "
real    0m1.991s
user    0m0.520s
sys     0m0.130s

time /opt/fhem/fhem.pl 7072 "jsonlist2 TYPE=.*:FILTER=state=..*:FILTER=model!=CCU-FHEM:FILTER=TYPE!=CCU-FHEM|ActionDetector|at|notify|statistics|DOIF"
real    0m1.834s
user    0m0.460s
sys     0m0.110s


Das sind natürlich keine Spitzenwerte, aber eine Verzögerung von unter 2 Sekunden sehe ich als akzeptabel an ;)
Ich muss mir mal anschauen welche alternativen es bei der Abfrage gibt und ggf. was neues basteln ...

Als Hardware kommt bei mir  übrigens ein Raspberry Pi 3 zum Einsatz...


Für dich eine kurzfristige Lösung:
Schieb das Plugin nach /usr/lib/check_mk_agent/plugins/600/ damit wird fhem nur noch alle 10 Minuten abgefragt (oder /900/ für alle 15min)

Solange man keine "echte" Überwachung macht die Zeitkritisch ist sollte das erstmal reichen.
Ich setze mein Plugin vor allem für Konfigurationsüberwachung, Geräteüberwachung und Graphen ein ;)

Wernieman

Bringt das eigentlich etwas, wenn Du anstatt fhem ein "telnet-Ersatz" wie nc nimmst?

also wie:
time echo "jsonlist2 TYPE=.*:FILTER=state=..*:FILTER=model!=CCU-FHEM:FILTER=model!=ActionDetector " | nc <fhem-server> 7072
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

hauwech

Hallo Wernieman,
das kommt im Schnitt auch auf über 4s:
real    0m4.365s
user    0m0.008s
sys     0m0.120s

Wenn ich den output (ohne time) in eine Datei pipe, kommt die auf 2.1MB mit 19.162 Zeilen.
Gruß Roland
Fhem auf Intel NUC11TNKi5+M2 NVMe+32GB RAM mit Ubuntu 22.04 LTS

hauwech

Am Ende bleibt für Installationen mit vielen devices wohl nur eine wie von Jörg angesprochene event-basierte Architektur, wo einzelne readings pro event gepusht werden. Aber da kann ich leider nix konkretes beitragen, nur gescheit daherreden. :-[

Gruß Roland
Fhem auf Intel NUC11TNKi5+M2 NVMe+32GB RAM mit Ubuntu 22.04 LTS

mumpitzstuff

Wenn das wirklich notwendig ist, dann würde ich die Daten erst mal non blocking generieren. Und im zweiten Schritt die Daten per telnet transferieren. Wenn ich das richtig verstanden habe, dann läuft ja momentan das sammeln der Daten blockierend ab. Eventuell kann man ja einfach dieses jsonlist Plugin um einen non blocking Modus erweitern?

erdo_king

der nonBlocking Mode wäre (für diesen Fall) natürlich schon die Beste Lösung ...
nc scheint echt schneller zu sein wie die direkte abfrage über fhem.pl... Interessant!

Ich verfolge aber aktuell einen anderen Ansatz, da könnt ihr mir vielleicht helfen.

Aktuell liefert die Abfrage DEUTLICH mehr Werte wie ausgewertet werden.
Das liegt schlicht daran, dass ich nicht weiß wie ich die Abfrage weiter Filtern kann.

Beispiel:
jsonlist2 TYPE=CUL_HM geht schneller wie jsonlist2 TYPE=.*
Wir sind zwar nur im Millisekundenbereich, aber schneller ist schneller ;)

Wie kann ich zB. die PossibleAttrs und die PossibleSets rausfiltern?
Im Grunde Interessieren mich hier an erster Stelle die Readings, Attributes und Internals (inkl. aller Channel!)

Vielleicht ist es auch Sinnvoll einzelne Reading auszunahmen, zB "RegL_*" bei HomeMatic-Devices ...


edit:
fhem:# /opt/fhem/fhem.pl 7072 "jsonlist2 TYPE=.*:FILTER=state=..*:FILTER=model!=CCU-FHEM:FILTER=TYPE!=CCU-FHEM|ActionDetector|at|notify|statistics|DOIF" > /tmp/1
fhem:# du -h /tmp/1
676K /tmp/1
fhem:# wc -l /tmp/1
6220 /tmp/1

justme1968

du kannst nur auf device ebene filtern.

normalerweise macht man die jsonlist2 anfrage nur ein mal beim starten und hängt sich dann an die events um alle änderungen mit zu bekommen

per telnet mit inform oder per web über longpoll oder websocket.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

erdo hat mich per PM aufgefordert hier Stellung zu nehmen:
ZitatJsonList2 wird per Telnet (bzw. über fhem.pl) abgesprochen und generiert Freezes von mehreren Sekunden.
Die gelieferte Datenmenge ist einfach gigantisch ...

jsonlist2 bietet als Option an, nur bestimmte Werte abzufragen, aber es gibt keine Option "alles, aber X,Y,Z nicht". Selbst damit wuerde man das Problem nur halbieren, aber nicht loesen.
Stattdessen sollte man, wie justme1968 das schreibt, jsonlist2 fuer alle Geraete nur selten aufrufen, und mit vernuenftigen Methoden auf dem Laufenden bleiben.

Zitatper telnet mit form oder per web über lingpoll oder websocket.
Typo: "per telnet mit inform oder per web ueber longpoll oder websocket."
P.S.: ueber wie viele Geraete und wieviel MB reden wir?

erdo_king

@rudolfkoenig: Danke für deine Stellungsname, ich weiß das Plugin ist hier nur indirekt Mitschuld ;)

Zitatjsonlist2 bietet als Option an, nur bestimmte Werte abzufragen, aber es gibt keine Option "alles, aber X,Y,Z nicht". Selbst damit wuerde man das Problem nur halbieren, aber nicht loesen.

Mein Problem:
ich weiß vorab nicht welche Geräte/Werte es gibt, im Grunde hole ich alle und Werte im Anschluss nur die Unterstützen aus.
Das hat den Vorteil, das auch bei (mir) unbekannten Geräten etliche Werte ausgewertet werden.

Beispiel ein Wassersensor aus einem Aquarium (habe ich nicht) würde mindestens die Temperatur auswerten und einen entsprechenden Graphen generieren ...

Ich könnte dem CheckMK-Agent-Plugin (im Grunde ein perl-Script) eine laaaaaange Liste aller abzufragenden Parameter mitgeben.
Allerdings ist das von der Wartung/Pflege her ein ziemlicher Aufwand und aus Versions-Gründen nicht erstrebenswert. Und ob das schneller läuft?

Um die Daten "live" abzufragen wäre im Grunde ein paralleler Deamon notwendig, was in meinen Augen ein zu hoher Aufwand ist, nur um ein paar Daten alle X Minuten zu holen.


ZitatP.S.: ueber wie viele Geraete und wieviel MB reden wir?



BEI MIR!

Größe: 676K
Zeilen:
Laufzeit: 1.66 Sekunden

Hinweis: Leider brauchen wir auch einige HomeMatic-Channel, da hier teilweise relevante Daten drin stehen...

time /opt/fhem/fhem.pl 7072 "jsonlist2 TYPE=.*:FILTER=state=..*:FILTER=model!=CCU-FHEM:FILTER=TYPE!=CCU-FHEM|ActionDetector|at|notify|statistics|DOIF" | grep 'TYPE":' | sort |uniq -c|sort -nr
     61       "TYPE": "CUL_HM",
     15       "TYPE": "dummy"
     11       "TYPE": "TRAFFIC",
      6       "TYPE": "LaCrosse",
      5       "TYPE": "Heating_Control"
      4       "TYPE": "ESPEasy",
      3       "TYPE": "XiaomiBTLESens",
      3       "TYPE": "PRESENCE"
      3       "TYPE": "FHEMWEB"
      3       "SUBTYPE": "device",
      2       "TYPE": "XBMC"
      2       "TYPE": "WifiLight"
      2       "TYPE": "telnet"
      2       "TYPE": "CUL",
      2       "TYPE": "Calendar"
      2       "TYPE": "ABFALL"
      2       "LEDTYPE": "White",
      1       "TYPE": "Verkehrsinfo",
      1       "TYPE": "UWZ",
      1       "TYPE": "telnet",
      1       "TYPE": "structure"
      1       "TYPE": "speedtest"
      1       "TYPE": "Revolt"
      1       "TYPE": "PROPLANTA",
      1       "TYPE": "MQTT_DEVICE"
      1       "TYPE": "MQTT",
      1       "TYPE": "LightScene"
      1       "TYPE": "JeeLink",
      1       "TYPE": "harmony",
      1       "TYPE": "FRITZBOX",
      1       "TYPE": "freezemon",
      1       "TYPE": "fakeRoku",
      1       "TYPE": "dash_dhcp"
      1       "TYPE": "Dashboard",
      1       "TYPE": "CUL_HM"
      1       "TYPE": "allowed",
      1       "SUBTYPE": "bridge",

real 0m1.666s
user 0m0.500s
sys 0m0.040s




@hauwech: kannst du dieselbe Auswertung bitte bei dir machen.

hauwech

Hallo erdo,

roland@fhem-nuc:~$ time /opt/fhem/fhem.pl 7072 "jsonlist2 TYPE=.*:FILTER=state=..*:FILTER=model!=CCU-FHEM:FILTER=TYPE!=CCU-FHEM|ActionDetector|at|notify|statistics|DOIF" | grep 'TYPE":' | sort |uniq -c|sort -nr
    156       "TYPE": "CUL_HM",
     60       "TYPE": "dummy"
     14       "TYPE": "HUEDevice",
      9       "TYPE": "fronthemDevice"
      8       "TYPE": "LaCrosse",
      7       "TYPE": "IT",
      5       "TYPE": "FHEMWEB"
      4       "TYPE": "structure"
      4       "TYPE": "SSCam",
      4       "TYPE": "sequence"
      4       "TYPE": "PRESENCE"
      4       "TYPE": "allowed",
      3       "TYPE": "ROOMMATE"
      3       "TYPE": "HMUARTLGW",
      3       "TYPE": "FHEMWEB",
      3       "TYPE": "CUL_HM"
      2       "TYPE": "telnet"
      2       "TYPE": "SSCamSTRM",
      2       "TYPE": "HMCCURPCPROC",
      2       "TYPE": "HMCCUDEV",
      2       "TYPE": "ENIGMA2",
      2       "TYPE": "DbRep",
      2       "TYPE": "CUL",
      1       "TYPE": "YAMAHA_AVR",
      1       "TYPE": "Weather"
      1       "TYPE": "Unifi",
      1       "TYPE": "Twilight",
      1       "TYPE": "telnet",
      1       "TYPE": "RESIDENTS"
      1       "TYPE": "RandomTimer"
      1       "TYPE": "PROPLANTA",
      1       "TYPE": "MQTT",
      1       "TYPE": "LightScene"
      1       "TYPE": "JeeLink",
      1       "TYPE": "HUEBridge",
      1       "TYPE": "holiday"
      1       "TYPE": "HMCCU",
      1       "TYPE": "harmony",
      1       "TYPE": "GEOFANCY"
      1       "TYPE": "freezemon",
      1       "TYPE": "FB_CALLMONITOR"
      1       "TYPE": "DbLog",
      1       "TYPE": "CALVIEW"
      1       "TYPE": "Calendar"
      1       "TYPE": "Astro",
      1       "TYPE": "Alarm",
      1       "TYPE": "ABFALL"

real    0m3.996s
user    0m0.268s
sys     0m0.048s

Mit echo "jsonlist2 TYPE=.*:FILTER=state=..*:FILTER=model!=CCU-FHEM:FILTER=model!=ActionDetector " | nc <fhem-server> 7072
komme ich wie in Beitrag #62 beschrieben:
ZitatWenn ich den output (ohne time) in eine Datei pipe, kommt die auf 2.1MB mit 19.162 Zeilen.

Gruß Roland
Fhem auf Intel NUC11TNKi5+M2 NVMe+32GB RAM mit Ubuntu 22.04 LTS

rudolfkoenig

ZitatBeispiel ein Wassersensor aus einem Aquarium (habe ich nicht) würde mindestens die Temperatur auswerten und einen entsprechenden Graphen generieren
Das regelmaessige Abfragen aller Werte ist ineffizient, und wenn die Installation groesser wird, dann merkt man das auch.
Das kann man (begrenzt) mit mehr Hardware oder (besser) mit intelligenteren Algorithmen loesen.
FHEM bietet etliche Moeglichkeiten fuer solche Algorithmen an (inform bei telnet, longpoll oder websocket bei HTTP).
Alternativ koennte die externe Instanz die Daten aus dem von FHEM geloggten Dateien oder Datenbanken lesen.


Zitatich weiß vorab nicht welche Geräte/Werte es gibt, im Grunde hole ich alle und Werte im Anschluss nur die Unterstützen aus.
[...]
... nur um ein paar Daten alle X Minuten zu holen.
Ich sehe hier einen gewissen Widerspruch.


erdo_king

Okay stand jetzt ich 3 Lösungsansätze...


  • Die auszulesende Attribute manuell in dem Agent pflegen und die Abfrage entsprechend einzuschränken.
  • Beim Start eine SQLite DB zu erstellen und diese per Live-Abfrage zu aktualisieren.
  • Beim Start alle Daten auszulesen, diese in einen Hash schreiben (passiert jetzt auch schon) und diesen Live zu aktualisieren.

Mein Favorit ist derzeit die 3, hab nur noch keine Idee wie ich das dem CheckMK Agent "unterjubel".
Vielleicht durch Manipulation der Caching-Dateien ...

2/3 sind im Grunde ein weiterer Deamon der parallel läuft ... Ich weiß noch nicht wie begeistert ich davon bin...

Frage: gibt es eine Möglichkeit, dass FHEM die Daten - aufbereitet - in eine Datei schreibt und dort regelmäßig aktualisiert?

rudolfkoenig


erdo_king

Im Grunde ja - aber ich fürchte dass die Konfiguration bei jedem Update meines Checks angepasst werden müsste -> und zwar manuell bei allen die ihn einsetzen ...




War nur ein Gedankengang - aktuell weiß ich selbst noch nicht wohin ich möchte  ::)

Mir ist noch der Ansatz eines eigenen FHEM-Modules eingefallen, dann könnte ich über das GitHub steuern welche Daten ausgeliefert werden... Das Ganze würde auf deinem jsonlist2 basieren und eben nur die für die Auswertung relevanten Daten liefern. Damit sollte die Auslieferung deutlich schneller gehen.

Das hätte den Vorteil, dass Leute die kein externes Modul einbinden möchten immer noch jsonlist2 einsetzen könnten - und dann mit der Laufzeit leben müssten ;)
Ich denke mit einem Freeze von unter einer Sekunde kann man ganz gut leben.

Wuppi68

oder eventuell das ganze via mqtt pushen und dann von check_mk wieder rausholen
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen