Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Error/Bug
    4. [Gelöst] Speicherlecks im ioBroker?

    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

    SOLVED [Gelöst] Speicherlecks im ioBroker?

    This topic has been deleted. Only users with topic management privileges can see it.
    • L
      LoxDUS @OliverIO last edited by

      @OliverIO
      Ich habe schon mehrfach versucht den javascript adapter neu zu starten. Wenn ich die Instanz beende erhöht sich der freie Speicher um ca. 4 bis 5% (von 7% auf 11%).
      Ich habe das heute gegen Moittag nochmal gemacht.
      1ceb8c6d-38bf-4836-a069-d6c8e75372f6-image.png
      In diesem Ausschnitt sieht man auch wie andere Adapter mit der Zeit immer mehr Speicher brauchen. Ich meine die Sägezahnkurve ist ja bei Java normal. Irgendwann schlägt der "Garbage-Collector" zu und räumt auf. ich habe aber das Gefühl das der nciht alles "aufgeräumt" bekommt.

      1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @LoxDUS last edited by

        @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 1 Reply Last reply Reply Quote 0
        • L
          LoxDUS @Chaot last edited by

          @Chaot
          ... hm, was mir noch einfällt: Viele ioBroker Instanzen laufen doch auch auf kleinen Raspberries mit z.T. nur 2GByte RAM. Mein Bekannt nutzt auch ioBroker mit dem gleichen NUC wie ich und der hat keinerlei Speicherprobleme.

          Thomas Braun 1 Reply Last reply Reply Quote 0
          • Thomas Braun
            Thomas Braun Most Active @LoxDUS last edited by Thomas Braun

            @LoxDUS

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

            liefert?

            L 1 Reply Last reply Reply Quote 0
            • L
              LoxDUS @Thomas Braun last edited by

              @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 Braun 1 Reply Last reply Reply Quote 0
              • Thomas Braun
                Thomas Braun Most Active @LoxDUS last edited by

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

                L 2 Replies Last reply Reply Quote 0
                • L
                  LoxDUS @Thomas Braun last edited by

                  @Thomas-Braun

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

                  1 Reply Last reply Reply Quote 0
                  • K
                    klassisch Most Active @Ritter last edited by

                    @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 Reply Last reply Reply Quote 0
                    • L
                      LoxDUS @Thomas Braun last edited by

                      @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 Braun 1 Reply Last reply Reply Quote 0
                      • Thomas Braun
                        Thomas Braun Most Active @LoxDUS last edited by

                        @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
                        
                        a200 L 2 Replies Last reply Reply Quote 0
                        • a200
                          a200 @Thomas Braun last edited by

                          @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 Braun 1 Reply Last reply Reply Quote 0
                          • Thomas Braun
                            Thomas Braun Most Active @a200 last edited by

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

                            a200 1 Reply Last reply Reply Quote 0
                            • L
                              LoxDUS @Thomas Braun last edited by 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 1 Reply Last reply Reply Quote 0
                              • L
                                LoxDUS @LoxDUS last edited by

                                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 Braun OliverIO 2 Replies Last reply Reply Quote 0
                                • Thomas Braun
                                  Thomas Braun Most Active @LoxDUS last edited by

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

                                  1 Reply Last reply Reply Quote 0
                                  • OliverIO
                                    OliverIO @LoxDUS last edited by

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

                                    L 1 Reply Last reply Reply Quote 0
                                    • L
                                      LoxDUS @OliverIO last edited by

                                      ... 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 Braun OliverIO 2 Replies Last reply Reply Quote 0
                                      • Thomas Braun
                                        Thomas Braun Most Active @LoxDUS last edited by

                                        @LoxDUS

                                        Schau mal mit

                                        htop
                                        

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

                                        1 Reply Last reply Reply Quote 0
                                        • OliverIO
                                          OliverIO @LoxDUS last edited by

                                          @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 1 Reply Last reply Reply Quote 0
                                          • L
                                            LoxDUS @OliverIO last edited by

                                            @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

                                            OliverIO 1 Reply Last reply Reply Quote 0
                                            • OliverIO
                                              OliverIO @LoxDUS last edited by

                                              @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 1 Reply Last reply Reply Quote 0
                                              • First post
                                                Last post

                                              Support us

                                              ioBroker
                                              Community Adapters
                                              Donate

                                              514
                                              Online

                                              31.8k
                                              Users

                                              79.9k
                                              Topics

                                              1.3m
                                              Posts

                                              adapter speicherverbrauch speicherverbrauch
                                              10
                                              51
                                              3386
                                              Loading More Posts
                                              • Oldest to Newest
                                              • Newest to Oldest
                                              • Most Votes
                                              Reply
                                              • Reply as topic
                                              Log in to reply
                                              Community
                                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                              The ioBroker Community 2014-2023
                                              logo