Mini-PC mit Proxmox läuft im Idle heiß: der Fix über den CPU-Governor
Auf meinem Mini-PC in Berlin laufen Proxmox und ein paar Dienste, die immer an sein müssen: Game-Server, Home Assistant und der Reverse Proxy. Eines Tages zeigte mir eine Monitoring-App 88 °C für die CPU an. Die Load Average lag dabei bei etwa 0,3, der Server hatte also praktisch nichts zu tun. Der Fix war am Ende eine kurze Schleife in der Shell, ohne Reboot.

Die Hardware
Der Host ist ein Minisforum MS-01* mit Intel Core i9-13900H. Das ist eine Laptop-CPU mit viel Boost-Spielraum, in einem kleinen Gehäuse mit entsprechend kleinem Kühler.
Erst mal nachschauen
Bei Intel-CPUs steuert unter Linux der Treiber intel_pstate die Taktfrequenz. Welcher Governor aktiv ist und welche Energy Performance Preference (EPP) gesetzt ist, siehst du so:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference
grep MHz /proc/cpuinfo
Bei mir stand der Governor auf performance und die EPP ebenfalls auf performance. Die Kerne liefen dadurch auch im Leerlauf irgendwo zwischen etwa 1,5 und 5 GHz, im Schnitt habe ich rund 1,8 GHz gemessen. Mehr Takt heißt mehr Spannung, und die landet als Wärme im kleinen Gehäuse.
Die EPP ist ein Hinweis an die CPU, wie sie zwischen Leistung und Stromsparen abwägen soll. Die möglichen Werte zeigt dir energy_performance_available_preferences im selben Ordner. Üblich sind default, performance, balance_performance, balance_power und power. Mit performance hält die CPU den Takt lieber hoch, damit sie bei der nächsten Anfrage sofort bereit ist. Auf einem Desktop zum Zocken mag das Sinn ergeben, auf einem Server, der die meiste Zeit wartet, produziert es nur Wärme.
Die Temperatur selbst liest du am einfachsten mit lm-sensors aus. Auf dem Proxmox-Host:
apt install lm-sensors
watch -n 2 sensors
Interessant ist der Wert „Package id 0“, das ist die Temperatur der ganzen CPU. Lass das ein paar Minuten laufen, die Spitzen sieht man nicht bei einem einzelnen Blick.
Der Fix ohne Reboot
Governor und EPP lassen sich zur Laufzeit über sysfs ändern. Diese Schleife setzt für alle Kerne den Governor auf powersave und die EPP auf balance_performance:
for c in /sys/devices/system/cpu/cpu*/cpufreq; do
echo powersave > $c/scaling_governor
echo balance_performance > $c/energy_performance_preference
done
Die Reihenfolge in der Schleife ist Absicht. Solange der Governor auf performance steht, lässt intel_pstate keine andere EPP zu, deshalb kommt der Governor zuerst.
Der Name „powersave“ führt in die Irre. Mit intel_pstate heißt das nicht, dass die CPU gedrosselt wird. Unter Last boostet sie weiterhin auf vollen Takt, sie darf im Leerlauf nur auch wirklich runtertakten.
Vorher und nachher
| Im Idle | Vorher | Nachher |
|---|---|---|
| Package-Temperatur | ca. 61 bis 67 °C, Spitzen bis 88 °C | ca. 57 bis 59 °C |
| Durchschnittlicher Takt | ca. 1,8 GHz | ca. 430 MHz |
| Governor / EPP | performance / performance | powersave / balance_performance |

Dauerhaft machen mit systemd
Werte in sysfs sind nach einem Reboot wieder weg. Damit die Einstellung bleibt, läuft bei mir ein kleiner oneshot-Service beim Booten. Leg dafür /etc/systemd/system/cpu-powersave.service an:
[Unit]
Description=CPU governor powersave und EPP balance_performance
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c 'for c in /sys/devices/system/cpu/cpu*/cpufreq; do echo powersave > $$c/scaling_governor; echo balance_performance > $$c/energy_performance_preference; done'
[Install]
WantedBy=multi-user.target
Achte auf das doppelte $$c. systemd ersetzt in ExecStart selbst Variablen, mit einem einfachen $c käme bei der Shell nur ein leerer String an. Dann aktivieren:
systemctl daemon-reload
systemctl enable --now cpu-powersave.service
Prüfen, dass nichts zurückstellt
Bevor ich mich auf den Service verlassen habe, habe ich geschaut, ob irgendetwas anderes den Governor wieder auf performance setzt, etwa ein Cronjob oder cpufrequtils:
grep -rs scaling_governor /etc/cron* /var/spool/cron /etc/systemd /etc/rc.local
dpkg -l | grep -i cpufrequtils
cat /etc/default/cpufrequtils 2>/dev/null
Bei mir war nichts davon gesetzt. Nach einem Reboot zeigt cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor wieder powersave, und systemctl status cpu-powersave sollte „active (exited)“ melden.
Was ist mit AMD?
Mein zweiter Proxmox-Host in Berlin hat eine AMD-Ryzen-CPU. Der lag beim Nachschauen bei 20 °C, also habe ich ihn so gelassen. Bei AMD heißen Treiber und Optionen auch anders, die Befehle oben sind für intel_pstate gedacht.
Wenn es danach immer noch heiß wird
Springt die Temperatur im Idle auch mit powersave noch über 80 °C, liegt es wahrscheinlich an der Kühlung. Bei Mini-PCs setzt sich der kleine Kühler gern mit Staub zu, dann hilft Aufschrauben und Saubermachen. Wenn du das Gehäuse sowieso offen hast, kannst du bei der Gelegenheit auch die Wärmeleitpaste erneuern.
Hast du deinen Homelab-Server auch schon mal im Idle heiß laufen sehen? Schreib in die Kommentare, woran es bei dir lag.
* Affiliate-Link: Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Für dich ändert sich am Preis nichts. Mehr dazu