fanmon — interaktives Terminal-Tool für GPU-Monitoring und Lüfterkurven

Wer eine AMD-Grafikkarte der RDNA3-Generation betreibt, stößt schnell auf ein Problem: Die Standard-Schnittstellen für Lüftersteuerung funktionieren nicht wie erwartet. Die GPU-Firmware übernimmt die Kontrolle — und ignoriert Schreibversuche auf die hwmon-PWM-Dateien. Dieser Beitrag erklärt den Workaround und das Tool, das dabei entstanden ist.

Das Problem mit RDNA3

Bei Navi-31-Karten (RX 7900-Serie) steuert der SMU-Firmware-Prozessor den Lüfter autonom. Schreibt man auf pwm1_enable, wird der Wert nach wenigen Sekunden automatisch zurückgesetzt. Tools wie fancontrol, CoolerControl oder MangoHud können die Lüfter daher nicht direkt steuern.

Der Weg: OverDrive-Interface

AMD stellt für RDNA3 ein spezielles sysfs-Interface bereit: gpu_od/fan_ctrl/. Darüber kann man eine 5-Punkt-Lüfterkurve direkt in die Firmware programmieren. Die GPU übernimmt dann diese Kurve — kein dauerhafter Daemon nötig, das SMU verwaltet den Lüfter selbst.

# Kurve setzen: Punkt-Index, Temperatur (°C), Duty (%)
echo "0 30 23" > gpu_od/fan_ctrl/fan_curve
echo "1 55 23" > gpu_od/fan_ctrl/fan_curve
echo "2 72 45" > gpu_od/fan_ctrl/fan_curve
echo "3 83 65" > gpu_od/fan_ctrl/fan_curve
echo "4 95 90" > gpu_od/fan_ctrl/fan_curve

# Aktivieren:
echo "c" > pp_od_clk_voltage

# Zurücksetzen auf Standard:
echo "r" > pp_od_clk_voltage

fanmon — das TUI

fanmon ist ein Python-Curses-Tool, das alle relevanten Sensor-Werte auf einen Blick zeigt und die Lüfterkurve interaktiv bearbeitbar macht:

  • GPU Junction/Edge-Temperatur (aus hwmon)
  • GPU Fan RPM und aktuelle Lüfterkurve
  • CPU-Temperaturen (Tctl/Tdie)
  • Gehäuselüfter RPM (NCT6687, falls vorhanden)
  • NVMe-Temperaturen

Im Kurven-Editor (e) wählt man mit den Pfeiltasten einen Punkt, wechselt mit Tab zwischen Temperatur und Duty, und ändert die Werte mit +/- oder direkt durch Eingabe. Enter schreibt die neue Kurve sofort in die Firmware und startet den Hintergrund-Daemon neu.

Architektur

fanmon ist zweigeteilt: Das TUI dient zur Anzeige und Konfiguration. Der eigentliche Lüfter-Daemon (fancurve) läuft als systemd-Service und überwacht, ob die Kurve noch aktiv ist — nach Resume aus Suspend oder nach einem GPU-Reset stellt er sie automatisch wieder her.

# Status abfragen:
systemctl status fancurve

# Logs:
journalctl -u fancurve -f

Die Skripte stehen als Download bereit:

💾
fanmon.py — Curses-TUI Monitor + Kurven-Editor
Download fanmon.py
💾
fancurve.py — systemd-kompatibler Fan-Curve-Daemon
Download fancurve.py
💾
fancurve.service — systemd Unit-Datei
Download fancurve.service

Update-Sicherheit

Der Daemon überlebt Kernel-Updates problemlos, da er keine Kernel-Module oder DKMS-Treiber verwendet — nur Standard-sysfs-Pfade. Bei GPU-Treiber-Updates (amdgpu-Paket) können sich die hwmon-Nummerierungen verschieben; dann müssen die Pfade im Skript einmalig angepasst werden.