Tweaks zur Performance Verbesserung des Raspberry

Begonnen von Kent, 08 Januar 2017, 08:26:00

Vorheriges Thema - Nächstes Thema

Kent

Hallo,

ich nutze FHEM nun schon seit 1,5 Jahren auf der Raspberry Plattform. Gestartet bin ich auf einem Raspberry Pi 1 und aktuell verrichtet ein Pi2 seinen Dienst.
Im Laufe dieser Zeit habe ich verschieden Optimierungen durchgeführt um die Performance auf dem Pi zu verbessern.

Mein Ziel war dabei, die Reaktionsgeschwindigkeit des FHEM Servers zu verbessern, mehrere USB Geräte verlässlich einzubinden (auch nach mehreren Neustarts, Umsteckaktionen, usw...), Plots schneller anzuzeigen und das LOG nicht mit unnützen Daten vollzuschreiben.

1) Die ersten "Optimierungen" kann man bereits bei der Auswahl des Images mitnehmen:
Das Raspbian JESSIE LITE Image sollte für die allermeisten der FHEM Nutzer vollkommen ausreichen
https://downloads.raspberrypi.org/raspbian_lite_latest


2) Weiter gehts bei der Einrichtung des Pi´s (wenn man kein Display am PI betreibt):
sudo raspi-config
Unter Punkt 7 "Advanced Options" gibts den Punkt "A3 Memory Split" hier legt man fest wieviel Speicher der GPU zugeordnet werden soll. Ohne angeschlossenem Display sollte hier der kleinst mögliche Wert eingestellt werden (16MB).


3) nach dem FHEM ist installiert wurde hab ich das USB Handling angepasst

a) Die Zuordung meherer USB Geräte nach z.B. /dev/ttyUSB0, /dev/ttyUSB1,...  ist nicht sehr zuverlässig. Hier hilft es, wenn man die USB Geräte mit dem Namen verknüpft, mit dem sie sich auch am USB anmelden. Den findet man über den folgenden Befehl auf der Konsole heraus:
ls -l /dev/serial/by-id
Das Ergebnis ist dann sowas z.B.: lrwxrwxrwx 1 root root 13 Dec 29 13:52 usb-elero_GmbH_Transmitter_Stick_A7041SYW-if00-port0 -> ../../ttyUSB1

Der Aufruf in FHEM sieht dazu dann wie folgt aus: define myElero EleroStick /dev/serial/by-id/usb-elero_GmbH_Transmitter_Stick_A7041SYW-if00-port0@38400 attr myElero

Wenn man alle USB Devices so einbindet, werden diese immer nach einem Neustart des Pi´s richtig angesprochen egal ob der Stick am USB Port umgesteckt wurde.


b) Standardmäßig schaut FHEM nach neuen USB Devices
# Disable this to avoid looking for new USB devices on startup
define initialUsbCheck notify global:INITIALIZED usb create

Genau diesem Rat in dem Kommentar bin ich gefolgt und hab die Zeile auskommentiert


4) Der Pi 2 hat ja eine vier Kern CPU - über einen Aufruf in der FHEM.conf kann man die Ploterstellung auf alle vier Kerne verteilen
attr WEB plotfork 1


5) Ich nutze viele Temperatursensoren, die aber für mich nur informativ sind (z.B. Wetterinformationen). Diesen Sensoren haben ich das Attribut event-on-change-reading .* mitgeben. Für einen meiner Lacrosse Sensoren sieht das so aus attr LaCrosse_12 event-on-change-reading .*


6) Als letztes hab ich mir noch einer weiter Schaltfläche ins Webinterface gebaut. Diese Enthält jetzt die reine "Prüfung auf Updates", das "Update" selber und einen "Restart" Knopf.
attr WEB menuEntries Update,cmd=update,UpdateCheck,cmd=update+check,Restart,cmd=shutdown+restart


Vieleicht hift das ja dem einen oder anderen oder es gibt noch mehr Optimierungen, die ich bisher noch nicht gefunden hab.

Gruß

Markus
HW: Raspberry 4 mit FHEM und IOBroker, 433MHz Signalduino (3.50 Firmware), 868MHz CUL, Elero Drive Stick, 1-Wire Temperatur Sensoren

ralfix

#1
1) Ja,  JESSIE LITE ist bei mir auch default Installationsbasis.

2) Danke für den Hinweis.

3)a) Mach ich auch.
3b) Die 2 Sekunden zusätliche BootZeit kann ich verkraften.

4) Danke für den Hinweis.

5) Ja, ich kann grundsätzlich empfehlen immer mal in die Logs und den EventMonitor reinzuschauen, ob dort übermäßiger "Spam" auftaucht.
Wenn, immer möglich
event-on-change-reading .*
verwenden.

6) Gerade im Test.

Ergänzungen:
7) Swap schalte bei meinem Raspi-Zoo ich grundsätzlich aus.
sudo apt-get purge dphys-swapfile
Quelle: https://www.elektronik-kompendium.de/sites/raspberry-pi/2002131.htm
Wenn der Speicher nicht ausreichen sollte ist läuft etwas grundsätzlich schief. Dann ist mir ein Absturz lieber, als eine kaputt geschriebene SD-Karte.

8) Virtualisierung Systemlog
sudo nano /etc/fstab
folgende Zeile ergänzen
none    /var/log                tmpfs size=5M,noatime   00
Damit beginnen alle Files in /var/log bei jedem Systemstart neu. Das sorgt für Übersicht und schont die SD.
Ich mache allerdings auch 1 mal pro Monat systemupdate mit reboot.
Quelle: http://www.forum-raspberrypi.de/Thread-schreibzugriff-swapping-hardware-watchdog-sinn-oder-unsinn

9) Mein Systemupdate script:
pi@f-maximus-lan ~ $ cat ./update.sh
#!/bin/bash
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get dist-upgrade
sudo apt-get autoremove
sudo apt-get clean
sudo apt-get autoclean
sudo reboot

Update führe ich ca 1 mal im Monat manuell aus, wenn ich Zeit habe ggf auftretenden Probleme zu erkennen und zu beheben. Also nicht bevor man Wegfährt.

Gruß
Ralf

Atouk

Super Idee, und gute Tipps, danke!!!

4) hat meine Reports massiv beschleunigt (und ich dachte, es läge an der Größe der Logfiles.., bin halt noch FHEM-Newbie ::) )

3b) kannte ich notgedrungen, da mein FHEM nie starten wollte, wenn z.B. eine Tastatur am USB hing (und service fhem stop gab den Telnet-Port nicht mehr frei, so dass ein zweiter Startversuch noch schneller scheiterte...)

6) Nice to have, aber jetzt muss ich meine "Räume" endgültig anders gruppieren, die Leiste wird zu voll  ;)

7) Naja, das Swapfile stört ja auch nicht, da es bei reinem FHEM auf einem Pi2 anscheinend nicht genutzt wird. Aber abschalten ist sicherlich keine schlechte Idee.

8+9) Interessante Tipps

Von mir etwas OT ein anderer Tipp zur Stabilisierung: USV mittels Powerbank. Einige Powerbanks können gleichzeitig laden und ein Gerät versorgen, z.B die Modelle von Intenso (die 5200 und die 10400 habe ich hier, gehen beide - eine Noname von Conrad allerdings nicht). Eine Intenso-5200 Ah-Bank bekommt man mit etwas Glück schon ab 10 Eur. Mein Pi (Max-Cube über Lan, 8 * LaCrosse mit Jeelink) verbraucht im Regelbetrieb ca. 0,45A, wäre also theoretisch etwas über 10 Std. abgesichert - real vermutlich darunter.

Ergänzend:
Jemand eine Art Watchdog geschrieben, der über einen Lan-Anschluss (vermutlich per regelmäßigem Ping) erkennt, ob ein Router antwortet - also das Rest-Haus unter Strom ist. Wenn nicht, wird der Pi nach entsprechender Zeit (vermutlich anhand der Kapazität berechnet) heruntergefahren. Findet man hier: http://raspi-ups.appspot.com/de/. Habe ich aber noch nicht näher angesehen, steht noch auf der ToDo-List.

Ein Hochfahren nach Stromausfall funktioniert hiermit nicht automatisch - dafür gäbe es entweder eine USV-Platine für ca. 30 Eur. Oder aber man nutzt aus, dass der Pi startet, wenn Pin 5 von Hi-Pegel auf Low wechselt. Dazu müsste es reichen, Pin1 (3,3V) über 10 kOhm mit Pin 5 zu verbinden, und diesen über ein Schließ-Relais auf Masse zu schalten, wenn das Relais über das 5V-Netzteil (welches auch die Powerbank speist) Strom bekommt - die Hausspannung also wieder da ist. Der Mehrverbrauch des Pi (0,33 Milli-Ampere) ist kaum wahrnehmbar; allerdings bringen Relais und Powerbank dann noch etwas an Verlustleistung.

Bei der Pin5-Variante bräuchte man kein LAN, sondern könnte direkt den Pin5-Status für die Stromausfallerkennung nutzen.

Wernieman

8)
Hat auch einen Gro0ßen Negativen Effekt: Bei einem Problem hat man anschließend keine Logfiles, kann diese also nicht analysieren!
Gerade beim Aufbau eines Systemes ist dieses daher eher kontraproduktiv
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

raimundl

Zitat von: Kent am 08 Januar 2017, 08:26:00
a) Die Zuordung meherer USB Geräte nach z.B. /dev/ttyUSB0, /dev/ttyUSB1,...  ist nicht sehr zuverlässig. Hier hilft es, wenn man die USB Geräte mit dem Namen verknüpft, mit dem sie sich auch am USB anmelden. Den findet man über den folgenden Befehl auf der Konsole heraus:
ls -l /dev/serial/by-id
Das Ergebnis ist dann sowas z.B.: lrwxrwxrwx 1 root root 13 Dec 29 13:52 usb-elero_GmbH_Transmitter_Stick_A7041SYW-if00-port0 -> ../../ttyUSB1

Der Aufruf in FHEM sieht dazu dann wie folgt aus: define myElero EleroStick /dev/serial/by-id/usb-elero_GmbH_Transmitter_Stick_A7041SYW-if00-port0@38400 attr myElero

Wenn man alle USB Devices so einbindet, werden diese immer nach einem Neustart des Pi´s richtig angesprochen egal ob der Stick am USB Port umgesteckt wurde.

Mein Ergebnis sieht so aus:
pi@RPi2BJessie:~ $ ls -l /dev/serial/by-id
insgesamt 0
lrwxrwxrwx 1 root root 13 Jän 11 09:42 usb-MediaTek_Inc_Product-if02-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 Jän 11 09:42 usb-MediaTek_Inc_Product-if03-port0 -> ../../ttyUSB1
lrwxrwxrwx 1 root root 13 Jän 11 09:42 usb-MediaTek_Inc_Product-if04-port0 -> ../../ttyUSB2
lrwxrwxrwx 1 root root 13 Jän 11 09:42 usb-MediaTek_Inc_Product-if05-port0 -> ../../ttyUSB3


Ist es nun egal, welche Schnittstelle (ttyUSB0 bis ttyUSB3) ich wähle?
Bei mir läuft es unter ttyUSB0 problemlos - trotzdem würde mich ein ev. Unterschied interessieren.

LG
Homematic: Licht, Heizung, Alarm, Alexa ... auf einen RaspberryPi3+mit OS "Stretch" und RPI-RF-MOD mit piVCCU3 (HMCCU), ca. 40 HM Komponenten, alexa, MobileAlerts, Hue Ledstripes....

Wernieman

Dein Gerät erzeugt 4! Serielle Schnitstellen, weshalb eben 4 vom System eingerichtet werden. Welches Gerät jetzt was macht, muß man in den Spec (oder Netz) nachlesen.

Wenn Du aktuell ttyUSB0 benutzt, kannst Du, laut Liste, auch wechseln zu /dev/serial/by-id/usb-MediaTek_Inc_Product-if02-port0 ... einfach "reverse engeneering"

BTW:
Faszinierend, das es kein "if01" in der Liste gibt, es geht gleich bei 2 los ....
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

ralfix

Zitat von: Wernieman am 11 Januar 2017, 09:10:46
8)
Hat auch einen Gro0ßen Negativen Effekt: Bei einem Problem hat man anschließend keine Logfiles, kann diese also nicht analysieren!
Gerade beim Aufbau eines Systemes ist dieses daher eher kontraproduktiv
Selbstverständlich. Aber erst muss es laufen, dann kann man tunen.
Hatte bisher noch keine Veranlassung, das auf meinen 4 Raspis (davon 2mal FHEM) wieder zurückzustellen. Das sind alles nur Mini-Server für den "Hausgebrauch" ohne Remotezugriff. Da reicht mir  eine Analysemöglichkeit ab letztem Bootvorgang mit übersichtlichen Files völlig aus. Außerdem muss ich mich um Logfilekomprimierung usw. kümmern.

Wer /var/log Virtualisierung benutzen will, also sollte Vor- und Nachteile abwägen. Das soll keine pauschale Empfehlung sein!