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:
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.