Normalmente la rete è piena di articoli riguardanti su come overcloccare una CPU per spremere il massimo delle prestazioni per il gaming. Negli ultimi anni i produttori hanno sfornato processori con clock sempre più elevati che hanno quindi esigenze a livello di alimentazione e raffreddamento notevoli.
Ora nel caso specifico che ho affrontato mi sono concentrato sui MiniPC (tipo ACE-MAGIC, Minisforum, Beelink) che a costi molto contenuti (inferiori ai 500€) offrono MiniPC dotati di processore AMD Ryzen™ 9 6900HX e acceleratore grafico AMD Radeon™ 680M e che offrono prestazioni dignitose nel gaming ed eccellenti negli altri scenari. Questi processori tendono però a scaldare parecchio: AMD sostiene possono operare fino a 95°, ma è pacifico che queste temperature abbiano un impatto sulla loro aspettativa di vita e che comunque rendano la vita difficile
Del resto utilizzando questa CPU per usi normali non è difficile vedere innalzare temporaneamente le temperature oltre i 75° in presenza di picchi, anche se solo per pochi secondi. La domanda è: a cosa mi servono frequenze così alte in caso di utilizzo a bassa intensità? Si certo il sistema è in grado di gestire autonomamente (tramite il cpu_governor) le frequenze ma è possibile intervenire per creare una “policy” ancor più conservativa, andando a impostare un limite sulla frequenza di picco quando il sistema sistema è in modalità “power-save”.
Ad esempio, nel caso di picco, la frequenza massima è stata 4,94Ghz secondo i limiti fissati da AMD. Via software, ed in modo temporaneo, è possibile impostare la gestione in “power-save”, limitando la frequenza di picco a 2,50Ghz. Per farlo…
…1 Script…
…che ha come scopo di impostare il sistema in modalità “power-save” e quello di limitare la frequenza di picco a 2,50Ghz. Andiamo dunque a scrivere
$ sudo vi /usr/local/bin/set_low_clock.sh
n.b. mettendo il file set_low_clock.sh nel path indicato sarà eseguibile indipendentemente dal path in cui viene richiamato.
#!/bin/bash
# Target max frequency (e.g., 2.5GHz = 2500000 kHz)
MAX_FREQ="2500000"
# Set the governor to 'powersave' for all CPUs
for cpu in /sys/devices/system/cpu/cpu[0-9]*; do
echo "Setting powersave governor for $cpu"
echo powersave > "$cpu/cpufreq/scaling_governor"
done
# Set the maximum frequency
for cpu in /sys/devices/system/cpu/cpu[0-9]*; do
echo "Setting max freq to $MAX_FREQ for $cpu"
echo "$MAX_FREQ" > "$cpu/cpufreq/scaling_max_freq"
done
echo "CPU frequency limit set to $((MAX_FREQ / 1000)) MHz"
Successivamente andiamo a dare i permessi di esecuzione al file.
$ sudo chmod +x /usr/local/bin/set_low_clock.sh
E di conseguenza potremo lanciarlo con il comando sudo set_low_clock.sh e avremo questo risultato:

Il risultato è facilmente verificabile in tempo reale con il comando
$ watch -n1 "grep 'cpu MHz' /proc/cpuinfo"


che aprirà un terminale che ogni secondo si aggiorna con la frequenza effettiva di ogni singola CPU. Da notare che in Idle, con una temperatura ambientale di 27° C, la temperatura del processore si attesta sui 48° C. Durante lo stress test non ha mai superato i 62°C.
Rollback
Quando invece avrete bisogno della massima potenza del vostro processore, potrete sempre tornare alle impostazioni originali, tramite un’altro script
$ sudo vi /usr/local/bin/set_max_clock.sh
Il file sarà però un po’ diverso visto che, nell’ordine:
- leggerà la frequenza massima prevista dal costruttore
- Imposterà la cpu_governor in modalità “demand” o “performance” a seconda di quella supportata dal processore.
- Ripristinerà il valore di picco della CPU
#!/bin/bash
# Detect hardware maximum frequency (first CPU as reference)
MAX_FREQ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)
if [ -z "$MAX_FREQ" ]; then
echo "Unable to detect hardware max frequency. Exiting."
exit 1
fi
# Set the governor to 'ondemand' or 'performance'
for cpu in /sys/devices/system/cpu/cpu[0-9]*; do
echo "Restoring governor to 'ondemand' for $cpu"
echo ondemand > "$cpu/cpufreq/scaling_governor" 2>/dev/null || \
echo performance > "$cpu/cpufreq/scaling_governor"
done
# Set the max frequency to hardware max
for cpu in /sys/devices/system/cpu/cpu[0-9]*; do
echo "Restoring max freq to $MAX_FREQ for $cpu"
echo "$MAX_FREQ" > "$cpu/cpufreq/scaling_max_freq"
done
echo "CPU frequency limits reverted to $((MAX_FREQ / 1000)) MHz"
Successivamente andiamo a dare i permessi di esecuzione al file.
$ sudo chmod +x /usr/local/bin/set_max_clock.sh
E di conseguenza potremo lanciarlo con il comando sudo set_max_clock.sh e avremo questo risultato:

Il risultato è, di nuovo, facilmente verificabile in tempo reale con il comando
$ watch -n1 "grep 'cpu MHz' /proc/cpuinfo"

Durante lo stress test la CPU ha raggiunto velocemente gli 85°C
Conclusioni
Con questi due script è possibile gestire in maniera ottimale le performance di un MiniPC o di Laptop. Volendo si può mettere lo script in crontab al reboot, in modo da far partire sempre il sistema in modalità UNDERCLOCK: perché ad ogni riavvio il sistema torna alle impostazioni originali.
Gli script sono stati testati su Debian 12, ma dovrebbero funzionare anche su Ubuntu 22.04 e derivate.
No responses yet