rabin.blog

Fix Proxmox High CPU Temperature on Dell OptiPlex Micro: The CPU Governor Trick

Dell OptiPlex Proxmox running hot? Fix the CPU governor before buying new hardware

If a Dell OptiPlex Micro running Proxmox stays around 70+ °C at low load, check whether Linux is using the performance CPU governor with intel_pstate active; switching to powersave and persisting it with a small systemd oneshot service can drop temperatures kind of, magically.

Problem: Proxmox Host Stayed Hot Even After Hardware Maintenance

This incident happened on a Dell OptiPlex 7070 Micro running Proxmox VE as an always-on homelab control-plane node. To avoid exposing private infrastructure details, I will call the machine Proxmox node-02 for the readers.

The symptom was simple but worrying: CPU temperatures were sitting around 71–72°C during normal operation. That is not necessarily an instant danger for an Intel CPU, but it is warmer than I wanted for a 24/7 mini PC running critical home services.

The worrying part was that normal hardware maintenance had already been done:

  • Thermal paste had been replaced.
  • The internal CPU fan had been replaced.
  • The chassis had been cleaned.
  • The node was still functional, but thermal headroom looked poor.

Because the machine hosted services such as Proxmox workloads, Home Assistant, MQTT, Zigbee2MQTT, and UPS monitoring, the concern was not only noise or comfort. The concern was the long-term reliability of a machine that was expected to stay online all day.

At that point, I was scratching my head because if I wanted to replace this machine, it would take out some significant money.

Before spending any money, I checked the operating system’s power-management state.

Assessment: The CPU Governor Was the Real Clue

The important discovery was that the CPU frequency governor was set to performance, while Intel P-state management was active.

Commands used to check the governor

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 2>/dev/null | sort -u
cat /sys/devices/system/cpu/intel_pstate/status 2>/dev/null

The incident result was:

performance
active

That combination explained why a small, always-on Proxmox machine could remain hotter than expected. With the performance governor, the system prefers higher performance states instead of aggressively lowering frequency during lighter periods. On a tiny Dell Micro chassis, that can mean a warmer CPU package even when the machine is not doing heavy work.

The package path that did not work

A common older Linux answer is to install cpufrequtils and run cpufreq-set. On this Debian/Proxmox environment, that path failed:

apt install -y cpufrequtils
cpufreq-set -r -g powersave

The relevant failure was:

Package cpufrequtils is not available, but is referred to by another package.
Error: Package 'cpufrequtils' has no installation candidate
-bash: cpufreq-set: command not found

That failure was not a blocker. Because the kernel cpufreq sysfs interface was present, the governor could be changed directly by writing powersave into each CPU’s scaling_governor file.

Solution: Persist the Powersave Governor with systemd

The fix was to set every CPU core governor to powersave and make that setting persistent at boot with a systemd oneshot service.

The immediate manual command is:

for g in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
  echo powersave > "$g"
done

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 2>/dev/null | sort -u

Expected result:

powersave

However, a manual sysfs write is not enough because it may be lost after reboot, kernel changes, or later power-management changes. That is why the permanent solution uses systemd.

Highlighted solution for Proxmox Dell OptiPlex Micro high CPU temperature

If your Proxmox Dell OptiPlex Micro has high idle or low-load CPU temperatures and cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | sort -u returns performance, create /etc/systemd/system/cpu-governor-powersave.service and set the CPU governor to powersave on boot. This was the fix that changed the host from roughly 71–72 °C to a much healthier temperature range of 41–45 °C.

Copy-Paste Fix Code

Run the following commands as root on the Proxmox host. Proxmox hosts commonly use root shells, so the commands below intentionally do not include sudo.

cat > /etc/systemd/system/cpu-governor-powersave.service <<'EOF'
# ============================================================
# Script Name: cpu-governor-powersave.service
# Description:
# Sets CPU frequency governor to powersave on boot for lower
# thermal load on an always-on Proxmox mini PC.
#
# Dependencies:
# - Linux cpufreq sysfs interface
# - systemd
#
# Usage:
# systemctl enable --now cpu-governor-powersave.service
#
# Notes:
# - This intentionally favors thermal stability over maximum
#   burst CPU performance.
# - Hostname and LAN details are intentionally not embedded.
# ============================================================

[Unit]
Description=Set CPU governor to powersave
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'for g in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo powersave > "$g"; done'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now cpu-governor-powersave.service

Is this the same code still active on the original node?

Yes. I rechecked the live Proxmox host before finalizing this article. The public version above removes private comments such as the original node label, but the active service logic is the same. The live service still uses:

Type=oneshot
ExecStart=/bin/sh -c 'for g in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo powersave > "$g"; done'
RemainAfterExit=yes
WantedBy=multi-user.target

The service is currently enabled and active (exited), which is the expected state for a successful one-shot service with RemainAfterExit=yes.

How to Verify the Fix

After enabling the service, verify three things:

  1. The service is enabled.
  2. The service ran successfully.
  3. The current governor is powersave.
systemctl status cpu-governor-powersave.service --no-pager
systemctl is-enabled cpu-governor-powersave.service
systemctl is-active cpu-governor-powersave.service

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 2>/dev/null | sort -u
cat /sys/devices/system/cpu/intel_pstate/status 2>/dev/null

sensors

Expected governor and P-state output:

powersave
active

On the live host, verification showed:

cpu-governor-powersave.service: enabled
cpu-governor-powersave.service: active
CPU governors: powersave
intel_pstate: active

The current observed thermal reading was also healthy for this machine class:

CPU package: about 43°C
CPU cores:   about 41–44°C
PCH:         about 42°C
NVMe:        about 35°C

Temperatures vary with ambient room temperature, dust, BIOS profile, workload, paste quality, and fan condition. The important point is not that every Dell Micro will show the same number. The significant point is that the governor changed from performance to powersave and the thermal baseline dropped substantially.

Why I Did Not Use Cron

A cron entry could repeatedly write powersave into sysfs. For example, someone might suggest running a line every few minutes or at reboot. I did not choose that approach because this is not a recurring task. It is a boot-time configuration state.

Why systemd is the better fit

  • Correct lifecycle: the governor only needs to be applied at boot or when the service is explicitly restarted.
  • Clear status: systemctl status cpu-governor-powersave.service shows whether the fix ran successfully.
  • Better logging: failures appear in the journal with the service name.
  • No repeated writes: cron would keep writing the same value forever even when nothing changed.
  • Cleaner operations: the service can be enabled, disabled, restarted, inspected, and documented like other host configuration.
  • Boot ordering: systemd makes it explicit that this runs as part of the normal boot target.

Use cron for repeated scheduled work. Use systemd for machine state that should be applied and tracked as part of boot. This CPU governor fix is the second category.

Observed Result

Before the fix, CPU temperatures were observed around 71–72°C, even after paste replacement, fan replacement, and cleaning.

Immediately after switching to powersave, temperatures dropped into a much healthier range. The incident note recorded readings such as:

CPU package: about 56°C
CPU cores:   about 52–56°C
PCH:         about 56°C
NVMe:        about 38°C

On later live verification, the same host was even cooler under its then-current workload:

CPU package: about 43°C
CPU cores:   about 41–44°C
PCH:         about 42°C
NVMe:        about 35°C

That changed the decision. Instead of replacing the Dell OptiPlex Micro because it appeared too hot for 24/7 use, the host remained in service, and the hardware replacement wasn’t necessary.

Troubleshooting and Edge Cases

If /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor does not exist

Your kernel, CPU driver, BIOS settings, or virtualization environment may not expose cpufreq governor controls in the same way. Check:

ls /sys/devices/system/cpu/cpu0/cpufreq/
cat /sys/devices/system/cpu/intel_pstate/status 2>/dev/null
cat /sys/devices/system/cpu/amd_pstate/status 2>/dev/null

If there is no cpufreq sysfs interface, this exact fix does not apply. Look at BIOS power settings, kernel CPU frequency drivers, and Proxmox/kernel documentation for your CPU generation.

If the service is active but the governor is still performance

Check for another tool or service changing the governor after boot:

systemctl list-unit-files | grep -Ei 'power|tuned|cpufreq|thermald'
journalctl -b --no-pager | grep -Ei 'governor|cpufreq|pstate|tuned|thermald'

If another service deliberately sets performance, do not blindly fight it. Decide which policy should own CPU power management and disable or reconfigure the conflicting service.

If temperatures are still high after powersave

Then the governor was not the only problem. Continue with normal thermal checks:

  • Confirm the fan actually spins and ramps under load.
  • Check heatsink mounting pressure and paste application.
  • Clean dust from intake and exhaust paths.
  • Review BIOS thermal profile, Intel Turbo Boost, C-states, SpeedStep, and Speed Shift.
  • Check whether a VM, LXC, backup, or indexing task is creating real load.
  • Compare idle temperature after 10–15 minutes of low load.

For Your Checklist

If you found this article because your Proxmox Dell OptiPlex Micro is running hot, follow this order before replacing hardware:

  1. Check current temperatures with sensors.
  2. Check the current CPU governor with cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 2>/dev/null | sort -u.
  3. Check P-state mode with cat /sys/devices/system/cpu/intel_pstate/status 2>/dev/null.
  4. If the governor is performance, test powersave manually.
  5. If temperatures improve, install the cpu-governor-powersave.service systemd service.
  6. Reboot during a maintenance window and verify the governor remains powersave.
  7. Only then decide whether hardware replacement is still justified.

Bottom line: for this Proxmox Dell OptiPlex Micro high-temperature case, the root cause was not failed cooling hardware. The CPU governor was set to performance. Changing it to powersave and persisting that state with a systemd oneshot service fixed the thermal baseline and avoided an unnecessary device replacement.

Comments

Loading comments...