Home > Guide > Governors e IO Scheduler: cosa sono, Impostazioni e loro utilizzo

Governors e IO Scheduler: cosa sono, Impostazioni e loro utilizzo

Pubblichiamo una guida sintetica sull’argomento Governors in ambiente Android, impostazioni presenti ormai in tutte le rom cucinate ma che non tutti conoscono per utilizzarli al meglio sul loro dispositivo, diamo uno sguardo ai più utilizzati.

I Governors ci permettono di modificare la resa del processore in base alle proprie esigenze andando a modificare la frequenza minima e quella massima di lavoro della CPU.

Il Governor è un driver presente nel kernel che ci permette di regolare la frequenza minima e massima della CPU e il tempo necessario ad essa per raggiungere il massimo o il minimo valore di frequenza di clock.

Ho cercato di riunire in questo post il maggior numero di governor con le loro descrizioni che ho trovato in giro per la rete. A fine post ho aggiunto anche gli I/O Scheduler.

Vediamo ora come influiscono sul funzionamento del nostro dispositivo e quali impostazioni vanno a toccare.

Ondemand:

Ondemand è la scelta predefinita, impostazioni equilibrate che offrono un buon compromesso: durata della batteria e prestazioni. Tuttavia non ha profili di sospensione e a volte (raramente) vi è un calo di prestazioni negli smartphone. Il governor più equilibrato, offre un buon compromesso tra la batteria e le prestazioni. Quando la CPU è sollecitata, aumenta rapidamente le frequenze per poi ridurle lentamente quando non è più necessario.

Powersave:

Con Powersave viene impostata sia la frequenza massima che quella minima al minimo valore possibile. Ovviamente non è consigliato per l’uso quotidiano in quanto la minima frequenza viene settata a pochi MHZ (128-256 MHz) e dunque non riusciremmo praticamente a fare nulla. Quindi imposta la frequenza massima rendendola uguale a quella minima.

Userspace:

Userspace consente di impostare manualmente le frequenze. E’ quello con cui si può personalizzare a proprio piacimento la frequenza minima e massima di lavoro.

Conservative:

Conservative è come Ondemand, ovvero setta una frequenza minima ed una massima oltre che ad un tempo in cui raggiungere tali limiti. L’unica differenza è che Conservative raggiunge il limite in un tempo doppio rispetto ad Ondemand essendo di tipo a rampa meno pendente. Il vantaggio però si ripercuote nella durata della batteria. Infatti più pendente è la rampa (ovvero più veloce, tendente verso l’alto) più si avrà un consumo di batteria.

Performance:

Come Powersave solo che imposta la massima frequenza di clock sia per frequenza minima che per quella massima di lavoro della CPU. Ovviamente non è indicato per l’utilizzo quotidiano in quanto la batteria non riuscirebbe a durare nemmeno per poche ore.

Interactive:

Come abbiamo detto, Conservative è come Ondemand solo che l’aumento della frequenza avviene più lentamente, dunque con una rampa più lenta rispetto ad esso. Con Interactive invece si ha un tempo di risposta più breve e dunque la frequenza sale con una rampa leggermente più pendente (alta) di Ondemand, rendendo il dispositivo più reattivo a scapito di un piccolo consumo di batteria in più. Interactive è un Ondemand leggermente più veloce: maggiori prestazioni ma al tempo stesso maggiore consumo di batteria.

InteractiveX:

Sostanzialmente è un Interactive modificato per dare più vita alla batteria. Le modifiche sono state apportate da imoseyon e provvedono ad una migliore gestione del dispositivo quando esso è in stand-by.

Smartass:

Anch’esso è basato su Interactive ma presenta dei miglioramenti sostanziali che lo fanno essere uno dei migliori in assoluto. Da poco compilata anche la versione Smartass V2 da Erasmux. —> Vedere Sotto

SmartassV2

E’ uno smartass modificato ed è uno dei governor più usati. Questo governor scala verso il basso la cpu molto velocemente mentre lo schermo è spento, e scala rapidamente verso l’alto fino a 500 mhz quando lo schermo si accende. Non c’è un limite superiore per la frequenza mentre lo schermo è spento. Questo governor mira a una “frequenza ideale”, per cui scala in maniera più aggressiva nei confronti di questa frequenza e in maniera meno aggressiva dopo. Esso utilizza diverse frequenze ideali per lo schermo acceso e per lo schermo spento, che sono awake_ideal_freq e sleep_ideal_freq, garantendo così un equilibrio tra prestazioni e durata batteria.

Smoothass:

E’ in pratica uno Smartass ma con una rampa più pendente (alta) dunque più prestazioni subito ma minore batteria.

BrazilianWax:

Fondamentalmente si discosta ben poco da Smoothass ed infatti non vi sono differenze di rilievo tra l’uno e l’altro Governor.

SavagedZen:

Esso è un kernel che si presenta basato sullo Smartass ma in questo caso non si va a penalizzare nulla, ovvero garantisce migliori prestazioni con un minor consumo di batteria. Quindi sia buone prestazioni che un consumo non eccessivo della batteria.

Minmax:

Questo kernel risulta essere uno dei migliori. Le prestazioni e la reattività sono molto elevate e rende l’utilizzo dei dispositivi molto piacevole. Esso è basato sul kernel Conservative.

Scary:

Basato sul Conservative che, come abbiamo detto prima, ha una rampa più lenta di Ondemand, ma poi ha in sè alcuni elementi di Smartass che gli fanno avere una rampa velocissima.

Lulzactive:

Basato sui governor interactive e smartass, tende ad essere il governor preferito da molti. Quando il carico di lavoro è maggiore o uguale al 60%, fa salire le frequenze della cpu immediatamente allo step successivo. Quando il carico di lavoro è inferiore al 60%, abbassa immediatamente le frequenze della cpu allo step precedente. Quando lo schermo è spento, la frequenza è bloccata alla frequenza minima.

Lazy:

Fondamentalmente un ondemand con il parametro aggiuntivo min_time_state che stabilisce un tempo minimo in cui la cpu permane su una determinata frequenza prima di passare a frequenze più basse o più alte. L’idea è quella di eliminare le instabilità causate dalla rapida commutazione di frequenza di ondemand. Ha anche un parametro screenoff_maxfreq che può essere configurato per specificare la max frequenza mentre lo schermo è spento.

Lagfree:

Simile a ondemand. La differenza è l’ottimizzazione che lo rende maggiormente battery friendly. La frequenza diminuisce o aumenta gradatamente, a differenza di ondemand che salta al 100% troppo spesso. Lagfree non salta le frequenze durante lo scaling verso l’alto o verso il basso.

Ondemandx:

Fondamentalmente un ondemand con un profilo screen off integrato che lo rende battery friendly. Quando lo schermo è spento, la frequenza massima è di 500 mhz.

Intellidemand:

(alias intelligente Ondemand) e un governor che si basa su ondemand e che non salta mai alla massima frequenza quando lo schermo è spento. L’intellidemand originale si comporta in modo diverso in base all’utilizzo della GPU. Quando la GPU è veramente occupato (giochi, mappe, benchmarking, ecc) intellidemand si comporta come ondemand per offrire buone prestazioni. Quando la GPU è a riposo o moderatamente occupata, intellidemand entra in “browsing mode” (modalità di navigazione) e limita la frequenza massima per risparmiare la batteria.

Lionheart:

E’ un Conservative pesantemente modificato: ha un’up-threshold bassa (circa 60) e una sampling_rate (frequenza di campionamento) più bassa possibile . Il motto di Lionheart è la reattività estrema, le prestazioni e la scorrevolezza, anche a costo di un maggiore dispendio della batteria.

lightassV2:

Governor ottimale per uno scaling della cpu aggressivo ma che non incide particolarmente sui consumi

IO scheduler

L’IO scheduler del kernel è la modalità di gestione degli input\output da parte del kernel.

Ora diamo un occhiata anche allo Scheduler che si trova sempre collegato ai Governors.
IO scheduler:

noop

—> di solito assicura la massima fluidità del sistema

sio

—> generalmente l’IO scheduler di default

bfq

—> idem come sopra

deadline

—> buona fluidità del sistema, in genere minore del noop

vr

—> simile al noop, ottima fluidità del sistema

CFQ

—>

Anticipatory

—>

Deadline

: si prefigge lo scopo di garantire un termine, una scadenza a tutte le richieste in modo da evitare fenomeni indesiderati come lo “starvation” ovvero l’eterna attesa di alcune richieste che si verifica quando uno o più processi di priorità bassa vengono lasciati indefinitamente nella coda dei processi pronti, perchè vi è sempre almeno un processo pronto di priorità più alta.

V(r)

: la richiesta successiva viene eseguita in base alla distanza dall’ultima richiesta. In rete girano buoni pareri riguardo questo scheduler.

No-op

: inserisce tutte le richieste in un’unica coda semplicemente in base al loro ordine di arrivo, raggruppando insieme quelle contigue.

SIO

: è lo scheduler più semplice, non fa alcun tipo di ordinamento, si prefigge solo lo scopo di ottenere una bassa latenza, di ridurre cioè il lasso di tempo che intercorre tra l’istante in cui la richiesta è generata e quello in cui la richiesta è soddisfatta.

CFQ

: ordina le richieste dei processi in code distinte per tipologia e assegna a ciascuna coda uno specifico intervallo di tempo la cui durata dipende dalla priorità assegnata ai processi. Può essere considerato l’Ondemand degli scheduler, è infatti lo scheduler più equilibrato, svolgendo il suo compito in maniera onesta.

BFQ

: è basato sul CFQ ma, invece degli intervalli di tempo, assegna una parte della larghezza di banda del disco a ogni processo in esecuzione in modo proporzionale.

Anticipatory

: ordina le richieste in base a criteri predittivi, mette cioè in pausa le richieste per un brevissimo periodo di tempo in previsione che arrivino altre richieste simili in modo da aggregarle.

Grazie a Bono per aver ricercato e tradotto questa breve guida.

  1. David
    17 luglio 2013 a 20:37 | #1

    Grazie mille per l’ottima guida molto utile già messa in pratica 🙂

    • Anonimo
      17 luglio 2013 a 22:29 | #2

      Grazie a te per il commento…
      Spero che ci darai anche qualche feed sui risultati che hai ottenuto.;)

  2. Daniele Mameli
    25 settembre 2013 a 21:54 | #3

    Io ho anche il pegasusq…..qualcuno puo spiegarmi pregi e difetti?

  3. Raffaele Dowier Paciello
    3 agosto 2015 a 0:34 | #4

    e tra reno e cubic che differenza c’è ? (gli i/o net scheduler)

  1. 5 agosto 2015 a 20:32 | #1