Patch Con Kolivas: incrementare le prestazioni desktop: differenze tra le versioni

nessun oggetto della modifica
(non esistono più)
Nessun oggetto della modifica
Riga 1: Riga 1:
== Introduzione ==
== Introduzione ==
Le patch ''Con Kolivas'' (<tt>-ck</tt>) per il [[kernel]] di Linux sono una serie di patch che incrementano notevolmente le prestazioni desktop implementando uno scheduler innovativo (''staircase''), ottimizzando l'uso dello swap (''swap-prefetching'') e del sotto-sistema disco, e aggiungendo dei nuovi livelli di priorità al di fuori di quelli tradizionalmente impostabili con <code>nice</code>.
Le patch ''Con Kolivas'' (<code>-ck</code>) per il [[kernel]] di Linux sono una serie di patch che incrementano notevolmente le prestazioni desktop implementando uno scheduler innovativo (''staircase''), ottimizzando l'uso dello swap (''swap-prefetching'') e del sotto-sistema disco, e aggiungendo dei nuovi livelli di priorità al di fuori di quelli tradizionalmente impostabili con <code>nice</code>.


Con queste patch si ottiene un sistema desktop estremamente responsivo ed ottimizzato per l'uso interattivo.
Con queste patch si ottiene un sistema desktop estremamente responsivo ed ottimizzato per l'uso interattivo.


Se vi siete chiesti come mai Gentoo o Archlinux sono così veloci su desktop la risposta sta principalmente nell'inclusione delle patch <tt>-ck</tt> nei loro kernel di default.
Se vi siete chiesti come mai Gentoo o Archlinux sono così veloci su desktop la risposta sta principalmente nell'inclusione delle patch <code>-ck</code> nei loro kernel di default.


L'ultima di queste patch è stata sviluppata per il kernel 2.6.22. Dopo questa versione l'amareggiato Con Kolivas ha abbandonato lo sviluppo della patch.
L'ultima di queste patch è stata sviluppata per il kernel 2.6.22. Dopo questa versione l'amareggiato Con Kolivas ha abbandonato lo sviluppo della patch.


Con Kolivas manteneva anche un altro insieme di patch, chiamate <tt>-cks</tt>, che sono specificatamente pensate per ottimizzare le prestazioni dei server.
Con Kolivas manteneva anche un altro insieme di patch, chiamate <code>-cks</code>, che sono specificatamente pensate per ottimizzare le prestazioni dei server.


== Descrizione della patch ==
== Descrizione della patch ==
Riga 14: Riga 14:
=== Staircase Deadline Scheduler ===
=== Staircase Deadline Scheduler ===


Le patch <tt>-ck</tt> (per il kernel 2.6.21 o successivi) includono l'innovativo scheduler '''''S'''taircase '''D'''eadline'' (chiamato semplicemente ''SD''). Questo scheduler è l'evoluzione del secondo scheduler dei processi scritto da zero da Con Kolivas (il primo scheduler chiamato ''Staircase'' è stato anch'esso molto innovativo). Le sue caratteristiche principali sono la sua ''fairness'' garantita (tutti i processi della stessa priorità consumano esattamente la stessa CPU) e la sua spiccata ''interattività''. Con Kolivas ha mostrato al mondo per la prima volta che uno scheduler per Linux completamente ''fair'' e con una interattività molto elevata (superiore al mainline) non era solo teoricamente ma anche praticamente possibile. Il vantaggio di un ''fair'' scheduler è la sua assoluta immunità a ''starvation'' che affigge l'attuale scheduler mainline e (in misura minore) il vecchio ''Staircase''.  
Le patch <code>-ck</code> (per il kernel 2.6.21 o successivi) includono l'innovativo scheduler '''''S'''taircase '''D'''eadline'' (chiamato semplicemente ''SD''). Questo scheduler è l'evoluzione del secondo scheduler dei processi scritto da zero da Con Kolivas (il primo scheduler chiamato ''Staircase'' è stato anch'esso molto innovativo). Le sue caratteristiche principali sono la sua ''fairness'' garantita (tutti i processi della stessa priorità consumano esattamente la stessa CPU) e la sua spiccata ''interattività''. Con Kolivas ha mostrato al mondo per la prima volta che uno scheduler per Linux completamente ''fair'' e con una interattività molto elevata (superiore al mainline) non era solo teoricamente ma anche praticamente possibile. Il vantaggio di un ''fair'' scheduler è la sua assoluta immunità a ''starvation'' che affigge l'attuale scheduler mainline e (in misura minore) il vecchio ''Staircase''.  


Per maggiori dettagli tecnici su ''SD'':
Per maggiori dettagli tecnici su ''SD'':
* [http://ck.wikia.com/wiki/SD Con Kolivas Wiki: SD]
* [http://ck.wikia.com/wiki/SD Con Kolivas Wiki: SD]


Per un di storia sulla nascita, l'evoluzione e sulla ''competizione'' con un nuovo scheduler scritto da Ingo Molnar (CFS) inspirato dal successo di ''SD'' potete leggere:
Per un po' di storia sulla nascita, l'evoluzione e sulla ''competizione'' con un nuovo scheduler scritto da Ingo Molnar (CFS) inspirato dal successo di ''SD'' potete leggere:


* [http://lwn.net/Articles/224865/ The Rotating Staircase Deadline Scheduler]
* [http://lwn.net/Articles/224865/ The Rotating Staircase Deadline Scheduler]
Riga 28: Riga 28:


=== Swap prefetching ===
=== Swap prefetching ===
Altra patch inclusa è la così detta ''swap prefetching''. In pratica questa patch ottimizza l'uso dello swap precaricando delle pagine non appena della ram risulta disponibile (non quando le pagine sono richieste come sul [[kernel vanilla]]), e questo velocizza notevolmente il passaggio tra le grosse applicazioni se ad esempio se ne chiude una. Inoltre vengono tenute in swap anche pagine caricate in ram in modo da rendere immediato un successivo ''swap-out''.
Altra patch inclusa è la così detta ''swap prefetching''. In pratica questa patch ottimizza l'uso dello swap precaricando delle pagine non appena della RAM risulta disponibile (non quando le pagine sono richieste come sul [[kernel vanilla]]), e questo velocizza notevolmente il passaggio tra le grosse applicazioni se ad esempio se ne chiude una. Inoltre vengono tenute in swap anche pagine caricate in RAM in modo da rendere immediato un successivo ''swap-out''.


Con questa patch l'utilizzo apparente dello swap sarà maggiore ma in realtà questo è dovuto alle ottimizzazioni fatte per incrementare di prestazioni.
Con questa patch l'utilizzo apparente dello swap sarà maggiore ma in realtà questo è dovuto alle ottimizzazioni fatte per incrementare le prestazioni.


=== Nuove priorità: SCHED_ISO, SCHED_IDLEPRIO ===
=== Nuove priorità: SCHED_ISO, SCHED_IDLEPRIO ===
Riga 41: Riga 41:
; SCHED_FIFO: usata per processi realtime. Un processo SCHED_FIFO avrà priorità superiore ad ogni altro processo (anche SCHED_NORMAL con nice -20). Normalmente processi con tali privilegi possono essere lanciati solo da root a meno di non usare [[Low-latency_2.6_kernel_per_applicazioni_audio_realtime#Modalit.C3.A0_realtime_e_realtime_scheduling|particolari tecniche]] per permettere anche a normali utenti di eseguire applicazioni realtime. I processi all'interno di questa classe possono avere una priorità da 0 (''minima'') a 99 (''massima'').
; SCHED_FIFO: usata per processi realtime. Un processo SCHED_FIFO avrà priorità superiore ad ogni altro processo (anche SCHED_NORMAL con nice -20). Normalmente processi con tali privilegi possono essere lanciati solo da root a meno di non usare [[Low-latency_2.6_kernel_per_applicazioni_audio_realtime#Modalit.C3.A0_realtime_e_realtime_scheduling|particolari tecniche]] per permettere anche a normali utenti di eseguire applicazioni realtime. I processi all'interno di questa classe possono avere una priorità da 0 (''minima'') a 99 (''massima'').


Le patch <tt>-ck</tt> introducono due ulteriori livelli:
Le patch <code>-ck</code> introducono due ulteriori livelli:


; SCHED_ISO : questa è la priorità chiamata ''soft realtime''. Infatti i processi di questa classe avranno priorità superiore ai processi SCHED_NORMAL ma non sono necessari i privilegi di root per eseguire programmi con questa priorità. Potremmo impostare ad esempio il nostro player audio preferito su SCHED_ISO, e non importa quanto sia carico il sistema non avremo mai salti nell'audio.
; SCHED_ISO : questa è la priorità chiamata ''soft realtime''. Infatti i processi di questa classe avranno priorità superiore ai processi SCHED_NORMAL ma non sono necessari i privilegi di root per eseguire programmi con questa priorità. Potremmo impostare ad esempio il nostro player audio preferito su SCHED_ISO, e non importa quanto sia carico il sistema non avremo mai salti nell'audio.
Riga 47: Riga 47:
; SCHED_IDLEPRIO: questa classe di processi viene eseguita solo quando il processore è in IDLE. Potremo lanciare compilazioni di kernel, aggiornamenti di sistema, pesanti cron jobs usando questa priorità e non noteremo il benché minimo degrado delle prestazioni durante il nostro utilizzo interattivo.
; SCHED_IDLEPRIO: questa classe di processi viene eseguita solo quando il processore è in IDLE. Potremo lanciare compilazioni di kernel, aggiornamenti di sistema, pesanti cron jobs usando questa priorità e non noteremo il benché minimo degrado delle prestazioni durante il nostro utilizzo interattivo.


Quando lanciamo un processo in Linux questo sarà automaticamente SCHED_NORMAL. Per lanciare processi con altre classi di priorità bisogna usare gli <tt>schedtool</tt>. Il pacchetto è presente nei repository di sid e lenny.
Quando lanciamo un processo in Linux questo sarà automaticamente SCHED_NORMAL. Per lanciare processi con altre classi di priorità bisogna usare gli <code>schedtool</code>. Il pacchetto è presente nei repository di Sid e Lenny.


apt-get install schedtool
<pre># apt-get install schedtool</pre>


''(è indicato per <tt>sid</tt> ma va benissimo anche per <tt>etch</tt>)''
''(è indicato per <code>Sid</code> ma va benissimo anche per <code>Etch</code>)''


Ecco alcuni esempi:
Ecco alcuni esempi:


schedtool -D -e apt-get dist-upgrade # aggiornare in modalità SCHED_IDLEPRIO
<pre># schedtool -D -e apt-get dist-upgrade # aggiornare in modalità SCHED_IDLEPRIO


schedtool -I -e xmms                # xmms in modalità SCHED_ISO
# schedtool -I -e xmms                # xmms in modalità SCHED_ISO


schedtool -I $$                      # trasforma la shell corrente in SCHED_ISO
# schedtool -I $$                      # trasforma la shell corrente in SCHED_ISO</pre>


Per ulteriori informazioni rimando alla semplice e chiara pagina: <tt>man schedtool</tt>
Per ulteriori informazioni rimando alla semplice e chiara pagina: <code>man schedtool</code>


== Installazione ==
== Installazione ==


Le patch <tt>-ck</tt> possono essere scaricate da http://www.kernel.org, al seguente indirizzo:
Le patch <code>-ck</code> possono essere scaricate da http://www.kernel.org, al seguente indirizzo:


* http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/
* http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/


e si applicano al primo kernel vanilla stabile di ogni serie. Ad esempio l'ultimo kernel stabile è attualmente il 2.6.16.4 ma le patch <tt>-ck</tt> si applicano al kernel 2.6.16 in quanto includono anche le patch inserite dal 2.6.16 al 2.6.16.4.  
e si applicano al primo kernel vanilla stabile di ogni serie. Ad esempio l'ultimo kernel stabile è attualmente il 2.6.16.4 ma le patch <code>-ck</code> si applicano al kernel 2.6.16 in quanto includono anche le patch inserite dal 2.6.16 al 2.6.16.4.  


Attualmente l'ultimo patch set <tt>-ck</tt> è il [http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.16/2.6.16-ck5/ 2.6.16-ck5], ed il file da scaricare e porre in <tt>/usr/src/</tt> è il seguente:
Attualmente l'ultimo patch set <code>-ck</code> è il [http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.16/2.6.16-ck5/ 2.6.16-ck5], ed il file da scaricare e porre in <code>/usr/src/</code> è il seguente:


* [http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.16/2.6.16-ck5/patch-2.6.16-ck5.bz2 patch-2.6.16-ck5.bz2]
* [http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.16/2.6.16-ck5/patch-2.6.16-ck5.bz2 patch-2.6.16-ck5.bz2]


''Nel seguito si userà, come esempio, il kernel 2.6.16 e le patch <tt>-ck5</tt> per tale kernel.''
''Nel seguito si userà, come esempio, il kernel 2.6.16 e le patch <code>-ck5</code> per tale kernel.''


Una volta scompattati i sorgenti del kernel vanilla in <tt>/usr/src/</tt> si possono patchare con:
Una volta scompattati i sorgenti del kernel vanilla in <code>/usr/src/</code> si possono patchare con:


$ cd /usr/src/linux-2.6.16/
<pre>$ cd /usr/src/linux-2.6.16/
$ bzcat ../patch-2.6.16-ck5.bz2 | patch -p1
$ bzcat ../patch-2.6.16-ck5.bz2 | patch -p1</pre>


Per una questione di ordine conviene rinominare la directory dei sorgenti in modo da rispecchiare la patch usata:
Per una questione di ordine conviene rinominare la directory dei sorgenti in modo da rispecchiare la patch usata:
   
   
$ cd /usr/src
<pre>$ cd /usr/src
$ mv linux-2.6.16 linux-2.6.16-ck5
$ mv linux-2.6.16 linux-2.6.16-ck5</pre>


E' consigliato usare un file di configurazione per il kernel vanilla e dare oldconfig:
È consigliato usare un file di configurazione per il kernel vanilla e dare oldconfig:


$ cd linux-2.6.16-ck5
<pre> $ cd linux-2.6.16-ck5
  $ cp /boot/config-2.6.16-vanilla .
  $ cp /boot/config-2.6.16-vanilla .
  $ make oldconfig
  $ make oldconfig </pre>


A meno che non sappiate perfettamente cosa state facendo lasciate tutte le risposte di default alle domande fatte dell'oldconfig.
A meno che non sappiate perfettamente cosa state facendo lasciate tutte le risposte di default alle domande fatte dell'oldconfig.


A questo punto è possibile compilare il kernel, ovviamente [[Debian Kernel Howto|alla debian-way]]. Se abbiamo già in esecuzione un kernel <tt>-ck</tt> possiamo lanciare la compilazione in modalità SCHED_IDLEPRIO:
A questo punto è possibile compilare il kernel, ovviamente [[Debian Kernel Howto|alla debian-way]]. Se abbiamo già in esecuzione un kernel <code>-ck</code> possiamo lanciare la compilazione in modalità SCHED_IDLEPRIO:


$ schedtool -D -e time fakeroot make-kpkg --append-to-version -desktop \
<pre> $ schedtool -D -e time fakeroot make-kpkg --append-to-version -desktop --revision 0.1 kernel_image</pre>
  --revision 0.1 kernel_image


In questo modo non ci accorgeremo nemmeno della compilazione durante il normale utilizzo interattivo del computer, infatti la compilazione avverrà '''solo''' quando la cpu sarà in idle. Il tempo di compilazione aumenta in maniera impercettibile. Verrà anche stampata la durata della compilazione grazie al comando <code>time</code>.
In questo modo non ci accorgeremo nemmeno della compilazione durante il normale utilizzo interattivo del computer, infatti la compilazione avverrà '''solo''' quando la CPU sarà in idle. Il tempo di compilazione aumenta in maniera impercettibile. Verrà anche stampata la durata della compilazione grazie al comando <code>time</code>.
   
   
Se non abbiamo un kernel <tt>-ck</tt>, ma un [[kernel]] abbastanza recente (penso dal 2.6.15 in su, ma non sono sicuro) potremo usare la modalità SCHED_BATCH, cambiando semplicemente l'opzione <tt>-D</tt> con <tt>-B</tt>. In questo modo la compilazione avrà priorità minore di tutti i processi SCHED_NORMAL. Durante la compilazione il sistema sarà abbastanza responsivo anche se non come nel caso precedente.
Se non abbiamo un kernel <code>-ck</code>, ma un [[kernel]] abbastanza recente (penso dal 2.6.15 in su, ma non sono sicuro) potremo usare la modalità SCHED_BATCH, cambiando semplicemente l'opzione <code>-D</code> con <code>-B</code>. In questo modo la compilazione avrà priorità minore di tutti i processi SCHED_NORMAL. Durante la compilazione il sistema sarà abbastanza responsivo anche se non come nel caso precedente.


Ultima possibilità, nel caso abbiate un kernel vecchio o non abbiate installato gli <tt>schedtool</tt> è quella di lanciare la compilazione con nice 19 (la più bassa priorità di un processo SCHED_NORMAL):
Ultima possibilità, nel caso abbiate un kernel vecchio o non abbiate installato gli <code>schedtool</code> è quella di lanciare la compilazione con nice 19 (la più bassa priorità di un processo SCHED_NORMAL):


$ nice -n 19 time fakeroot make-kpkg --append-to-version -desktop \
<pre>$ nice -n 19 time fakeroot make-kpkg --append-to-version -desktop --revision 0.1 kernel_image</pre>
  --revision 0.1 kernel_image


Ovviamente non è necessario compilare ''a bassa priorità'', ma i casi precedenti sono stati riportati come esempio pratico di utilizzo degli <tt>schedtool</tt> e delle funzionalità delle patch <tt>-ck</tt>.
Ovviamente non è necessario compilare ''a bassa priorità'', ma i casi precedenti sono stati riportati come esempio pratico di utilizzo degli <code>schedtool</code> e delle funzionalità delle patch <code>-ck</code>.


Per saperne di più sulla compilazione del kernel e la ''debian way'': [[Debian Kernel Howto]].
Per saperne di più sulla compilazione del kernel e la ''Debian way'': [[Debian Kernel Howto]].


== Links ==
== Links ==
6 999

contributi