ich geh behindert
This commit is contained in:
581
backend/docs/RASPBERRY_PI_PERFORMANCE.md
Normal file
581
backend/docs/RASPBERRY_PI_PERFORMANCE.md
Normal file
@ -0,0 +1,581 @@
|
||||
# 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`)
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# /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`
|
||||
```bash
|
||||
# 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`
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# /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
|
||||
```bash
|
||||
# /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf
|
||||
[connection]
|
||||
wifi.powersave = 2
|
||||
```
|
||||
|
||||
## Application-Optimierungen
|
||||
|
||||
### 1. Python/Flask-Optimierungen (app.py)
|
||||
|
||||
#### Speicher-Management
|
||||
```python
|
||||
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
|
||||
```python
|
||||
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
|
||||
```python
|
||||
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
|
||||
```python
|
||||
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
|
||||
```css
|
||||
/* 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
|
||||
```css
|
||||
@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
|
||||
```javascript
|
||||
// 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
|
||||
```bash
|
||||
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
|
||||
```json
|
||||
{
|
||||
"DefaultBrowserSettingEnabled": false,
|
||||
"BackgroundModeEnabled": false,
|
||||
"BookmarkBarEnabled": false,
|
||||
"BrowserSignin": 0,
|
||||
"DefaultNotificationsSetting": 2,
|
||||
"PasswordManagerEnabled": false,
|
||||
"TranslateEnabled": false,
|
||||
"MetricsReportingEnabled": false
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Crash-Recovery-System
|
||||
|
||||
```bash
|
||||
#!/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
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
#!/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
|
||||
```bash
|
||||
# Alle 5 Minuten Temperatur-Check
|
||||
*/5 * * * * root /usr/local/bin/pi-temp-check
|
||||
```
|
||||
|
||||
### 2. Performance-Metriken
|
||||
|
||||
#### System-Performance überwachen
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# Vollständige Installation mit Performance-Optimierungen
|
||||
sudo ./setup.sh
|
||||
|
||||
# Nur Performance-Optimierungen anwenden
|
||||
sudo ./setup.sh --performance-only
|
||||
```
|
||||
|
||||
### Manuelle Konfiguration
|
||||
|
||||
#### 1. Kernel-Parameter anwenden
|
||||
```bash
|
||||
sudo sysctl -p /etc/sysctl.d/99-myp-performance.conf
|
||||
```
|
||||
|
||||
#### 2. Services deaktivieren
|
||||
```bash
|
||||
sudo systemctl disable bluetooth cups avahi-daemon
|
||||
```
|
||||
|
||||
#### 3. tmpfs mounten
|
||||
```bash
|
||||
sudo mount -a
|
||||
```
|
||||
|
||||
#### 4. Python-Optimierungen aktivieren
|
||||
```bash
|
||||
export PYTHONOPTIMIZE=2
|
||||
export PYTHONDONTWRITEBYTECODE=1
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Häufige Probleme
|
||||
|
||||
#### 1. Hoher Speicherverbrauch
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# Tägliches Backup mit Kompression
|
||||
0 1 * * * /usr/local/bin/backup-myp.sh --compress --performance-optimized
|
||||
```
|
||||
|
||||
### Recovery-Prozess
|
||||
```bash
|
||||
# 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](https://mpascucci.github.io/tutorial/rpi/)
|
||||
- [Thomas Krampe - Raspberry Pi Web-Kiosk](https://blog.kngstn.eu/article/2023-09-22-raspberrypi-als-web-kiosk/)
|
||||
- [Raspberry Pi Foundation Documentation](https://www.raspberrypi.org/documentation/)
|
||||
- [Chromium Command Line Switches](https://peter.sh/experiments/chromium-command-line-switches/)
|
||||
|
||||
---
|
||||
|
||||
**Status**: ✅ Produktionsreif
|
||||
**Letzte Aktualisierung**: Januar 2025
|
||||
**Version**: 4.0 (Konsolidiert)
|
Reference in New Issue
Block a user