Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Error/Bug
  4. [Gelöst] Speicherlecks im ioBroker?

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.4k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.0k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.5k

[Gelöst] Speicherlecks im ioBroker?

Geplant Angeheftet Gesperrt Verschoben Gelöst Error/Bug
speicherverbrauchadapter speicherverbrauch
51 Beiträge 10 Kommentatoren 4.9k Aufrufe 8 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Thomas BraunT Thomas Braun

    @LoxDUS

    free -h
    who -r
    node -v
    nodejs -v
    

    liefert?

    L Offline
    L Offline
    LoxDUS
    schrieb am zuletzt editiert von
    #15

    @Thomas-Braun

    artur@ioBroker2:~$ free -h
                  total        used        free      shared  buff/cache   available
    Mem:          3,8Gi       3,2Gi       420Mi       6,0Mi       184Mi       387Mi
    Swap:         3,9Gi        79Mi       3,9Gi
    artur@ioBroker2:~$ who -r
             Runlevel 5   2020-12-17 06:45
    artur@ioBroker2:~$ node -v
    v10.17.0
    artur@ioBroker2:~$ nodejs -v
    v10.17.0
    artur@ioBroker2:~$
    
    
    Thomas BraunT 1 Antwort Letzte Antwort
    0
    • L LoxDUS

      @Thomas-Braun

      artur@ioBroker2:~$ free -h
                    total        used        free      shared  buff/cache   available
      Mem:          3,8Gi       3,2Gi       420Mi       6,0Mi       184Mi       387Mi
      Swap:         3,9Gi        79Mi       3,9Gi
      artur@ioBroker2:~$ who -r
               Runlevel 5   2020-12-17 06:45
      artur@ioBroker2:~$ node -v
      v10.17.0
      artur@ioBroker2:~$ nodejs -v
      v10.17.0
      artur@ioBroker2:~$
      
      
      Thomas BraunT Online
      Thomas BraunT Online
      Thomas Braun
      Most Active
      schrieb am zuletzt editiert von
      #16

      @LoxDUS
      siehe meine Anmerkungen von oben.
      RunLevel 3 fahren, node 12 sauber installieren.

      Linux-Werkzeugkasten:
      https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
      NodeJS Fixer Skript:
      https://forum.iobroker.net/topic/68035/iob-node-fix-skript
      iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

      L 2 Antworten Letzte Antwort
      0
      • Thomas BraunT Thomas Braun

        @LoxDUS
        siehe meine Anmerkungen von oben.
        RunLevel 3 fahren, node 12 sauber installieren.

        L Offline
        L Offline
        LoxDUS
        schrieb am zuletzt editiert von
        #17

        @Thomas-Braun

        Werde das jetzt mal auf meinem "Backupsystem" ausprobieren. Melde mich wenn ich was neues habe...

        1 Antwort Letzte Antwort
        0
        • R Ritter

          Hallo,

          ich habe ioBroker unter Windows 10 auf einem NUC laufen mit 8GB RAM und es wird unter Instanzen das angezeigt:

          Datenträger verfügbar: 20.4 %, gesamte RAM-Nutzung: 817 MB / Frei: 5% = 439 MB [Host: NUC - 46 Prozesse]

          Auf dem NUC läuft nur ioBroker, ist das normal oder verschwindet da irgendwo etwas?

          K Offline
          K Offline
          klassisch
          Most Active
          schrieb am zuletzt editiert von
          #18

          @Ritter Bei Windows geht die Spangezeigte Speichernutzung immer rauf. Und irgendwann kommt der Garbage Collector oder sowas und räumt wieder auf. Dann gibt es wieder mehr freien Speicher udn das ganze Spiel beginnt von Neuem.
          Wenn Du keine sichtbaren Probleme hast, dann Lass Windows nur machen, das kann das schon. Mein ioBroker läuft sehr stabil unter Win 10. Habe den Info Adapter mittlerweile pausiert und mache mir einfach keine Sorgen mehr.

          1 Antwort Letzte Antwort
          0
          • Thomas BraunT Thomas Braun

            @LoxDUS
            siehe meine Anmerkungen von oben.
            RunLevel 3 fahren, node 12 sauber installieren.

            L Offline
            L Offline
            LoxDUS
            schrieb am zuletzt editiert von
            #19

            @Thomas-Braun

            Habe jetzt den Runlevel mit

             systemctl set-default multi-user.target
            

            auf das "alte" Runlevel 3 gestellt und nodejs geupdatet

            artur@ioBroker:~$ nodejs -v
            v12.20.0
            

            Der aktuelle Speicherverbrauch liegt laut ioBroker bei:
            11a3494f-88a6-485a-9336-4ef486e7b5c4-image.png
            also es sind ca. 66% frei

            artur@ioBroker:~$ free -m
                          total        used        free      shared  buff/cache   available
            Mem:           3885        1213        2189           6         482        2439
            Swap:          4027           0        4027
            artur@ioBroker:~$ who -r
                     Runlevel 3   2020-12-27 00:18
            artur@ioBroker:~$ node -v
            v12.20.0
            artur@ioBroker:~$ nodejs -v
            v12.20.0
            artur@ioBroker:~$
            

            Bin jetzt mal gespannt wie der Speicher morgen aussieht ;-)

            Thomas BraunT 1 Antwort Letzte Antwort
            0
            • L LoxDUS

              @Thomas-Braun

              Habe jetzt den Runlevel mit

               systemctl set-default multi-user.target
              

              auf das "alte" Runlevel 3 gestellt und nodejs geupdatet

              artur@ioBroker:~$ nodejs -v
              v12.20.0
              

              Der aktuelle Speicherverbrauch liegt laut ioBroker bei:
              11a3494f-88a6-485a-9336-4ef486e7b5c4-image.png
              also es sind ca. 66% frei

              artur@ioBroker:~$ free -m
                            total        used        free      shared  buff/cache   available
              Mem:           3885        1213        2189           6         482        2439
              Swap:          4027           0        4027
              artur@ioBroker:~$ who -r
                       Runlevel 3   2020-12-27 00:18
              artur@ioBroker:~$ node -v
              v12.20.0
              artur@ioBroker:~$ nodejs -v
              v12.20.0
              artur@ioBroker:~$
              

              Bin jetzt mal gespannt wie der Speicher morgen aussieht ;-)

              Thomas BraunT Online
              Thomas BraunT Online
              Thomas Braun
              Most Active
              schrieb am zuletzt editiert von
              #20

              @LoxDUS Warum ist dein swap file eigentlich so groß? Das ist ja mehr als dein RAM? Ich hab das bei mir auf 100 MB laufen:

              pi@raspberrypi:/opt/iobroker $ free -h
                            total        used        free      shared  buff/cache   available
              Mem:          3,8Gi       895Mi       2,1Gi       9,0Mi       783Mi       3,0Gi
              Swap:          99Mi          0B        99Mi
              

              Linux-Werkzeugkasten:
              https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
              NodeJS Fixer Skript:
              https://forum.iobroker.net/topic/68035/iob-node-fix-skript
              iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

              a200A L 2 Antworten Letzte Antwort
              0
              • Thomas BraunT Thomas Braun

                @LoxDUS Warum ist dein swap file eigentlich so groß? Das ist ja mehr als dein RAM? Ich hab das bei mir auf 100 MB laufen:

                pi@raspberrypi:/opt/iobroker $ free -h
                              total        used        free      shared  buff/cache   available
                Mem:          3,8Gi       895Mi       2,1Gi       9,0Mi       783Mi       3,0Gi
                Swap:          99Mi          0B        99Mi
                
                a200A Offline
                a200A Offline
                a200
                schrieb am zuletzt editiert von
                #21

                @Thomas-Braun sagte in Speicherlecks im ioBroker?:

                @LoxDUS Warum ist dein swap file eigentlich so groß? Das ist ja mehr als dein RAM? Ich hab das bei mir auf 100 MB laufen:

                Swap-Partition unter Linux sollte ca. doppelt so groß wie der RAM sein. Das ist doch der Sinn einer Swap-Partition, dass der Inhalt des RAM auf die Festplatte ausgelagert werden kann.

                IoBroker auf QNAP TS-451, Raspi und NUC

                Thomas BraunT 1 Antwort Letzte Antwort
                0
                • a200A a200

                  @Thomas-Braun sagte in Speicherlecks im ioBroker?:

                  @LoxDUS Warum ist dein swap file eigentlich so groß? Das ist ja mehr als dein RAM? Ich hab das bei mir auf 100 MB laufen:

                  Swap-Partition unter Linux sollte ca. doppelt so groß wie der RAM sein. Das ist doch der Sinn einer Swap-Partition, dass der Inhalt des RAM auf die Festplatte ausgelagert werden kann.

                  Thomas BraunT Online
                  Thomas BraunT Online
                  Thomas Braun
                  Most Active
                  schrieb am zuletzt editiert von
                  #22

                  @a200 Ja, in alten Zeiten war das mal die Faustregel. Mach ich aber bei Systemen mit mehr als 2GB RAM nicht mehr.

                  Linux-Werkzeugkasten:
                  https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
                  NodeJS Fixer Skript:
                  https://forum.iobroker.net/topic/68035/iob-node-fix-skript
                  iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

                  a200A 1 Antwort Letzte Antwort
                  0
                  • Thomas BraunT Thomas Braun

                    @LoxDUS Warum ist dein swap file eigentlich so groß? Das ist ja mehr als dein RAM? Ich hab das bei mir auf 100 MB laufen:

                    pi@raspberrypi:/opt/iobroker $ free -h
                                  total        used        free      shared  buff/cache   available
                    Mem:          3,8Gi       895Mi       2,1Gi       9,0Mi       783Mi       3,0Gi
                    Swap:          99Mi          0B        99Mi
                    
                    L Offline
                    L Offline
                    LoxDUS
                    schrieb am zuletzt editiert von LoxDUS
                    #23

                    @Thomas-Braun

                    Hmmmm, habe den "default" Vorschlag bei der Installation von Linux gelassen.
                    Habe im Netz foglendes gefunden:
                    1ffca436-8c01-4c07-a6c6-4d61b37607b7-image.png

                    Ich habe ein debian System am laufen:

                    artur@ioBroker:~$ uname -a
                    Linux ioBroker 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
                    
                    

                    Ich könnte das natürlich runter drehen. Wäre vielleicht auch für die verlöteten SSD Module nicht schlecht um eine längere Lebensdauer zu bekommen (ich weiß, ist eine Art Mythos :-) )

                    Ich schaue jetzt mal wie sich der freie Speicher verhält. Für die "Applikation" ioBroker dürfte der SWAP-Speicher ja aber keine Auswirkung haben, oder liege ich da falsch?

                    Viele Grüße,

                    Artur

                    L 1 Antwort Letzte Antwort
                    0
                    • L LoxDUS

                      @Thomas-Braun

                      Hmmmm, habe den "default" Vorschlag bei der Installation von Linux gelassen.
                      Habe im Netz foglendes gefunden:
                      1ffca436-8c01-4c07-a6c6-4d61b37607b7-image.png

                      Ich habe ein debian System am laufen:

                      artur@ioBroker:~$ uname -a
                      Linux ioBroker 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
                      
                      

                      Ich könnte das natürlich runter drehen. Wäre vielleicht auch für die verlöteten SSD Module nicht schlecht um eine längere Lebensdauer zu bekommen (ich weiß, ist eine Art Mythos :-) )

                      Ich schaue jetzt mal wie sich der freie Speicher verhält. Für die "Applikation" ioBroker dürfte der SWAP-Speicher ja aber keine Auswirkung haben, oder liege ich da falsch?

                      Viele Grüße,

                      Artur

                      L Offline
                      L Offline
                      LoxDUS
                      schrieb am zuletzt editiert von
                      #24

                      Zwischenstand nach ein paar Stunden:
                      6c59a465-c1c0-472e-9fc8-e83f99d987a7-image.png

                      Nur noch 61% frei :-(
                      Also in ca. 3h von 66% auf 61%

                      Mal sehen was morgen Früh noch so übrig ist....

                      Thomas BraunT OliverIOO 2 Antworten Letzte Antwort
                      0
                      • L LoxDUS

                        Zwischenstand nach ein paar Stunden:
                        6c59a465-c1c0-472e-9fc8-e83f99d987a7-image.png

                        Nur noch 61% frei :-(
                        Also in ca. 3h von 66% auf 61%

                        Mal sehen was morgen Früh noch so übrig ist....

                        Thomas BraunT Online
                        Thomas BraunT Online
                        Thomas Braun
                        Most Active
                        schrieb am zuletzt editiert von
                        #25

                        @LoxDUS Ist doch gut wenn der RAM genutzt wird?!
                        Alles im grünen Bereich.

                        Linux-Werkzeugkasten:
                        https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
                        NodeJS Fixer Skript:
                        https://forum.iobroker.net/topic/68035/iob-node-fix-skript
                        iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

                        1 Antwort Letzte Antwort
                        0
                        • L LoxDUS

                          Zwischenstand nach ein paar Stunden:
                          6c59a465-c1c0-472e-9fc8-e83f99d987a7-image.png

                          Nur noch 61% frei :-(
                          Also in ca. 3h von 66% auf 61%

                          Mal sehen was morgen Früh noch so übrig ist....

                          OliverIOO Offline
                          OliverIOO Offline
                          OliverIO
                          schrieb am zuletzt editiert von
                          #26

                          @LoxDUS Im nächsten Test-Durchgang deaktiviert doch mal alle skripte im javascript adapter
                          und vergleiche dann.

                          Meine Adapter und Widgets
                          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                          Links im Profil

                          L 1 Antwort Letzte Antwort
                          0
                          • OliverIOO OliverIO

                            @LoxDUS Im nächsten Test-Durchgang deaktiviert doch mal alle skripte im javascript adapter
                            und vergleiche dann.

                            L Offline
                            L Offline
                            LoxDUS
                            schrieb am zuletzt editiert von
                            #27

                            ... und da sind es nur noch 24%
                            334a0136-42bf-486c-9f4d-6c59ba5a042f-image.png

                            @OliverIO
                            "...deaktiviere mal alle skripte im javascript adapter..." - Ja, werde ich machen. Ich kann das aber nur einzeln machen weil das ganze Haus damit gesteuert wird und ohne bestimmte Skripte leider nicht mal mehr das Licht an und aus geschaltet werden kann.

                            Ich fange heute mal an die unwichtigen Skripte wie die ganzen Komfortfunktionen und nice to have skripte zu deaktivieren.

                            Bleibe am Ball und beriecht morgen wieder.

                            Thomas BraunT OliverIOO 2 Antworten Letzte Antwort
                            0
                            • L LoxDUS

                              ... und da sind es nur noch 24%
                              334a0136-42bf-486c-9f4d-6c59ba5a042f-image.png

                              @OliverIO
                              "...deaktiviere mal alle skripte im javascript adapter..." - Ja, werde ich machen. Ich kann das aber nur einzeln machen weil das ganze Haus damit gesteuert wird und ohne bestimmte Skripte leider nicht mal mehr das Licht an und aus geschaltet werden kann.

                              Ich fange heute mal an die unwichtigen Skripte wie die ganzen Komfortfunktionen und nice to have skripte zu deaktivieren.

                              Bleibe am Ball und beriecht morgen wieder.

                              Thomas BraunT Online
                              Thomas BraunT Online
                              Thomas Braun
                              Most Active
                              schrieb am zuletzt editiert von
                              #28

                              @LoxDUS

                              Schau mal mit

                              htop
                              

                              welcher Prozess da anwächst. Vemutlich der io.javascript

                              Linux-Werkzeugkasten:
                              https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
                              NodeJS Fixer Skript:
                              https://forum.iobroker.net/topic/68035/iob-node-fix-skript
                              iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

                              1 Antwort Letzte Antwort
                              0
                              • L LoxDUS

                                ... und da sind es nur noch 24%
                                334a0136-42bf-486c-9f4d-6c59ba5a042f-image.png

                                @OliverIO
                                "...deaktiviere mal alle skripte im javascript adapter..." - Ja, werde ich machen. Ich kann das aber nur einzeln machen weil das ganze Haus damit gesteuert wird und ohne bestimmte Skripte leider nicht mal mehr das Licht an und aus geschaltet werden kann.

                                Ich fange heute mal an die unwichtigen Skripte wie die ganzen Komfortfunktionen und nice to have skripte zu deaktivieren.

                                Bleibe am Ball und beriecht morgen wieder.

                                OliverIOO Offline
                                OliverIOO Offline
                                OliverIO
                                schrieb am zuletzt editiert von
                                #29

                                @LoxDUS
                                parallel kannst du mal den artikel lesen. insbesondere den abschnitt mit timers und callbacks.
                                evtl hast du da in deinen skripten etwas davon eingebaut.
                                https://auth0.com/blog/four-types-of-leaks-in-your-javascript-code-and-how-to-get-rid-of-them/

                                Meine Adapter und Widgets
                                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                Links im Profil

                                L 1 Antwort Letzte Antwort
                                0
                                • OliverIOO OliverIO

                                  @LoxDUS
                                  parallel kannst du mal den artikel lesen. insbesondere den abschnitt mit timers und callbacks.
                                  evtl hast du da in deinen skripten etwas davon eingebaut.
                                  https://auth0.com/blog/four-types-of-leaks-in-your-javascript-code-and-how-to-get-rid-of-them/

                                  L Offline
                                  L Offline
                                  LoxDUS
                                  schrieb am zuletzt editiert von
                                  #30

                                  @OliverIO
                                  habe mir den Artikel mal durchgelesen. Kann mir durchaus vorstellen das in meinem Code da einige Fälle enthalten sind die zutreffen. Sehe aber im Moment den Wald vor lauter Bäumen nicht mehr:

                                  Habe z.B. folgenden Code der den Ventilator im WC steuert.
                                  Über den Parameter t kann ich beim Aufrufen z.B. mitgeben ob der Aufruf von dem Bewegungsmelder im WC kommt.
                                  Über einen Dialog in der VIS, kann ich den Modus für den Ventilator einstellen: 0, 1, auto (siehe Zeile 5)

                                  
                                  var LTVentilatorGaesteWC; // Nachlauftimer für Ventilator
                                  function VentilatorWC(t)
                                  {   var sLichtDecke = getState(DE_K_LGAST_1).val;   // Deckenlampe WC
                                      var mVent = getState(MVentWC).val; // Modus für Ventilator
                                      var sVent = getState(DE_K_VGAST_1).val; // Status Ventilator
                                  
                                      switch(mVent)
                                      {   case 0:  // Ventilator AUS
                                              setState(DE_K_VGAST_1, false);
                                              clearTimeout(LTVentilatorGaesteWC); // Timer beenden
                                          break;
                                          case 1:  // Ventilator EIN
                                              setState(DE_K_VGAST_1, true);
                                              clearTimeout(LTVentilatorGaesteWC); // Timer beenden
                                          break;
                                          case 2:  // Ventilator Automatisch steuern
                                              if(sLichtDecke==true || t==2)
                                              {   setState(DE_K_VGAST_1, true); // Ventilator wird eingeschaltet sobald ein Licht eingeschaltet wird oder der Bewegungmelder schaltet
                                                  if(t!=2)
                                                  {   clearTimeout(LTVentilatorGaesteWC); // Timer beenden
                                                  } else
                                                  {   // Befehl kommt von Bewegungsmelder den Ventilator einzuschalten .. wird immer wieder neu getriggert (teilweise im Sekundenabstand je nachdem wieviel sich der Gast bewegt)
                                                      clearTimeout(LTVentilatorGaesteWC); // Timer beenden und anschließend neu setzen (solange jemand im WC soll der Ventilator laufen)
                                                      LTVentilatorGaesteWC = setTimeout(function(){setState(DE_K_VGAST_1, false)}, 360000); // Nach 6Minuten ausschalten
                                                  }
                                              } else
                                              {   if(sVent == true)  //Ist Ventilator an?
                                                  {   // Ventilator ist an und soll ausgeschaltet werden. Jetzt die Nachlaufzeit abwarten und dann ausschalten
                                                      LTVentilatorGaesteWC = setTimeout(function(){setState(DE_K_VGAST_1, false)}, 360000); // Nach 6Minuten ausschalten
                                                  }
                                              }
                                          break;
                                      }
                                  }
                                  
                                  

                                  Wenn ich mir den Code jetzt genauer ansehe, auch mit dem Hintergrundwissen aus dem von Dir verlinkten Artikel, vermute ich jetzt, dass die Callback-Funktion aus Zeile 25 und 30 doch jedes mal, wenn ich den Timer eigentlich neu Triggern möchte (mit der Kombination von clearTimeout() (Zeile 24) und setTimeout() (Zeile25) ) im Speicher bleibt und es keine Referenz mehr darauf gibt und mir so den Speicher voll donnere weil der bei der Garbage Collection nicht erfasst wird...?
                                  Zusätzlich habe ich gaaaaaanz viele const definitionen am Anfang jedes Scriptes um die ganzen Datenpunkte "oben" zu definieren (ähnlich #define in C-Dateien), Beispiel:

                                  ...
                                  const DG_K_LPHBE_2 = 'hm-rpc.1.OEQ0862609.15.STATE';
                                  const DG_K_LPHBE_1 = 'hm-rpc.1.OEQ0862609.16.STATE';
                                  const DG_K_SPHBE_1 = 'hm-rpc.1.OEQ0862609.19.STATE';
                                  ...
                                  

                                  klaut das viel Ram weil es "globale Variablen" sind? Kann ich mir nicht vorstellen...

                                  @Thomas-Braun
                                  Du hast glaube ich recht. mit htop konnte ich sehen das sich der io.javascript immer weiter aufgebaut hat. Ich habe jetzt mal einen Großteil der Scripte beendet und nur noch die lebensnotwendigen Scripte am laufen - und diese auch total runtergestript. Im Moment steht der javascript wert bei 205M.
                                  96a12df3-b04d-401c-98fb-5f04ccf52a98-image.png
                                  mal schauen wie er in ein paar Stunden aussieht.

                                  @Thomas-Braun und @OliverIO
                                  Ich befürchte fast das ihr recht habt mit den javascript. Ich komme aus der C-Programmierung für Microcontroller, JavaScript ist mir manchmal zu suspekt wie es mit Speicher und den ganzen Objekt-Jedöns umgeht.

                                  Vielen Dank schonmal,

                                  Artur

                                  OliverIOO 1 Antwort Letzte Antwort
                                  0
                                  • L LoxDUS

                                    @OliverIO
                                    habe mir den Artikel mal durchgelesen. Kann mir durchaus vorstellen das in meinem Code da einige Fälle enthalten sind die zutreffen. Sehe aber im Moment den Wald vor lauter Bäumen nicht mehr:

                                    Habe z.B. folgenden Code der den Ventilator im WC steuert.
                                    Über den Parameter t kann ich beim Aufrufen z.B. mitgeben ob der Aufruf von dem Bewegungsmelder im WC kommt.
                                    Über einen Dialog in der VIS, kann ich den Modus für den Ventilator einstellen: 0, 1, auto (siehe Zeile 5)

                                    
                                    var LTVentilatorGaesteWC; // Nachlauftimer für Ventilator
                                    function VentilatorWC(t)
                                    {   var sLichtDecke = getState(DE_K_LGAST_1).val;   // Deckenlampe WC
                                        var mVent = getState(MVentWC).val; // Modus für Ventilator
                                        var sVent = getState(DE_K_VGAST_1).val; // Status Ventilator
                                    
                                        switch(mVent)
                                        {   case 0:  // Ventilator AUS
                                                setState(DE_K_VGAST_1, false);
                                                clearTimeout(LTVentilatorGaesteWC); // Timer beenden
                                            break;
                                            case 1:  // Ventilator EIN
                                                setState(DE_K_VGAST_1, true);
                                                clearTimeout(LTVentilatorGaesteWC); // Timer beenden
                                            break;
                                            case 2:  // Ventilator Automatisch steuern
                                                if(sLichtDecke==true || t==2)
                                                {   setState(DE_K_VGAST_1, true); // Ventilator wird eingeschaltet sobald ein Licht eingeschaltet wird oder der Bewegungmelder schaltet
                                                    if(t!=2)
                                                    {   clearTimeout(LTVentilatorGaesteWC); // Timer beenden
                                                    } else
                                                    {   // Befehl kommt von Bewegungsmelder den Ventilator einzuschalten .. wird immer wieder neu getriggert (teilweise im Sekundenabstand je nachdem wieviel sich der Gast bewegt)
                                                        clearTimeout(LTVentilatorGaesteWC); // Timer beenden und anschließend neu setzen (solange jemand im WC soll der Ventilator laufen)
                                                        LTVentilatorGaesteWC = setTimeout(function(){setState(DE_K_VGAST_1, false)}, 360000); // Nach 6Minuten ausschalten
                                                    }
                                                } else
                                                {   if(sVent == true)  //Ist Ventilator an?
                                                    {   // Ventilator ist an und soll ausgeschaltet werden. Jetzt die Nachlaufzeit abwarten und dann ausschalten
                                                        LTVentilatorGaesteWC = setTimeout(function(){setState(DE_K_VGAST_1, false)}, 360000); // Nach 6Minuten ausschalten
                                                    }
                                                }
                                            break;
                                        }
                                    }
                                    
                                    

                                    Wenn ich mir den Code jetzt genauer ansehe, auch mit dem Hintergrundwissen aus dem von Dir verlinkten Artikel, vermute ich jetzt, dass die Callback-Funktion aus Zeile 25 und 30 doch jedes mal, wenn ich den Timer eigentlich neu Triggern möchte (mit der Kombination von clearTimeout() (Zeile 24) und setTimeout() (Zeile25) ) im Speicher bleibt und es keine Referenz mehr darauf gibt und mir so den Speicher voll donnere weil der bei der Garbage Collection nicht erfasst wird...?
                                    Zusätzlich habe ich gaaaaaanz viele const definitionen am Anfang jedes Scriptes um die ganzen Datenpunkte "oben" zu definieren (ähnlich #define in C-Dateien), Beispiel:

                                    ...
                                    const DG_K_LPHBE_2 = 'hm-rpc.1.OEQ0862609.15.STATE';
                                    const DG_K_LPHBE_1 = 'hm-rpc.1.OEQ0862609.16.STATE';
                                    const DG_K_SPHBE_1 = 'hm-rpc.1.OEQ0862609.19.STATE';
                                    ...
                                    

                                    klaut das viel Ram weil es "globale Variablen" sind? Kann ich mir nicht vorstellen...

                                    @Thomas-Braun
                                    Du hast glaube ich recht. mit htop konnte ich sehen das sich der io.javascript immer weiter aufgebaut hat. Ich habe jetzt mal einen Großteil der Scripte beendet und nur noch die lebensnotwendigen Scripte am laufen - und diese auch total runtergestript. Im Moment steht der javascript wert bei 205M.
                                    96a12df3-b04d-401c-98fb-5f04ccf52a98-image.png
                                    mal schauen wie er in ein paar Stunden aussieht.

                                    @Thomas-Braun und @OliverIO
                                    Ich befürchte fast das ihr recht habt mit den javascript. Ich komme aus der C-Programmierung für Microcontroller, JavaScript ist mir manchmal zu suspekt wie es mit Speicher und den ganzen Objekt-Jedöns umgeht.

                                    Vielen Dank schonmal,

                                    Artur

                                    OliverIOO Offline
                                    OliverIOO Offline
                                    OliverIO
                                    schrieb am zuletzt editiert von
                                    #31

                                    @LoxDUS
                                    Prüfe mal den Zweig bei case 2:
                                    Da stehen ja einige IFs.
                                    Das kommt mir so vor, als das es hier Fälle gibt, bei denen clearTimeout vor erneutem Setzen des Timers nicht aufgelöst wird. Speziell da wo sVent==true ist

                                    Meine Adapter und Widgets
                                    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                    Links im Profil

                                    L 1 Antwort Letzte Antwort
                                    0
                                    • OliverIOO OliverIO

                                      @LoxDUS
                                      Prüfe mal den Zweig bei case 2:
                                      Da stehen ja einige IFs.
                                      Das kommt mir so vor, als das es hier Fälle gibt, bei denen clearTimeout vor erneutem Setzen des Timers nicht aufgelöst wird. Speziell da wo sVent==true ist

                                      L Offline
                                      L Offline
                                      LoxDUS
                                      schrieb am zuletzt editiert von LoxDUS
                                      #32

                                      So, nach weiteren 6h sieht es so aus, dass der io.javascript sich nicht weiter vergrößert hat:
                                      9e97accc-8802-48a8-8c2f-f21bdce599fc-image.png
                                      Es ist ja aber auch nicht viel hier im Haus passiert während der Nacht.

                                      @OliverIO
                                      Du hast Recht. das ist alles Murks wie ich das gemacht habe. Ich werde mir heute mal einen besseren Code überlegen. Aber vielleicht darf ich auf Deinen Erfahrungsschatz mit Javascript und Timern zurück greifen (Ich habe ganz viele Timer im Einsatz)

                                      Wenn ich es richtig verstanden habe, so ist der gültigkeitsbereich eines Objektes (in diesem Fall eines Timer-Objektes), ähnlich wie in C oder C++, doch wenn ich es in einer Funktion deklariere nur solange die Funktion existiert (ausgeführt wird). Sobald die Funktion verlassen wird, kann der Speicher den das Objekt belegt freigegeben werden (es sein denn man baut sich die Callback-Funktionen. Die werden erst, z.B. bei Timern aufgerufen wenn der Timer abläuft und verlieren dann ihre Gültigkeit.
                                      Aus diesem Grund habe ich das Timer-Objekt ausserhalb der Funktionen definiert. Mein Verständnis ist nun das mit ClearTimeout() das zuvor erzeugte Timer-Objekt gelöscht wird und zwar auch die zuvor erzeugten Callback Funktionen. Wenn ich anschließend mit setTimeout() das Timer Objekt neu definiere , wird auch die Callback Funktion neu erstellt.
                                      Nehmen wir mal folgendes Konstrukt an:

                                      var TimerObjekt;
                                      function foo1()
                                      {  clearTimeout(TimerObjekt);
                                         TimerObjekt = setTimeout(function(){ 
                                                                   // Hier jetzt irgendwas machen
                                                                  var Ein_Neues_Callback_Objekt = 'Ich bin neu';
                                                                  }, 1000);
                                      }
                                      
                                      function foo2()
                                      {  clearTimeout(TimerObjekt);
                                      }
                                      

                                      wird, wenn ich zunächst foo1() aufrufe und innerhalb der 1000ms dann foo2() die zuvor definierte Callbackfunktion mit all seinen Child Objekten (Ein_Neues_Callback_Objekt) aufgeräumt und für den Garbage Collector sichtbar oder habe ich jetzt eine Leiche im "globalen" Speicher die als Speicherleck für immer da bleiben?

                                      Oder anders gefragt: Muss ich wenn ich einen Timer neu setzen will (also retriggern will) vorher ein clearTimeout() machen damit die "alte" Callback Funktion gelöscht wird?
                                      Edit 28.12.2020 Artur: Habe gerade unter
                                      Stack Overflow
                                      diesen Post gelesen. Demnach wird durch clearTimeout() die Callbackfunktion vom Stack gelöscht. Aber verschwinden dann auch die Referenzen der ganzen Child-Objekte in der Callback Funktion?

                                      Wie löst ihr das mit Timern eleganter?
                                      In Deinem Link mit den Speicherlecks steht ja sowas wie das man auch die einzelnen ChildObjekte löschen soll. In diesem Fall oben also Ein_Neues_Callback_Objekt.

                                      ... Oh man, ich weiß, das geht hier wahrscheinlich zu weit und ich werde mich mal ein wenig in Javascript Foren austoben.

                                      Vielen Dank,

                                      Artur

                                      L 1 Antwort Letzte Antwort
                                      0
                                      • L LoxDUS

                                        So, nach weiteren 6h sieht es so aus, dass der io.javascript sich nicht weiter vergrößert hat:
                                        9e97accc-8802-48a8-8c2f-f21bdce599fc-image.png
                                        Es ist ja aber auch nicht viel hier im Haus passiert während der Nacht.

                                        @OliverIO
                                        Du hast Recht. das ist alles Murks wie ich das gemacht habe. Ich werde mir heute mal einen besseren Code überlegen. Aber vielleicht darf ich auf Deinen Erfahrungsschatz mit Javascript und Timern zurück greifen (Ich habe ganz viele Timer im Einsatz)

                                        Wenn ich es richtig verstanden habe, so ist der gültigkeitsbereich eines Objektes (in diesem Fall eines Timer-Objektes), ähnlich wie in C oder C++, doch wenn ich es in einer Funktion deklariere nur solange die Funktion existiert (ausgeführt wird). Sobald die Funktion verlassen wird, kann der Speicher den das Objekt belegt freigegeben werden (es sein denn man baut sich die Callback-Funktionen. Die werden erst, z.B. bei Timern aufgerufen wenn der Timer abläuft und verlieren dann ihre Gültigkeit.
                                        Aus diesem Grund habe ich das Timer-Objekt ausserhalb der Funktionen definiert. Mein Verständnis ist nun das mit ClearTimeout() das zuvor erzeugte Timer-Objekt gelöscht wird und zwar auch die zuvor erzeugten Callback Funktionen. Wenn ich anschließend mit setTimeout() das Timer Objekt neu definiere , wird auch die Callback Funktion neu erstellt.
                                        Nehmen wir mal folgendes Konstrukt an:

                                        var TimerObjekt;
                                        function foo1()
                                        {  clearTimeout(TimerObjekt);
                                           TimerObjekt = setTimeout(function(){ 
                                                                     // Hier jetzt irgendwas machen
                                                                    var Ein_Neues_Callback_Objekt = 'Ich bin neu';
                                                                    }, 1000);
                                        }
                                        
                                        function foo2()
                                        {  clearTimeout(TimerObjekt);
                                        }
                                        

                                        wird, wenn ich zunächst foo1() aufrufe und innerhalb der 1000ms dann foo2() die zuvor definierte Callbackfunktion mit all seinen Child Objekten (Ein_Neues_Callback_Objekt) aufgeräumt und für den Garbage Collector sichtbar oder habe ich jetzt eine Leiche im "globalen" Speicher die als Speicherleck für immer da bleiben?

                                        Oder anders gefragt: Muss ich wenn ich einen Timer neu setzen will (also retriggern will) vorher ein clearTimeout() machen damit die "alte" Callback Funktion gelöscht wird?
                                        Edit 28.12.2020 Artur: Habe gerade unter
                                        Stack Overflow
                                        diesen Post gelesen. Demnach wird durch clearTimeout() die Callbackfunktion vom Stack gelöscht. Aber verschwinden dann auch die Referenzen der ganzen Child-Objekte in der Callback Funktion?

                                        Wie löst ihr das mit Timern eleganter?
                                        In Deinem Link mit den Speicherlecks steht ja sowas wie das man auch die einzelnen ChildObjekte löschen soll. In diesem Fall oben also Ein_Neues_Callback_Objekt.

                                        ... Oh man, ich weiß, das geht hier wahrscheinlich zu weit und ich werde mich mal ein wenig in Javascript Foren austoben.

                                        Vielen Dank,

                                        Artur

                                        L Offline
                                        L Offline
                                        LoxDUS
                                        schrieb am zuletzt editiert von
                                        #33

                                        Erst mal vielen Dank an @Thomas-Braun und @OliverIO !
                                        Meine Speicherlecks kommen sicherlich aus meinen Javascript Programmen.
                                        So wie ich es jetzt verstehe ist/war das Problem das die Speicherlecks durch die z.T. fehlerhafte Nutzung von Timer Funktionen entstehen. Es werden Objekte erzeugt die plötzlich keine Referenz mehr haben und auch durch den Garbagne Collector nicht gefunden werden. Dadurch wird immer mehr Speicher verbraucht. Aktuell sieht es "normal aus"
                                        fb0add06-9372-4dba-a7e1-f9c7000716aa-image.png
                                        Ca. in der Mitte des Diagramms bin ich auf mein "Fallbacksystem" mit den zusätzlichen Einstellungen die mir @Thomas-Braun empfohlen hat (Runlevel ändern) umgezogen ca. 11Uhr. Da sich der Speicherverbrauch aber trotzdem gesteigert hat (Man sieht das an der roten Linie (io.Javascript) dort versucht der garbage Collector ein paar mal aufzuräumen) habe ich dann um ca. 0:00Uhr viele meiner Javascript Programm gestoppt. Seit dem Zeitpunkt ist es recht ruhig in dem Javascript-Instanzen geworden (schöne glatte Linie). über "htop" sehe ich das sich der io.Javascript Prozess nicht mehr Speicher klaut und stabil ist. Das System ist jetzt seit einigen Stunden bei ca. 26% freiem Speicher :-) :

                                        Ich werde später ioBroker nochmal neu durchstarten und dann Schritt für Schritt die ganzen Javascripte nach möglichen Speicherlecks durchforsten und korrigieren.

                                        Vielleicht noch eine letzte Frage:
                                        Wie löst ihr das in euren Programmen wenn ihr retriggerbare Timer für z.B. Lichter im Treppenhaus die nach einer gewissen Zeit wieder ausgehen sollen, aber immer wieder neu getriggert werden sollen?

                                        Vielen Dank nachmal an alle Mitwirkenden.

                                        Artur

                                        K OliverIOO 2 Antworten Letzte Antwort
                                        0
                                        • L LoxDUS

                                          Erst mal vielen Dank an @Thomas-Braun und @OliverIO !
                                          Meine Speicherlecks kommen sicherlich aus meinen Javascript Programmen.
                                          So wie ich es jetzt verstehe ist/war das Problem das die Speicherlecks durch die z.T. fehlerhafte Nutzung von Timer Funktionen entstehen. Es werden Objekte erzeugt die plötzlich keine Referenz mehr haben und auch durch den Garbagne Collector nicht gefunden werden. Dadurch wird immer mehr Speicher verbraucht. Aktuell sieht es "normal aus"
                                          fb0add06-9372-4dba-a7e1-f9c7000716aa-image.png
                                          Ca. in der Mitte des Diagramms bin ich auf mein "Fallbacksystem" mit den zusätzlichen Einstellungen die mir @Thomas-Braun empfohlen hat (Runlevel ändern) umgezogen ca. 11Uhr. Da sich der Speicherverbrauch aber trotzdem gesteigert hat (Man sieht das an der roten Linie (io.Javascript) dort versucht der garbage Collector ein paar mal aufzuräumen) habe ich dann um ca. 0:00Uhr viele meiner Javascript Programm gestoppt. Seit dem Zeitpunkt ist es recht ruhig in dem Javascript-Instanzen geworden (schöne glatte Linie). über "htop" sehe ich das sich der io.Javascript Prozess nicht mehr Speicher klaut und stabil ist. Das System ist jetzt seit einigen Stunden bei ca. 26% freiem Speicher :-) :

                                          Ich werde später ioBroker nochmal neu durchstarten und dann Schritt für Schritt die ganzen Javascripte nach möglichen Speicherlecks durchforsten und korrigieren.

                                          Vielleicht noch eine letzte Frage:
                                          Wie löst ihr das in euren Programmen wenn ihr retriggerbare Timer für z.B. Lichter im Treppenhaus die nach einer gewissen Zeit wieder ausgehen sollen, aber immer wieder neu getriggert werden sollen?

                                          Vielen Dank nachmal an alle Mitwirkenden.

                                          Artur

                                          K Offline
                                          K Offline
                                          klassisch
                                          Most Active
                                          schrieb am zuletzt editiert von klassisch
                                          #34

                                          @LoxDUS sagte in Speicherlecks im ioBroker?:

                                          Wie löst ihr das in euren Programmen wenn ihr retriggerbare Timer für z.B. Lichter im Treppenhaus die nach einer gewissen Zeit wieder ausgehen sollen, aber immer wieder neu getriggert werden sollen?

                                          1. Die direkte Antwort wird Dir nicht gefallen: Ich nutze das z.B. in der Küche mit Retriggerung durch einen Bewegungsmelder.
                                            Aber da habe ich einen Shelly Schalter verbaut und bürde diesem die Timeraufgabe auf. Der wird so konfiguriert, daß er nach x Minuten ausgeht. Wird Bewegung erkannt, dann sende ich ihm wieder ein Einschaltsignal. Das geht bei den Shelly gut, weil WiFi und damit spielt der Traffic (häufiges "unnötiges" Einschalten) keine so große Rolle. Bei Homematic wäre das nicht so gut.
                                            Edit: Dieser Teil der antwort mag lieblos klingen, ist aber so nicht gemeint. Ansteuerbare Aktoren haben meist eine auto-timout Funktion und die wird dann auch generell genutzt. Und wenn sie auf z.B. 8h gesetzt wird. Schadensbegrenung bei vergessenen Lichtern.

                                          2. Die folgende Antwort geht eher in die von Dir intendierte Richtung:
                                            Wo ich keine HW-Unterstützung habe, verwende ich etliche Watchdogs, all nach dem Strickmuster von @paul53 siehe dort: https://forum.iobroker.net/topic/8961/watchdog-fuer-sensoren-in-js-millis-odertimer-gesucht/2

                                          L 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          249

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe