Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. murf3ry

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    M
    • Profile
    • Following 0
    • Followers 0
    • Topics 2
    • Posts 4
    • Best 1
    • Groups 1

    murf3ry

    @murf3ry

    1
    Reputation
    9
    Profile views
    4
    Posts
    0
    Followers
    0
    Following
    Joined Last Online

    murf3ry Follow
    Starter

    Best posts made by murf3ry

    • JavaScript heap out of memory / Workaround

      Hallo zusammen,

      nachdem ich mehrere Stunden mich mit der Fehler Meldung "JavaScript heap out of memory" rumgeschlagen haben, möchte ich euch über einen Lösungansatz/Workaround zu diesem Fehler berichten.

      Der Hintergrund
      Es kann wie in meinem Fall vorkommen, dass ein Adapter dem vom System bzw. Nodejs vorgegeben Arbeitseicherspeicher überschreitet und mit dem Fehler "JavaScript heap out of memory" abbricht.

      Bei mir war das der Javascript Adapter, weil dieser immer ab einer Arbeitsspeicherauslasstung von 1200MB neugestartet ist (unabhängig vom ausgeführten Skript). Mit der Version 12 besitzt Nodejs die Memory Managemant Funktion (Garbage Collection Explained) die abhägig von der aktuellen Speichersystemauslastung dem auszuführenden Node Process/Adapter Speicher freigibt und diesen limitiert. Jetzt kann es in größeren Umgebung vorkommen, das dieser Wert schnell erreicht ist.

      Mit den führen Nodejs Versionen war es möglich das Speicherlimit über die System Variable (export NODE_OPTIONS=--max-old-space-size=2000) oder über den Zusatz des Parameters (--max-old-space-size=2048) zu erhöhen.
      Mit der Version Nodejs 12 ist das nur begrenzt möglich.
      Der Iobroker WebAdmin bietet zwar die Möglichkeit eine Arbeitspeicherlimit über den Experten Modus einzustellen (Instanzen ->Expertenmodus-> Ramlimit). Normalerweise steht dort kein Wert, was zu folge hat, dass Nodejs (GCE) die Speicherlimiterung übernimmt. Setzt man jedoch dort einen wert, so wird zwar der Parameter (--max-old-space-size=2048) bei ausführen des Adapter/Processes hinzugefüght, jedoch greif diese Anpassung nicht.

      Lösung/Workaround:
      man setzt den Parameter (--max-old-space-size=2048) im gesamten Iobroker hoch. Hier zu edtiert man die Systemctl Startconfig

      nano /lib/systemd/system/iobroker.service
      

      ersetzt den Eintrag

      Environment="NODE=$(which node)" 
      

      durch

      Environment="NODE=/usr/bin/node --max-old-space-size=2048"
      

      Systemctl Änderungen neu einlesen

      systemctl daemon-reload
      

      und IOBROKER neustarten

      iobroker restart
      

      Die Änderungen hat zur Folge, das der Parameter "--max-old-space-size=2048" nun auf jeden Adapter/ Process innerhalb des Iobrokers greift. Meine Vermutung ist, dass der Parameter nur dann greift, wen dieser vor und nicht nach der js Datei angegeben wird. z.B.

      node /path/adapter.js --max-old-space-size=2048 <<< bewirkt nichts (über den iobroker WebAdmin)

      node --max-old-space-size=2048 /path/adapter.js <<< funktioniert (über die systemctl Startconfig)

      Ich hoffe es hilf den einen oder anderen weiter und evtl. den Entwicklern der WebGUI.

      posted in Error/Bug
      M
      murf3ry

    Latest posts made by murf3ry

    • RE: JavaScript heap out of memory / Workaround

      Hi @oliverio

      im JS Adapter selbst, gibt es die Möglichkeit nicht gleich alle State mit zuladen, jedoch habe ich damit keinen guten Erfahrungen gemacht.

      Besonders spannend ist, dass man das ganze etwas schmaler machen kann, indem man den CompactModus nutzt.
      Interessant ist es für mehrere Javascript Instanzen, die zu einem einzigen Prozess werden und somit den Arbeitsspeicher teilen. Das Problem ist das man hier schneller ans Nodejs Memory Limit kommt.
      Mit der oben genannten Workaround sollte es evtl. funktionieren.

      Ich selber nutze diesen Modus jedoch nicht, da ich noch ausreichend Speicher habe (6 von 8GB in Verwendung ) und mir vorstellen kann, dass mit der Multihost Funktionalität man hier eingeschränkter ist.
      Trotzdem ist die Standardeinstellung von Nodejs12 der Meinung mich einschränken zu wollen 😠

      posted in Error/Bug
      M
      murf3ry
    • RE: JavaScript heap out of memory / Workaround

      Hallo @oliverio

      danke für deinen Hinweis. Ich werde meine Skripte anhand deines Artikel nochmal überprüfen. Meine Vermutung war Anfangs auch, dass eventuell ein Loop/Logik Fehler die Ursache dafür war. Normalerweise kann
      ich relativ schnell debuggen ob es Fehler gibt. Diesmal war es nicht so, vor allem weil die Skripte schon seit mehreren Monaten gut lief bzw. wieder seit 2 Tagen wieder läuft.

      Ich habe aktuell 17000 Objekte und eine 450MB großen Redis Datenbank. Somit lädt meine Javascript Instanz alle Datenpunkte in den Arbeitsspeicher und verbraucht ohne ein einziges Skript zu starten mindestens 450MB Arbeitsspeicher.
      Mit wachsender Datenstruktur werden die Javascript Instanzen zwangsläufig auch größer und bringt einen schneller an das Limit. Das Limit hängt auch immer davon ab, wie stark man das System ausreizt. Zudem kommt bei mir dazu, dass ich alle Schaltvorgänge aller meiner ca. 80 Geräte über Javascript ordne, vereinheitliche und über Queues sequentiell schalte um Funk-Eskalationen (besonders interessant bei 433MHZ etc.) zu vermeiden.

      Unabhängig von meinem Skript, konnte ich nachvollziehbar, dass die Iobroker WebAdmin Ramlimits nicht funktionieren und ggf. andere auch bescheid wissen sollten.

      posted in Error/Bug
      M
      murf3ry
    • JavaScript heap out of memory / Workaround

      Hallo zusammen,

      nachdem ich mehrere Stunden mich mit der Fehler Meldung "JavaScript heap out of memory" rumgeschlagen haben, möchte ich euch über einen Lösungansatz/Workaround zu diesem Fehler berichten.

      Der Hintergrund
      Es kann wie in meinem Fall vorkommen, dass ein Adapter dem vom System bzw. Nodejs vorgegeben Arbeitseicherspeicher überschreitet und mit dem Fehler "JavaScript heap out of memory" abbricht.

      Bei mir war das der Javascript Adapter, weil dieser immer ab einer Arbeitsspeicherauslasstung von 1200MB neugestartet ist (unabhängig vom ausgeführten Skript). Mit der Version 12 besitzt Nodejs die Memory Managemant Funktion (Garbage Collection Explained) die abhägig von der aktuellen Speichersystemauslastung dem auszuführenden Node Process/Adapter Speicher freigibt und diesen limitiert. Jetzt kann es in größeren Umgebung vorkommen, das dieser Wert schnell erreicht ist.

      Mit den führen Nodejs Versionen war es möglich das Speicherlimit über die System Variable (export NODE_OPTIONS=--max-old-space-size=2000) oder über den Zusatz des Parameters (--max-old-space-size=2048) zu erhöhen.
      Mit der Version Nodejs 12 ist das nur begrenzt möglich.
      Der Iobroker WebAdmin bietet zwar die Möglichkeit eine Arbeitspeicherlimit über den Experten Modus einzustellen (Instanzen ->Expertenmodus-> Ramlimit). Normalerweise steht dort kein Wert, was zu folge hat, dass Nodejs (GCE) die Speicherlimiterung übernimmt. Setzt man jedoch dort einen wert, so wird zwar der Parameter (--max-old-space-size=2048) bei ausführen des Adapter/Processes hinzugefüght, jedoch greif diese Anpassung nicht.

      Lösung/Workaround:
      man setzt den Parameter (--max-old-space-size=2048) im gesamten Iobroker hoch. Hier zu edtiert man die Systemctl Startconfig

      nano /lib/systemd/system/iobroker.service
      

      ersetzt den Eintrag

      Environment="NODE=$(which node)" 
      

      durch

      Environment="NODE=/usr/bin/node --max-old-space-size=2048"
      

      Systemctl Änderungen neu einlesen

      systemctl daemon-reload
      

      und IOBROKER neustarten

      iobroker restart
      

      Die Änderungen hat zur Folge, das der Parameter "--max-old-space-size=2048" nun auf jeden Adapter/ Process innerhalb des Iobrokers greift. Meine Vermutung ist, dass der Parameter nur dann greift, wen dieser vor und nicht nach der js Datei angegeben wird. z.B.

      node /path/adapter.js --max-old-space-size=2048 <<< bewirkt nichts (über den iobroker WebAdmin)

      node --max-old-space-size=2048 /path/adapter.js <<< funktioniert (über die systemctl Startconfig)

      Ich hoffe es hilf den einen oder anderen weiter und evtl. den Entwicklern der WebGUI.

      posted in Error/Bug
      M
      murf3ry
    • (BLE) Adapter Überwachte Dienste Ausnahme

      Hallo zusammen,

      es ist aktuell bei meiner Bluetooth Zahnbürste (Orab-B) nicht möglich beim Bluetooth Adapter nach Service characteristics als HEX Code oder der UUID zu filtern. Wenn ich die wildcard "*" wird der Datenpunkt wie gewünscht angelegt, werden aber auch ca. 3000 weitere Geräte innerhalb von 2 Wochen angelegt 😞 Leider verschickt die Zahnbürste keine Service Data Informationen, nach der vermutlich gefiltert wird. Die ich aber nicht brauche da ich mit den ManafactureData alle Informationen verwerten kann die ich benötige (Laufzeit, Stufe...). Ein MAC filter würde vermutlich das Problem lösen, ich kenne mich jedoch der Programmierung der Adapter nicht aus, sodass evtl. jemand von euch helfen könnte?

      Hier sieht man wie der Adapter ohne filter, ManafactureData auslesen kann.

      Unbenannt.png

      posted in Error/Bug
      M
      murf3ry
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo