NEWS
Ich würde so gerne, doch es klappt nicht
-
habs ergänzt
-
Hallo zusammen,
wäre mal an der Zeit, ein kleines Tutorial zum Thema Speicheroptimierung zu schreiben. Diese Daten verstecken sich zurzeit in vielen einzelnen Threads und sind somit nur schwer zu finden. Vielleicht kann das ja auch jemand in das Handbuch übernehmen. Ich hab da keinen Zugriff darauf.
ioBroker und alle Adapter basieren auf node.js, einer Entwicklung für Serverseitiges Javascript auf Basis der V8 Engine von Google.
Javascript ist eine interpretierende Sprache, bei der Variablen nicht explizit deklariert und freigegeben werden müssen. Die Bereinigung und Freigabe von Speicherbereichen erfolgt hier im Rahmen einer sogenannten Garbarge Collection. Diese arbeitet bei V8 nach dem Stop-The-World-Modell, d.h. für die Speicherbereinigung werden alle anderen Prozesse gestoppt und erst nach Abschluss der Speicherbereinigung wieder freigegeben.
Die aktuellen Versionen von V8 bereinigen per Default den nicht mehr benötigten Hauptspeicher erst, wenn 512 MB belegt wurden. Da bei ioBroker der js-controller, alle als Daemon laufende Adapter und node-red eigenständige node.js Prozesse sind, kann somit theoretisch jeder dieser Prozesse auf mehr als 512 MB anwachsen. Dies ist insbesondere aus Systemen mit geringem RAM (z.B. Raspberry Pi) oder vielen Adaptern problematisch, da dies zur Beendigung von Prozessen das das System oder Programmabstützen führen kann.
V8 erlaubt jedoch individuelle Festlegungen des Zeitpunkts, an dem die Garbage-Collection gestartet werden soll. Dies erfolgt über den Startparameter –max-old-space-size. Die aktuellen Versionen des js-controllers und der Admin-Oberfläche erlauben die individuelle Festlegung dieses Parameters pro Adapter.
Für den js-controller muss dieser Parameter über die Konfigurationsdatei festgelegt werden:
Datei /opt/iobroker-data/iobroker.json z.B. mit nano öffnen.
Folgenden Text direkt nach der ersten geschweiften Klammer vor "network": { einfügen:
"system": { "memoryLimitMB": 80 },
Hierdurch wird das Limit auf 80 MB gesetzt. Dieser Wert scheint zurzeit für den Controller ausreichend zu sein.
Für alle anderen Adapter kann der Wert über die Admin-Oberfläche eingestellt werden:
Das Speicherlimit kann hier in der Spalte RAM-Limit eingetragen werden. Die Angabe erfolgt hierbei in MB. Keine Angabe = Default 512 MB.
Welche Werte hier sinnvoll sind, hängt vom System und dem Nutzungsszenario ab. Das Bild zeigt Beispielwerte, mit dem ein Produktivsystem auf einen Raspberry PI 2b stabil läuft.
Zum Thema history und sql gibt es ja schon einen guten Thread, der die Vor- und Nachteile beschreibt. Insbesondere bei mysql kann man durch die Anpassung der Konfiguration auch noch einiges zum Standard einsparen.
Der Wert für den node-red-Adapter betrifft nur den ioBroker-Adapter, nicht jedoch den node-red-Prozess selbst. Dieser wird vom Adapter mit –max-old-space-size=128 gestartet.
-
gab bzw gibt es denn Unterschiede bei der Garbage Collection, je nach verwendeter Linux Version ?
Das könnte ja das unterschiedliche Verhalten (Stabilitaet) erklären. Andersherum, wenn das nicht der Fall ist, dann erklärt es das nicht.
vG Looxer
-
Die Garbage Collection hängt in erster Linie an V8 und somit an der node.js-Version.
Bei den node.js-Versionen gibt es zumindest subjektiv erhebliche Unterschiede. Während die 0.10.x wohl auch mit dem geringen Speicher noch einiger Maßen zurecht gekommen ist, haben die von mir ausprobierten Version von 0.12.x fast alle mehr oder weniger häufig zu Abstützen geführt. Problem ist nur, dass mittlerweile viele node.js-Module mindestens eine 0.12.x voraussetzen. Auch wird der Stream 0.10.x nicht mehr weiterentwickelt und enhält keine Fixes mehr.
Die node.js-Version 4.2.x basiert nicht direkt auf 0.12.x sondern auf den wieder integrierten Parallelprojekt io.js und läuft subjektiv stabiler als 0.12.x, hat aber auch das Problem, dass der Speicher irgendwann aufgebraucht ist. Ich mutmaße mal, dass dies generell an den neueren V8-Versionen liegt, die einfach per Default für mehr Hauptspeicher und nur wenige parallel laufende Prozesse optimiert sind. Deswegen sind die obigen Speicherlimitierungen wichtig.
Generell würde ich heute für den Raspi 2b zum Jessie-Image mit node.js 4.2.6 raten. Das ist die aktuelle Long Term stable Version, die noch mit Fixes versorgt wird. Diese läuft sowohl mit ioBroker als auch mit dem aktuellen node-red 13.1 sehr gut zusammen.
In node.js 5.x hat jedoch zu viele Änderungen drin und ist absolut nicht zu empfehlen.
Alle aktuellen node.js-Versionen werden übrigens für Debian Jessie und somit auch für das aktuelle Raspbian-Image über den Package-Manager angeboten. Das hat den Vorteil, dass man sich über Updates und Kompatibilitäten weniger Gedanken machen braucht. Im Standard ist die 0.12.x LTS enthalten, für 4.2.x LTS muss folgendes einmal ausgeführt werden:
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash - sudo apt-get install -y nodejs
Die LTS-Versionen werden nur noch mit Fixes versorgt, bekommen aber keine neuen Feature mehr. Somit ist das Risiko, dass ein Update zu Inkompatibilitäten führt, eher gering.
https://nodejs.org/en/download/package- … tributions
Generell lassen sich viele Fehler vermeiden, wenn man die npm-Pakete bei der Installation selber baut oder wenigstens als Fallback bauen kann. Dafür muss dann auch noch folgende installiert werden:
sudo apt-get install -y build-essential
-
…danke nobody. Das ist mal ne super Erklärung (und Empfehlung)
und erklärt auch warum ich keine Probleme habe.
Einschränkungen habe ich bisher in keiner Weise bemerkt.
Das heisst aber wohl, dass es durchaus zu Problemen bei zukünftigen updates von iobroker bei mir kommen kann.
Ich denke, dass ich das mal abwarte. Stabil ist besser als labil
vG Looxer
-
danke für dein Erklärungen die sind sehr aufschlußreich.
Bei einem Punkt hab ich aber andere Erfahrungen gemacht und ich glaube das Problem haben auch andere und wissen es nicht.
@nobody:Im Standard ist die 0.12.x LTS enthalten `
Bei meinen Installationen ist mir aufgefallen das bereits eine Node.js Version installiert ist, wenn man Debian Jessie auf dem Pi installiert.Es handelt sich um eine 0.10.x Version, diese lässt sich weder mit apt-get deinstallieren noch updaten. Auch ersetzen klappt nicht immer richtig weil die Symlinks erhalten bleiben, ebenso wie die PATH Variable(n).
Erst mit dem deb-Paket von nodesource hat es dann Funktioniert.
Hier mal meine Specs:
! Hardware: CCU2, RPi2 mit SSD
! Software: Debian Jessie (offizielle Version, nicht minimal), nodejs v4.2.1, npm v2.14.7, CCU2 2.15.2 + CUxD 0.9
! ioBroker:
! js-controller 0.8.4
! system.adapter.admin : admin - 0.7.3
! system.adapter.hm-rpc : hm-rpc - 0.5.2
! system.adapter.hm-rega : hm-rega - 0.2.2
! system.adapter.harmony : harmony - 0.5.5
! system.adapter.web : web - 1.3.4
! system.adapter.icons-addictive-flavour-png: icons-addictive-flavour-png - 0.1.0
! system.adapter.icons-material-png : icons-material-png - 0.1.0
! system.adapter.icons-material-svg : icons-material-svg - 0.1.0
! system.adapter.icons-mfd-png : icons-mfd-png - 0.1.2
! system.adapter.icons-mfd-svg : icons-mfd-svg - 0.1.2
! system.adapter.icons-ultimate-png : icons-ultimate-png - 0.1.0
! system.adapter.javascript : javascript - 1.1.4
! system.adapter.sayit : sayit - 0.3.16
! system.adapter.scenes : scenes - 0.2.4
! system.adapter.sonos : sonos - 0.1.7
! system.adapter.vis : vis - 0.8.4
! system.adapter.vis-bars : vis-bars - 0.1.1
! system.adapter.vis-colorpicker : vis-colorpicker - 0.1.1
! system.adapter.vis-fancyswitch : vis-fancyswitch - 0.1.0
! system.adapter.vis-google-fonts : vis-google-fonts - 0.1.0
! system.adapter.vis-hqwidgets : vis-hqwidgets - 0.2.5
! system.adapter.vis-jqui-mfd : vis-jqui-mfd - 0.1.0
! system.adapter.vis-keyboard : vis-keyboard - 0.0.2
! system.adapter.vis-lcars : vis-lcars - 0.1.6
! system.adapter.vis-metro : vis-metro - 0.2.0
! system.adapter.vis-plumb : vis-plumb - 0.1.6
! system.adapter.vis-rgraph : vis-rgraph - 0.0.2
! system.adapter.vis-timeandweather : vis-timeandweather - 0.0.2
! Und da die Frage eh kommt wie man eine Liste aller Adapter in Textform bekommt ohne zu Tippen, hier die Lösung:
! im Terminal "iobroker list adapters" eingeben.
! free -m zeigt bei mir folgendes an:
! total used free shared buffers cached
! Mem: 925 808 117 18 78 182
! -/+ buffers/cache: 547 378
! Swap: 99 0 99 -
Danke nobody!
Ich hab auf meinen beiden BananaPi Jessie drauf, mit node v0.12.6 .
Nach Deiner Meinung sollte v4.2.6 die bessere Wahl sein?!
Anbei mal zwei screens der Bananen (top sortiert nach Speicher).
Wobei z.B. der Speicherfresser history.0 schon mit RAMLimit 80 versorgt ist.
Nur versteh ich die Anzeige dann nicht, sieht mehr als 80 aus.
admin.0 läuft auf master, history.0 auf client.
! filename="top3.PNG" index="1">~~
filename="top3a.PNG" index="0">~~
! system.adapter.admin : admin - 0.7.3
! system.adapter.hm-rpc : hm-rpc - 0.5.2
! system.adapter.hm-rega : hm-rega - 0.2.2
! system.adapter.history : history - 0.2.1
! system.adapter.web : web - 1.3.4
! system.adapter.vis : vis - 0.8.4
! system.adapter.vis-hqwidgets : vis-hqwidgets - 0.2.5
! system.adapter.vis-jqui-mfd : vis-jqui-mfd - 0.1.0
! system.adapter.rickshaw : rickshaw - 0.3.1
! system.adapter.fritzbox : fritzbox - 0.2.1
! system.adapter.ical : ical - 1.1.1 -
@Jey Cee
Ich hab gar nicht geschaut, was bei meinem Jessie drauf war. Gleich die Befehle von der iobroker Installseite genommen.
wget http://www.iobroker.net/wp-content/uploads/2015/09/nodejs0_12_6_armhf.deb dpkg -i nodejs0_12_6_armhf.deb rm nodejs0_12_6_armhf.deb
Und keinen Fehler bekommen und node -v zeigt v0.12.6 .
Hab ich jetzt ein verstecktes Problem und deshalb die Fehler?
Gruß
Tino
-
@aquapro: Ist definitiv mehr. Zum übernehmen der RAM Einstellungen muss mindestens der Adapter neu gestartet werden evtl. ist auch ein Kompletter Neustart sinnvoll.
Also wenn die richtige Node Version angezeigt wird sollte alles im grünen Bereich sein. Da er dann die gewollte Node installation anspricht.
Ich weiss leider nicht mehr in welchem ordner die vor installierte Node version war, aber ich versuch das mal heraus zu finden.
Weiss jemand was die spalte Time+ bei Top aussagt? Ist das die Uptime des angezeigten dienstes?
-
Das ist ja mal eine spitzenmäßige Zusammenfassung zum Speicherthema. So langsam verstehe sogar ich die RasPi-Geschichte
Ich habe jetzt gerade mal meine Node-Version ermittelt. Es ist die 0.10.22 - sollte ich da mal updaten?
Obwohl meine Installation leidlich läuft, zumindest wenn ich nach Updates genügend Reboots gemacht habe…
-
ch habe jetzt gerade mal meine Node-Version ermittelt. Es ist die 0.10.22 - sollte ich da mal updaten? `
die habe ich auch und überhaupt keine Probleme. Nach den Erklärungen von nobody werde ich productiv zunächst nix updaten.Endlich haben wir eine neue Empfehlung für die Installation. Die muss aber noch von den Nutzern mit instabilen Installationen hier bestätigt werden - meine ich.
vG Looxer
-
Ich hab mal auf meinem Pi1 Jessie installiert und nach der Node version geschaut, die ist 0.10.29. Damit sollte ioBroker ja laufen.
Wenn diese Version drauf ist findet man in /usr/bin den Link node der auf nodejs im selben ordner verweisst und unter /usr/lib die Ordner nodejs und node_modules.
-
Danke nobody!
Ich hab auf meinen beiden BananaPi Jessie drauf, mit node v0.12.6 .
Nach Deiner Meinung sollte v4.2.6 die bessere Wahl sein?!
Anbei mal zwei screens der Bananen (top sortiert nach Speicher).
Wobei z.B. der Speicherfresser history.0 schon mit RAMLimit 80 versorgt ist.
Nur versteh ich die Anzeige dann nicht, sieht mehr als 80 aus.
admin.0 läuft auf master, history.0 auf client.
! filename="top3.PNG" index="1">~~
filename="top3a.PNG" index="0">~~
! system.adapter.admin : admin - 0.7.3
! system.adapter.hm-rpc : hm-rpc - 0.5.2
! system.adapter.hm-rega : hm-rega - 0.2.2
! system.adapter.history : history - 0.2.1
! system.adapter.web : web - 1.3.4
! system.adapter.vis : vis - 0.8.4
! system.adapter.vis-hqwidgets : vis-hqwidgets - 0.2.5
! system.adapter.vis-jqui-mfd : vis-jqui-mfd - 0.1.0
! system.adapter.rickshaw : rickshaw - 0.3.1
! system.adapter.fritzbox : fritzbox - 0.2.1
! system.adapter.ical : ical - 1.1.1 `
Nein, wenn du mit dieser Version keine Probleme hast, gibt es keinen Grund zu wechseln. Ich bin von der 0.12.9 auf die 4.2.x gewechselt, weil ich ohne die Begrenzungen immer Abstürze hatte. Die gibt es aber mit der 4.2.6 auch.Die LTS Versionen haben halt den Vorteil, dass diese noch gepflegt werden. Das ist vor allem dann wichtig, wenn das System auch über das Internet erreichbar ist. Bei mir ist der pi gleichzeitig Reverse proxy für alle Systeme und openvpn-Server.
Wenn ich vorhin den Eindruck erweckt habe, dass man mit den Einstellungen direkt auf die Größe des Prozesses schließen kann, hab ich mich falsch ausgedrückt. Der Parameter max-old-space-size der damit gesetzt wird legt die maximale Größe des Heap fest, bei dem die Garbage Collection gestartet wird. Dies betrifft aber nur den Heap, vereinfacht ausgedrückt der Platz für Variablen. Darin nicht enthalten sind node.js, der Anwendungscode und der Platz für alle inkludierten Libs. Auch kann nur das frei gegeben werden, was nicht mehr verlinkt ist.
Gerade Beim history - Adapter werden viele Daten im RAM gehalten.
Gesendet von meinem GT-N8000 mit Tapatalk
-
@Jey Cee:Ich hab mal auf meinem Pi1 Jessie installiert und nach der Node version geschaut, die ist 0.10.29. Damit sollte ioBroker ja laufen.
Wenn diese Version drauf ist findet man in /usr/bin den Link node der auf nodejs im selben ordner verweisst und unter /usr/lib die Ordner nodejs und node_modules. `
Ich hab mal bei Debian nachgesehen. Offiziell ist wirklich noch die 0.10.29. Ich hab wohl irgendwann mal das Repository von nodesource.com aufgenommen…Gesendet von meinem GT-N8000 mit Tapatalk
-
Hallo, habe heute für einen Arbeitskollegen erst einen Raspbian (Raspi 2) aufgesetzt.
Dort ist eine 4er Node Version von http://weworkweplay.com/play/raspberry-pi-nodejs/ drauf.
LG Christian