venerdì 11 maggio 2012

CPU governor, quale scegliere?

Si sa, un argomento estremamente importante per il powersaving è il regime di funzionamento del processore, più nello specifico la frequenza in cui essa lavora.
È intuitivo capire che più alta è la frequenza, più operazioni al secondo vengono effettuate, più energia viene consumata/dissipata.

Il kernel linux possiede il modulo cpufreq che permette di modificare la frequenza di lavoro, il quale offre vari governor, ossia dei preset per ottimizzare i parametri discussi tra poco in diverse condizioni in cui può trovarsi l'utente:

  • up_threshold: carico della cpu sopra il quale viene aumentata la frequenza
  • down_threshold: carico della cpu sotto il quale viene diminuita la frequenza
  • sampling_rate: tempo espresso in usec in cui viene analizzato il carico sulla cpu
  • sampling_down_factor: moltiplicatore del fattore sampling_rate
  • freq_step: percentuale di aumento/diminuzione della frequenza ogni volta che si raggiunge un carico pari ad {up,down}_threshold
La differenza tra i vari governor sta prevalentemente in questi 4 fattori, situati in /sys/devices/system/cpu/cpufreq/*nomegovernor*/.

Ora andiamo ad analizzare i parametri di default dei governor più interessanti, ondemand e conservative, cioè quelli in cui c'è uno switch frequenziale dinamico.
Esistono anche altri governor come performance e powersave, ma bloccando la frequenza rispettivamente al massimo e al minimo possibile la comprensione è immediata.

ONDEMAND:

  • up_threshold=95
  • sampling_rate=10000
  • sampling_down_factor=1

CONSERVATIVE:

  • up_threshold=75
  • down_threshold=25
  • sampling_rate=20000
  • sampling_down_factor=1
  • freq_step=5
Nella maggior parte dei nuovi atom, gli unici step disponibili sono due: il minimo a  1GHz e il massimo a 1.5GHz. Una caratteristica un po' controintuituva, forse per il nome del governor, è il fatto che nei processori di questo tipo conservative consuma di più rispetto ondemand! Infatti basta che il carico salga al 75% e il processore schizza alla frequenza massima. Inoltre prima di tornare alla frequenza minima deve aspettare 20 msec, il doppio rispetto ondemand!
Queste caratteristiche fanno di conservative un governor performante, utile nell'utilizzo in ac-plug e di ondemand leggermente migliore durante l'alimentazione a batteria (anche se non è lo stesso la scelta ottima).

Ottimizzazione dei governor:

È possibile fare di meglio? Certo. Come abbiamo appena visto, ondemand porta con sé delle limitazioni che possono essere superate configurando bene conservative, che andremo ad usare in tutte le seguente configurazioni. 
Andiamo a vedere nel dettaglio i valori migliori per la differenza più interessante che un utente può voler ottimizzare:

AC-PLUGGED:

Vogliamo prestazioni che più si avvicinano ad un clock sempre al massimo e non ci interessa il consumo di batteria. Consiglio:
  • up_threshold=55
  • down_threshold=15
  • sampling_rate=20000
  • sampling_down_factor=5
  • freq_step=50
Il down_threshold è così basso perchè avendo solo 2 frequenze, è utilizzato solo quando da 1.5GHz devo passare a 1GHz, condizione che voglio si verifichi solo quando il pc è nell'intorno dell'idle.
Inoltre ho modificato il tempo di campionamento, alzandolo a 100 msec, infatti è inutile farlo salire e scendere troppo spesso non dovendomi preoccupare della batteria.
Non sono riuscito a capire se il parametro freq_step possa servire o no. Non credo si possa fissare a piacimento la frequenza (step di passo random), ma nel dubbio ci creiamo ugualmente 2 step.

AC-UNPLUGGED:

Vogliamo avere il massimo delle prestazioni che ci consentono una lunga durata della batteria preferibilmente sentendo il meno possibile la perdita di potenza di calcolo derivante dall'utilizzo di frequenze basse.
Per raggiungere l'obiettivo, consiglio:
  • up_threshold=80
  • down_threshold=40
  • sampling_rate=20000
  • sampling_down_factor=1
  • freq_step=20
Questi parametri forzano la cpu a rimanere più bassa possibile e fa ottenere delle rampe di salita/discesa molto rapide.

Questo è il riassunto degli ultimi commit dei miei script acpi, che potete prendere come spunto per una migliore comprensione dell'utilizzo pratico!
Se avete altre visioni rispetto alla mia fatemela sapere nei commenti! :)

Oss: si può associare il cambio di governor all'evento acpi ac-plug/unplug come spiega melko nella sua guida sulla creazione degli script.

Oss: la sampling_rate dipende dal parametro CONFIG_HZ del vostro kernel, quindi può essere che non possiate usare valori troppo bassi. Io ho testato il tutto col kernel-netbook che lavora a 1000Hz.


Approfondimenti:

http://www.mjmwired.net/kernel/Documentation/cpu-freq/governors.txt

http://forum.xda-developers.com/showthread.php?t=1369817

http://publib.boulder.ibm.com/infocenter/lnxinfo/v3r0m0/index.jsp?topic=%2Fliaai%2Fcpufreq%2FTheConservativeGovernor.htm

4 commenti:

  1. Salve a tutti, io ho un asus 1215n, e cercando di applicare le nozioni acquisite da questa guida sul mio pc, ho notato che la cartella /sys/devices/system/cpu/cpufreq/ è vuota, questo cosa significa? devo configurare qualcos'altro?
    Ringrazio tutti in anticipo.

    RispondiElimina
  2. Mi associo alla richiesta di Donato; io ho un Eeepc 1000H e la cartella è vuota

    RispondiElimina
  3. Ciao, per caso avete installato il pacchetto cpufrequtils?

    RispondiElimina
  4. @Donato @Pliniux
    avete il modulo eeepc_laptop caricato?

    RispondiElimina

EDIT 30/12/2017: abbiamo deciso di chiudere i commenti ma lasciare le guide intatte.

Nota. Solo i membri di questo blog possono postare un commento.