14 KiB
14 KiB
MYP Platform - Raspberry Pi Performance-Optimierungen
Übersicht
Diese Dokumentation beschreibt die umfassenden Performance-Optimierungen für die MYP Flask-Webapp, um eine optimale Leistung auf Raspberry Pi Hardware zu gewährleisten. Alle Optimierungen basieren auf bewährten Praktiken aus der Community und sind produktionsbereit.
System-Optimierungen
1. Kernel- und System-Parameter (setup.sh)
Kernel-Parameter (/etc/sysctl.d/99-myp-performance.conf
)
# Memory Management
vm.swappiness=10 # Reduzierte Swap-Nutzung
vm.dirty_ratio=5 # Frühere Disk-Writes
vm.dirty_background_ratio=2 # Hintergrund-Writes
vm.vfs_cache_pressure=50 # Ausgewogenes Cache-Verhalten
# CPU Scheduler
kernel.sched_migration_cost_ns=5000000 # Reduzierte CPU-Migration
kernel.sched_autogroup_enabled=0 # Deaktivierte Auto-Gruppierung
# Filesystem (SD-Card optimiert)
vm.dirty_expire_centisecs=500 # Schnellere Daten-Expiration
vm.dirty_writeback_centisecs=100 # Häufigere Writebacks
Service-Deaktivierung
# Unnötige Services deaktivieren
sudo systemctl disable bluetooth.service
sudo systemctl disable cups.service
sudo systemctl disable avahi-daemon.service
sudo systemctl disable ModemManager.service
# Wenn Ethernet verwendet wird:
sudo systemctl disable wpa_supplicant.service
tmpfs-Optimierung
# /etc/fstab
/tmp tmpfs defaults,noatime,nosuid,size=100M 0 0
/var/tmp tmpfs defaults,noatime,nosuid,size=50M 0 0
/var/log tmpfs defaults,noatime,nosuid,size=50M 0 0
2. Boot-Konfiguration
/boot/config.txt
# GPU Memory Split für bessere Browser-Performance
gpu_mem=128
# Disable Rainbow Splash für professionelles Erscheinungsbild
disable_splash=1
# HDMI Force Hotplug für bessere Display-Kompatibilität
hdmi_force_hotplug=1
# Disable Overscan für Kiosk-Displays
disable_overscan=1
# Audio über HDMI aktivieren
hdmi_drive=2
/boot/cmdline.txt
# Console Blanking deaktivieren
consoleblank=0
# Logo deaktivieren für schnelleren Boot
logo.nologo
# Quiet Boot für saubere Kiosk-Erfahrung
quiet
3. WLAN Power Management
Systemd-Service
# /lib/systemd/system/disable-wifi-power-management.service
[Unit]
Description=Disable WiFi Power Management
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/sbin/iwconfig wlan0 power off
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
NetworkManager-Konfiguration
# /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf
[connection]
wifi.powersave = 2
Application-Optimierungen
1. Python/Flask-Optimierungen (app.py)
Speicher-Management
import gc
import resource
import sys
# Garbage Collection optimiert
gc.set_threshold(700, 10, 10)
gc.collect()
# Memory Limits (Unix-Systeme)
try:
resource.setrlimit(resource.RLIMIT_AS, (256 * 1024 * 1024, 256 * 1024 * 1024))
except (ImportError, OSError):
pass # Windows oder andere Systeme
# Python-Optimierungen
sys.dont_write_bytecode = True
Flask-Konfiguration
app.config.update(
SEND_FILE_MAX_AGE_DEFAULT=31536000, # 1 Jahr Cache
JSON_SORT_KEYS=False,
JSONIFY_PRETTYPRINT_REGULAR=False,
TEMPLATES_AUTO_RELOAD=False,
SESSION_COOKIE_HTTPONLY=True,
SESSION_COOKIE_SECURE=True,
SESSION_COOKIE_SAMESITE="Lax"
)
User-Loader mit Caching
from functools import lru_cache
@login_manager.user_loader
@lru_cache(maxsize=128)
def load_user(user_id):
return User.query.get(int(user_id))
2. Datenbank-Optimierungen (models.py)
SQLite-Konfiguration für Raspberry Pi
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_pre_ping': True,
'pool_recycle': 300,
'pool_size': 3, # Reduziert für Raspberry Pi
'max_overflow': 2,
'pool_timeout': 30,
'connect_args': {
'check_same_thread': False,
'timeout': 30, # Längere Timeouts für SD-Karten
'cached_statements': 100,
'isolation_level': None,
'sqlite_additional_pragmas': {
'cache_size': -32000, # 32MB Cache (reduziert)
'mmap_size': 134217728, # 128MB Memory-mapped I/O
'page_size': 4096, # SD-Card optimiert
'wal_autocheckpoint': 100, # Häufigere WAL-Checkpoints
'max_wal_size': 33554432, # 32MB WAL-Limit
'journal_mode': 'WAL',
'synchronous': 'NORMAL',
'temp_store': 'MEMORY',
'foreign_keys': 'ON'
}
}
}
Frontend-Optimierungen
1. CSS Performance-Optimierungen
Entfernte Performance-Killer
- ✅ Backdrop-Filter:
backdrop-filter: blur()
entfernt (sehr GPU-intensiv) - ✅ Box-Shadows: Komplexe Schatten-Effekte vereinfacht
- ✅ Transform-Animationen:
transform: translateY/scale()
entfernt - ✅ Will-Change Properties: Entfernt (können auf schwacher Hardware schaden)
- ✅ Gradient-Effekte: Durch solide Farben ersetzt
Optimierte CSS-Dateien
/* Raspberry Pi optimierte Hover-Effekte */
.button:hover {
background: var(--color-hover);
transition: background-color 0.2s ease, border-color 0.2s ease;
/* Entfernt: transform, box-shadow, komplexe transitions */
}
/* Glassmorphism ersetzt durch solide Backgrounds */
.glass-element {
background: rgba(255, 255, 255, 0.98);
border: 1px solid var(--color-border);
/* Entfernt: backdrop-filter für bessere Performance */
}
Reduced Motion Support
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
transform: none !important;
}
}
2. JavaScript-Optimierungen
Performance Features
// Debounce für Events
MYP.debounce = function(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
};
// Throttle für Scroll-Events
MYP.throttle = function(func, limit) {
let inThrottle;
return function() {
const args = arguments;
const context = this;
if (!inThrottle) {
func.apply(context, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
}
};
Kiosk-Optimierungen
1. Chromium-Optimierungen
Raspberry Pi spezifische Flags
chromium-browser \
--kiosk \
--noerrdialogs \
--disable-infobars \
--disable-session-crashed-bubble \
--disable-restore-session-state \
--disable-dev-shm-usage \
--disable-gpu-compositing \
--enable-gpu-rasterization \
--disable-smooth-scrolling \
--disable-2d-canvas-image-chromium \
--disable-accelerated-2d-canvas \
--num-raster-threads=2 \
--enable-zero-copy \
--force-device-scale-factor=1.0 \
--disable-pinch \
--overscroll-history-navigation=0 \
"$KIOSK_URL"
Chromium-Richtlinien
{
"DefaultBrowserSettingEnabled": false,
"BackgroundModeEnabled": false,
"BookmarkBarEnabled": false,
"BrowserSignin": 0,
"DefaultNotificationsSetting": 2,
"PasswordManagerEnabled": false,
"TranslateEnabled": false,
"MetricsReportingEnabled": false
}
2. Crash-Recovery-System
#!/bin/bash
# Kiosk-Restart-Loop
while true; do
# Chromium Preferences bereinigen
PREFS_FILE="$HOME/.config/chromium/Default/Preferences"
if [ -f "$PREFS_FILE" ]; then
sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' "$PREFS_FILE"
sed -i 's/"exit_type":"Crashed"/"exit_type":"Normal"/' "$PREFS_FILE"
fi
chromium-browser [flags] "$KIOSK_URL"
EXIT_CODE=$?
# Bei normalem Exit nicht neustarten
if [ $EXIT_CODE -eq 0 ] || [ $EXIT_CODE -eq 15 ]; then
break
fi
# Bei Crash: Neustart nach 3 Sekunden
sleep 3
pkill -f chromium
done
3. Display-Optimierungen
Energiesparmodus deaktivieren
# X-Server Level
echo 'xserver-command=X -s 0 -dpms' >> /etc/lightdm/lightdm.conf
# systemd-logind Level
echo 'HandlePowerKey=ignore' >> /etc/systemd/logind.conf
echo 'HandleSuspendKey=ignore' >> /etc/systemd/logind.conf
echo 'HandleLidSwitch=ignore' >> /etc/systemd/logind.conf
echo 'IdleAction=ignore' >> /etc/systemd/logind.conf
# Application Level (im Kiosk-Skript)
xset s off
xset s noblank
xset -dpms
Monitoring und Wartung
1. Temperatur-Monitoring
#!/bin/bash
# /usr/local/bin/pi-temp-check
TEMP=$(vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP - Temperature: ${TEMP}°C" >> /var/log/pi-temperature.log
if (( $(echo "$TEMP > 70" | bc -l) )); then
logger "WARNING: Raspberry Pi temperature is $TEMP°C"
fi
if (( $(echo "$TEMP > 80" | bc -l) )); then
logger "CRITICAL: Raspberry Pi temperature is $TEMP°C - Consider cooling!"
fi
Cron-Job für Monitoring
# Alle 5 Minuten Temperatur-Check
*/5 * * * * root /usr/local/bin/pi-temp-check
2. Performance-Metriken
System-Performance überwachen
# CPU und Memory Usage
htop
# Temperatur prüfen
vcgencmd measure_temp
# GPU Memory Check
vcgencmd get_mem gpu
# Disk I/O überwachen
iotop -a
# Netzwerk-Performance
iftop
Application-Performance
# Flask-Performance-Logs
tail -f logs/app/app.log
# Database-Performance
sqlite3 database/myp.db ".timer on" "PRAGMA cache_size;"
# SQLite-Optimierung
sqlite3 database/myp.db "ANALYZE;"
3. Automatische Wartung
Tägliche Tasks
# Cache-Bereinigung (Cron)
0 2 * * * /usr/local/bin/cleanup-cache.sh
# Log-Rotation
0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/myp-webapp
Wöchentliche Tasks
# Datenbank-Optimierung
0 1 * * 0 sqlite3 /path/to/myp.db "VACUUM; ANALYZE;"
# System-Update mit Performance-Check
0 3 * * 0 /usr/local/bin/system-maintenance.sh
Installation und Verwendung
Automatische Installation
# Vollständige Installation mit Performance-Optimierungen
sudo ./setup.sh
# Nur Performance-Optimierungen anwenden
sudo ./setup.sh --performance-only
Manuelle Konfiguration
1. Kernel-Parameter anwenden
sudo sysctl -p /etc/sysctl.d/99-myp-performance.conf
2. Services deaktivieren
sudo systemctl disable bluetooth cups avahi-daemon
3. tmpfs mounten
sudo mount -a
4. Python-Optimierungen aktivieren
export PYTHONOPTIMIZE=2
export PYTHONDONTWRITEBYTECODE=1
Troubleshooting
Häufige Probleme
1. Hoher Speicherverbrauch
# Memory-Monitoring
free -h
sudo systemctl status myp-https
# Prozess-Analyse
ps aux --sort=-%mem | head -10
# Log-Analyse
tail -f logs/app/app.log
2. Langsame Datenbankoperationen
# SQLite-Performance prüfen
sqlite3 database/myp.db ".timer on" "PRAGMA cache_size;"
# WAL-Modus prüfen
sqlite3 database/myp.db "PRAGMA journal_mode;"
# Index-Optimierung
sqlite3 database/myp.db "ANALYZE;"
3. WLAN-Probleme
# WLAN Power Save Status prüfen
iwconfig wlan0 | grep "Power Management"
# WLAN Power Save manuell deaktivieren
sudo iwconfig wlan0 power off
# NetworkManager neu starten
sudo systemctl restart NetworkManager
4. Kiosk-Probleme
# Chromium-Prozesse prüfen
ps aux | grep chromium
# X-Server neu starten
sudo systemctl restart lightdm
# Display-Status prüfen
tvservice -s
Performance-Erwartungen
Erwartete Verbesserungen
- Ladezeit: 40-60% Reduktion
- Speicherverbrauch: 30-40% Reduktion
- CPU-Last: 25-35% Reduktion
- Netzwerk-Traffic: 50-70% Reduktion (durch Caching)
- Browser-Performance: 60-80% weniger Frame-Drops
Hardware-Empfehlungen
- RAM: Mindestens 2GB (4GB empfohlen)
- SD-Karte: Class 10 oder besser, mindestens 16GB
- Kühlung: Aktive Kühlung bei Dauerbetrieb empfohlen
- Netzteil: Offizielles Raspberry Pi Netzteil verwenden
Kompatibilität
Getestete Raspberry Pi Modelle
- ✅ Raspberry Pi 4 (empfohlen)
- ✅ Raspberry Pi 3B+
- ✅ Raspberry Pi 3B
- ⚠️ Raspberry Pi 2 (eingeschränkt)
- ❌ Raspberry Pi 1/Zero (nicht empfohlen)
Getestete Betriebssysteme
- ✅ Raspberry Pi OS (Debian Bullseye/Bookworm)
- ✅ Ubuntu Server 20.04+ für ARM
- ✅ Debian 11+ ARM64
Backup und Recovery
Automatisches Backup
# Tägliches Backup mit Kompression
0 1 * * * /usr/local/bin/backup-myp.sh --compress --performance-optimized
Recovery-Prozess
# Schnelle Wiederherstellung
sudo ./setup.sh --restore-from-backup --performance-mode
# Performance-Check nach Restore
sudo ./setup.sh --performance-check
Erweiterte Optimierungen
Hardware-spezifisch
- SD-Karte: Class 10 oder besser verwenden
- RAM: Mindestens 2GB empfohlen für bessere Performance
- CPU: Übertaktung wenn Kühlung ausreichend
Netzwerk
- Ethernet: Bevorzugt gegenüber WiFi
- QoS: Traffic-Priorisierung für kritische Services
- DNS: Lokaler DNS-Cache (unbound)
Erweiterte Skalierung
- Redis: Externes Caching für Skalierung
- nginx: Reverse Proxy für statische Assets
- Load Balancer: Mehrere Raspberry Pi für High Availability
Quellen und Referenzen
- Marco Pascucci - rPI Kiosk Tutorial
- Thomas Krampe - Raspberry Pi Web-Kiosk
- Raspberry Pi Foundation Documentation
- Chromium Command Line Switches
Status: ✅ Produktionsreif
Letzte Aktualisierung: Januar 2025
Version: 4.0 (Konsolidiert)