sabato 11 dicembre 2010

Scaliamo il nostro processore con un semplice script

Siete stufi di quella inutile applet che brutta il bellissimo pannello di Gnome, appesantendo il sistema con uno spropositato consumo di ram? Siete stanchi di vedere quei tipacci di KDE o, peggio ancora, quelli di Xfce vantarsi dei loro migliori sistemi di gestione della CPU ed in generale della gestione energetica? Ecco quello che fa per voi!

Il sistema qui proposto si basa su uno script talmente banale che sono stato in grado di crearlo io stesso, che sono tutt'altro che esperto, ed è in grado di funzionare su tutti i Desktop Environment, su tutte le distro e su tutti i computers. L'unico prerequisito è disporre di un processore che supporti lo scaling.
Lo usavo pure sul mio defunto portatilone (sia pace alla CPU sua!), che, è bene precisarlo, non è passato a miglior vita proprio a causa dello script! :-D
Tuttavia, se vi esplode il pc, non sarò considerato io il responsabile!

Creiamo lo script

La prima cosa da fare è aprire un editor di testo qualunque e copiarvi il seguente testo:
#!/bin/bash
#
# by Doc
# released under GPL

state=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor`

if [ "$state" = "ondemand" ] ; then
 sudo cpufreq-set -c 1 -g conservative
 sudo cpufreq-set -c 0 -g conservative
 DISPLAY=:0.0 /usr/bin/notify-send "CPUFreq: Conservative" -i "/usr/share/icons/gnome/32x32/devices/ac-adapter.png" 2>/dev/null
elif [ "$state" = "conservative" ] ; then
 sudo cpufreq-set -c 1 -g powersave
 sudo cpufreq-set -c 0 -g powersave
 DISPLAY=:0.0 /usr/bin/notify-send "CPUFreq: Powersave" -i "/usr/share/icons/gnome/32x32/devices/ac-adapter.png" 2>/dev/null
elif [ "$state" = "powersave" ] ; then
 sudo cpufreq-set -c 1 -g ondemand
 sudo cpufreq-set -c 0 -g ondemand
 DISPLAY=:0.0 /usr/bin/notify-send "CPUFreq: Ondemand" -i "/usr/share/icons/gnome/32x32/devices/ac-adapter.png" 2>/dev/null
fi
Esaminiamo un attimo lo script!
Come si può notare, esso non fa altro che modificare ricorsivamente lo scaling della CPU, facendolo passare, ogni volta che viene lanciato, da ondemand ad conservative a powersave, per poi tornare a ondemand e riprendere il ciclo.
Ho usato solo questi tre governors, poiché sono quelli che uso, ma, se volete, non vi sarà difficile aggiungere gli altri disponibili, che potrete conoscere dando il sequente comando:
$ cpufreq-info
Tramite questo stesso comando, è anche possibile conoscere il numero di CPU possedute. Negli Atom il processore è uno, ma, a causa del cosiddetto hyper-threading, è visto come due. Se la situazione del vostro pc è diversa, non dovrete far altro che aggiungere le righe corrispondenti "sudo cpufreq-set blablabla", tenendo presente che la numerazione comincia da 0 e che quindi, se avete ad esempio 4 processori, dovrete contare fino a 3. Consiglierei inoltre di mettere i cpufreq-set in ordine decrescente, come nel mio script.

Un'altra cosa che potete cambiare agevolmente è l'icona che compare nella notifica. Io ho scelto /usr/share/icons/gnome/32x32/devices/ac-adapter.png, ma, se ne trovate una migliore...
A proposito: per avere le notifiche, accertatevi di aver installato notify-osd!

I passaggi successivi saranno salvare nella nostra home il file di testo con il nome cpusel (o altro di vostro gradimento), renderlo eseguibile e spostarlo in /usr/bin:
$ cd ~
$ chmod +x cpusel
$ sudo mv cpusel /usr/bin/
L'amico Marco, che ringrazio, nei commenti propone un paio di scripts alternativi, che riproduco di seguito:
#!/bin/bash
# by Marco
if [ -a .clock ]
 then
  #effettua la stessa operazione per tutti i processori
  for i in `cat /proc/cpuinfo | grep processor | cut -b 13`; do
   cpufreq-selector -g ondemand -c $i
  done
  rm ~/.clock
 else
  #effettua la stessa operazione per tutti i processori
  for i in `cat /proc/cpuinfo | grep processor | cut -b 13`; do
   cpufreq-selector -g performance -c $i
  done
  touch ~/.clock  
fi
#!/bin/bash
# by Marco
governor=$(zenity --title CPUFreq --list --text="Seleziona il governor" --hide-header --column check --column governor --radiolist true Ondemand false Performance false Conservative false Powersave)

if [ $governor ] ; then
 for i in `cat /proc/cpuinfo | grep processor | cut -b 13`; do
   cpufreq-selector -g $governor -c $i
 done
 DISPLAY=:0.0 /usr/bin/notify-send "CPUFreq: $governor" -i "/usr/share/icons/gnome/32x32/devices/ac-adapter.png" 2>/dev/null
fi
Questi due scripts sono più "generici" e dovrebbero andar bene su tutti i processori, qualunque sia la loro natura. Potremo comunque personalizzarli in base alle nostre esigenze e potremo renderli eseguibili a livello utente, sulla falsariga di quanto spiegato nella sezione seguente.

Diamo all'utente i permessi per eseguire lo script

Lo script è già perfettamente funzionante, ma deve essere lanciato da terminale, poiché richiede i permessi di amministratore. Se quindi vogliamo poterlo utilizzare anche a livello utente, dobbiamo dare a quest'ultimo tutti i necessarii permessi. Operiamo:
$ sudo visudo
ed aggiungiamo, nei punti corrispondenti, quanto segue:
# Cmnd alias specification
Cmnd_Alias CPUSEL = /usr/bin/cpusel, /usr/bin/cpufreq-set
...
...
# User privilege specification
root    ALL=(ALL) ALL
nome_utente ALL = (ALL) ALL, NOPASSWD: CPUSEL
sostituendo nome_utente con il nome con cui vi loggate.

Aggiungiamo una scorciatoia da tastiera dedicata

Oramai, il nostro script sarà lanciabile da terminale, ma non richiederà più la password di sudo. Tuttavia, e qui ringrazio l'amico Milozzy che me ne ha fatto venire l'idea (ebbene, sì: per mesi e mesi l'ho lanciato da terminale!!!), possiamo crearci una comoda combinazione da tastiera per lanciare lo script ogni qual volta ci serva. Io uso windows+f, ma voi potete scegliere quella che preferite!
Le modalità con cui creare questa scorciatoia dipendono dal Desktop Environment che utilizzate ed esulano dai limiti di questa guida.

---------------------------------
by Doc, last modified 15 December 2010
Powered by Bluefish

17 commenti:

  1. Essendo un privilegiato uso il tuo script da mesi e devo confermare che è comodissimo!

    RispondiElimina
  2. @Milozzy
    Sei stato ringraziato anche in guida.

    RispondiElimina
  3. L'ho visto e ti ringrazio: sono sempre nei tuoi pensieri.

    RispondiElimina
  4. Noi con Kde ce la passiamo meglio
    basta un "solid-powermanagement query cpufreq" per vedere i governors disponibili, mentre per impostarne uno "solid-powermanagement set cpufreq nome_governor"
    il tutto senza bisogno di privilegi di root :D

    RispondiElimina
  5. @Melko
    Tra l'altro, ci sarebbe da provare cpufreqd, che non conosco bene.

    Dovrebbesi poter configurare tramite un file /etc/default/cpufreqd.
    Voi ne sapete qualcosa?

    RispondiElimina
  6. piccola miglioria per il tuo script: potresti inserire al posto di
    sudo cpufreq-set -c 1 -g conservative
    e di ripeterlo per ogni cpu la seguente stringa:
    sudo cpufreq-set -c 1 -g conservative -r
    il parametro -r infatti modifica tutte le cpu di un processore multicore contemporaneamente, questo da anche una maggiore scalabilità allo script.

    RispondiElimina
  7. @fiorentux
    Purtroppo, ti debbo smentire!
    Il casino degli Atom sta proprio in quell'hyper-threading.
    Quindi, anche con l'opzione -r, se modifichi il proc. 0, la modifica non va ad agire sul proc. 1, e viceversa.

    Ora che ci penso, è proprio per questi motivi che avevo rinunciato ad un metodo "unico".
    Nel portatilone, invece, avevo un solo comando!

    RispondiElimina
  8. ciao,
    complimenti per il blog, è la prima volta che lo visito.
    quando usavo arch mi trovavo molto bene con cpufreqd, ma adesso che per alcuni motivi sono passato ad ubuntu, avevo bisogno di qualcosa che mi cambiava la frequenza in modo pulito e instantaneo, quindi ho messo su questo piccolo script http://pastebin.com/sgDmgbLZ
    credo che non ci siano bisogno di spiegazione; lo potresti usare per rendere il tuo script adatto a tutti i processori.
    Marco

    RispondiElimina
  9. @Marco
    Grazie mille!
    Lo studio ed eventualmente lo inserisco in guida. Sarebbe infatti opportuno inserire qualche altro governor.

    RispondiElimina
  10. ciao,
    a causa del delay delle notifiche, non capisci subito quale governor hai impostato, così ho tirato fuori questo, così non sapendo ne leggere ne scrivere in bash o tirato fuori anche questo: http://pastebin.com/FLv9txfQ
    spero possa essere utile a qualcuno.
    Marco

    RispondiElimina
  11. .... neanche in italiano so scrivere XD

    RispondiElimina
  12. @Marco
    Non saprai scrivere in italiano, ma conosci bene l'arte degli script! ;-)

    Graziosissimo quest'ultimo in zenity.

    RispondiElimina
  13. nono, ho semplicemente fatto qualche ricerca su San Google (radio list zenity, test variable bash) e tutto è venuto da se.
    comunque l'ultima "versione" è questa http://pastebin.com/sVRGCMcg

    RispondiElimina
  14. @Marco
    Ad ogni modo, complimenti!

    Li aggiungerò in guida, con tanto di ringraziamenti ad personam.

    RispondiElimina
  15. grazie mille, troppo gentile ;-)
    se rimetterò mano agli script, te li segnalerò

    RispondiElimina
  16. Doc visto che ultimamente nel blog si parla di compositing ti sottopongo un problemuccio legato all'argomento: uso regolarmente lo script, ma per non so quale ragione, se non ho compositing attivo, al cambio di frequenza oltre alla notifica corretta me ne compare un'altra del tutto indesiderata nell'angolo alto a sinistra dello schermo, sopra il pannello.
    Hai mai notato il fenomeno?

    RispondiElimina
  17. @Milozzy
    A dirti il vero, non ho mai notato il problema, forse perché xcompmgr c'è comunque.

    Inoltre, uso lo script pochissimo: all'avvio, metto conservative (preferisco farlo a mano e non automatizzarlo) e mi fisso ivi per tutto il tempo di uso del pc, sia a batteria sia a corrente.

    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.