NEWS
SOLVED [Gelöst] Speicherlecks im ioBroker?
-
@Chaot sagte in Speicherlecks im ioBroker?:
Aber warum hört der Effekt auf sobald ich mehr als 4 GB zuordne?
Gute Frage - erinnert mich an alte WIN Programme, die zu wenig Speicher monierten, obwohl so viel Speicher vorhanden war, dass diese Programme ihn wohl nicht adressieren konnten.
-
@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/ -
@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.
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. -
@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. -
-
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:~$
-
@LoxDUS
siehe meine Anmerkungen von oben.
RunLevel 3 fahren, node 12 sauber installieren. -
Werde das jetzt mal auf meinem "Backupsystem" ausprobieren. Melde mich wenn ich was neues habe...
-
@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. -
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:
also es sind ca. 66% freiartur@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
-
@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
-
@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.
-
@a200 Ja, in alten Zeiten war das mal die Faustregel. Mach ich aber bei Systemen mit mehr als 2GB RAM nicht mehr.
-
Hmmmm, habe den "default" Vorschlag bei der Installation von Linux gelassen.
Habe im Netz foglendes gefunden:
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
-
Zwischenstand nach ein paar Stunden:
Nur noch 61% frei
Also in ca. 3h von 66% auf 61%Mal sehen was morgen Früh noch so übrig ist....
-
@LoxDUS Ist doch gut wenn der RAM genutzt wird?!
Alles im grünen Bereich. -
@LoxDUS Im nächsten Test-Durchgang deaktiviert doch mal alle skripte im javascript adapter
und vergleiche dann. -
... und da sind es nur noch 24%
@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.
-
-
@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/ -
@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.
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