Zum Inhalt

Monitoring

Der AI-Server liefert nur Metriken — ausgewertet werden sie vom bestehenden Prometheus/Grafana auf dem NUC. Hier läuft ausschließlich der Exporter.

Metriken http://10.10.10.7:9100/metrics
Scrape-Job aiserver (Konfiguration im Repo homeserver)
Netz ai — Port 9100 ist veröffentlicht

Anders als auf dem NUC, wo Prometheus im selben Docker-Netz scrapt, muss der Port hier ins LAN. Er ist nicht authentifiziert; das entspricht der bestehenden Praxis im LAN-Segment (10.10.10.3:8123 ist ebenso eingebunden).

GPU-Metriken aus sysfs

amd-smi ist auf gfx1151 blind

Und einen ROCm-Exporter für diese APU gibt es nicht. Die Kennzahlen kommen deshalb über den Textfile-Collector direkt aus sysfs — aus denselben Pfaden, die auch scripts/thermal-watch.sh benutzt.

Metrik Quelle Referenzwert
aiserver_gpu_edge_celsius hwmon*/temp*_input (Label edge) Plateau ~72 °C, Peak 75 °C
aiserver_gpu_watts hwmon*/power1_average ~112 W Dauerlast, Peak 119 W
aiserver_gpu_mhz hwmon*/freq1_input Idle 600, DPM-Nachlauf 1670
aiserver_gpu_busy_percent card*/device/gpu_busy_percent
aiserver_gpu_gtt_bytes card*/device/mem_info_gtt_used idle ~4 GB, Worst Case 94,9 von 96 GB
aiserver_borgmatic_last_success_timestamp_seconds borgmatic-textfile.sh Zeitstempel des letzten erfolgreichen Backups

Alle Pfade werden zur Laufzeit gesucht: Die Karte heißt card1 und nicht card0, und die hwmon-Nummer verschiebt sich zwischen Bootvorgängen. Geschrieben wird atomar (temporäre Datei + mv), damit node_exporter nie eine halb geschriebene Datei liest.

Ablage und Rechte

Pfad Eigentümer Zweck
/opt/ai/volumes/monitoring-textfile 1000:1000 (robin) .prom-Dateien, im Container read-only gemountet
/opt/aiserver/monitoring/gpu-textfile-collector.sh robin User-Cron, minütlich
/opt/aiserver/monitoring/borgmatic-textfile.sh robin von borgmatic als root aufgerufen

Der GPU-Collector läuft als User-Cron von robin und braucht kein sudo — die sysfs-Werte sind für alle lesbar:

* * * * * /opt/aiserver/monitoring/gpu-textfile-collector.sh

Der Backup-Hook scheitert derzeit an genau dieser Rechtelage

borgmatic-textfile.sh wird von borgmatic als root aufgerufen, das Zielverzeichnis gehört aber robin. Die systemd-Unit von borgmatic setzt CapabilityBoundingSet=CAP_DAC_READ_SEARCH CAP_NET_RAW — ohne CAP_DAC_OVERRIDE darf root dort lesen, aber nicht schreiben. Der Zeitstempel steht seit dem 14.08.2026 still. Siehe Backup.

Alarme

Die Regeln liegen auf dem NUC (monitoring-stack/configs/prometheus/rules/aiserver-alerts.yml):

Alarm Bedingung Schwere
AiserverDown up{job="aiserver"} == 0 für 5 min critical
AiserverBackupStale letzter Backup-Erfolg älter als 48 h critical
AiserverBackupMetricMissing Backup-Metrik fehlt ganz (26 h) critical
AiserverGpuHot aiserver_gpu_edge_celsius > 80 für 5 min warning
AiserverOptDiskLow /opt über 85 % belegt warning
AiserverHighMemory RAM über 90 % belegt warning

Die GPU-Schwelle von 80 °C liegt bewusst über dem gemessenen Dauerlast-Plateau von 72 °C, aber unter der Drosselschwelle. 80 °C bedeutet also „etwas stimmt mit der Kühlung nicht", nicht „das Modell rechnet gerade".

Die generischen NUC-Regeln (node-alerts.yml) wurden im selben Zug auf job="node-exporter" eingegrenzt — ihre RAM-Schwelle von 85 % hätte hier sonst bei jedem geladenen Modell angeschlagen.

Warum llama-swaps /metrics nicht eingebunden ist

llama-swap hat einen /metrics-Endpunkt, der aber ausschließlich Host-Kennzahlen liefert: CPU-Auslastung, Speicher, Swap, Load Average, Netz-Bytes. Das ist deckungsgleich mit dem, was node_exporter ohnehin liefert, und zwar schlechter — CPU ohne Modus-Aufschlüsselung, Netz ohne Interface-Label.

Die Kennzahlen, die interessant wären — geladenes Modell, Swap-Vorgänge, Tokens/s, Anfragedauer — exportiert llama-swap nicht. Überwacht wird deshalb nur die Erreichbarkeit über /health. Als Blackbox-Ziel ist das noch nicht eingebunden; dafür bräuchte es den blackbox_exporter auf dem NUC.

Prüfen

curl -s localhost:9100/metrics | grep -c '^node_'      # >100 erwartet
curl -s localhost:9100/metrics | grep '^aiserver_'     # 5 GPU-Werte + Backup-Zeitstempel

# Collector testen, ohne die Produktionsdatei anzufassen
TEXTFILE_DIR=/tmp /opt/aiserver/monitoring/gpu-textfile-collector.sh && cat /tmp/gpu.prom