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

m
fix broken links
m (fix broken links)
 
(15 versioni intermedie di 3 utenti non mostrate)
Riga 1: Riga 1:
{{Stub}}
{{Versioni compatibili|Jessie|Testing_2015|Unstable_2015}}
 
{{Versioni compatibili|Sid}}
== Introduzione ==
== Introduzione ==


Riga 18: Riga 16:


Per maggiori dettagli tecnici su ''SD'':
Per maggiori dettagli tecnici su ''SD'':
* [http://ck.wikia.com/wiki/SD Con Kolivas Wiki: SD]
* Con Kolivas Wiki: SD<sup>[[#Collegamenti esterni | [8]]]</sup>


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:
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]
* The Rotating Staircase Deadline Scheduler<sup>[[#Collegamenti esterni | [9]]]</sup>
* [http://lwn.net/Articles/226054/ RSDL hits a snag]
* RSDL hits a snag<sup>[[#Collegamenti esterni | [10]]]</sup>
* [http://lwn.net/Articles/230574/ Schedulers: the plot thickens]  
* Schedulers: the plot thickens<sup>[[#Collegamenti esterni | [11]]]</sup>


;Swap prefetching
;Swap prefetching
Riga 72: Riga 70:


=== Nuove priorità: SCHED_ISO, SCHED_IDLEPRIO ===
=== Nuove priorità: SCHED_ISO, SCHED_IDLEPRIO ===
Normalmente i processi in Linux hanno priorità SCHED_NORMAL. I processi di questa classe possono avere un [[nice]] da 19 a -20 che indica la loro priorità all'interno della classe SCHED_NORMAL. Su Linux sono presenti altre due classi di priorità:
Normalmente i processi in Linux hanno priorità SCHED_NORMAL. I processi di questa classe possono avere un [[nice]] da 19 a -20 che indica la loro priorità all'interno della classe SCHED_NORMAL. Ma su Linux sono presenti altre classi di priorità:


; SCHED_NORMAL: questa è, se non diversamente specificato, priorità dei processi in Linux. I processi di questa classe possono avere un [[nice]] da 19 (''minima'') a -20 (''massima'') che indica la loro priorità all'interno della classe SCHED_NORMAL
; SCHED_NORMAL: questa è, se non diversamente specificato, la priorità dei processi in Linux. I processi di questa classe possono avere un [[nice]] da 19 (''minima'') a -20 (''massima'') che indica la loro priorità all'interno della classe SCHED_NORMAL


; SCHED_BATCH : questa priorità viene usata per processi non interattivi (batch). I processi di questa classe avranno priorità inferiore a qualsiasi processo SCHED_NORMAL.
; SCHED_BATCH : questa priorità è stata introdotta dal kernel 2.6.16 e viene usata per processi non interattivi (batch). I processi di questa classe avranno priorità inferiore a qualsiasi processo SCHED_NORMAL.


; 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. Non c'è limite di tempo all'impegno della CPU da parte di questi processi che possono rimanere in esecuzione fin quando un processo con priorità più alta non assume il controllo della CPU. In questo caso il processo che perde il controllo si posiziona in cima alla lista dei processi in attesa (FIFO) con la stessa priorità. I processi all'interno di questa classe possono avere una priorità statica 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.--> non c'è limite di tempo all'impegno della CPU da parte di questi processi che possono rimanere in esecuzione fin quando un processo con priorità più alta non assume il controllo della CPU. In questo caso il processo che perde il controllo si posiziona in cima alla lista dei processi in attesa (FIFO) con la stessa priorità. I processi all'interno di questa classe possono avere una priorità statica da 0 (''minima'') a 99 (''massima''). <br/>Bisogna fare attenzione se si utilizzano processi di questo tipo: infatti, in base al funzionamento appena descritto, lanciando un processo FIFO con massima priorità, può accadere di vedere esclusi tutti gli altri processi (inclusa la propria shell) dall'utilizzo della cpu.


; SCHED_RR: usata anch'essa per processi realtime. Questa politica di priorità funziona in maniera simile a SCHED_FIFO ma è di tipo Round Robin anziché FIFO. Per i processi schedulati con questa politica viene assegnato un intervallo di tempo (Time Quantum) durante il quale il processo impegna la CPU. Scaduto il tempo, il processo viene messo in coda alla lista dei processi eseguibili con la sua stessa priorità.
; SCHED_RR: usata anch'essa per processi realtime. Questa politica di priorità funziona in maniera simile a SCHED_FIFO ma è di tipo Round Robin anziché FIFO. In pratica ai processi schedulati con questa politica viene assegnato un intervallo di tempo (Time Quantum) durante il quale il processo impegna la CPU. Scaduto il tempo, il processo viene messo in coda alla lista dei processi eseguibili con la sua stessa priorità. Il vantaggio di questa policy rispetto alla precedente è che RR è meno soggetta al problema della ''starvation'', situazione in cui gran parte delle risorse sono dedicate a un solo processo, rallentando o bloccando l'esecuzione di tutti gli altri.


Le patch <code>-ck</code> 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. Se si eseguono contemporaneamente più processi SCHED_ISO, questi si alterneranno seguendo una politica di tipo Round-Robin, in modo da evitare il problema della ''starvation''.
 
; SCHED_IDLEPRIO: questa classe di processi viene eseguita solo quando il processore è in IDLE. L'idea è quella di consentire l'esecuzione in background di task a priorità molto bassa, senza alcun impatto sugli altri processi avviati dall'utente. 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. In alcuni casi particolari (sospensione in ram, processo in  attesa di I/O, ecc) lo scheduler è in grado di riassegnare temporaneamente a questi processi la priorità SCHED_NORMAL, in modo da evitare che le risorse di sistema siano utilizzate senza limiti di tempo e in modo indesiderato.
 
== Installazione ==
 
{{Box|Nota|per una migliore comprensione delle procedure che seguono, fate rifermineto la guida sul [[Debian Kernel Howto|kernel alla debian-way]]}}
 
Prima di procedere è necessario installare alcuni pacchetti:
<pre> # apt-get install module-init-tools kernel-package libncurses5-dev fakeroot lrzip schedtool time </pre>
gli ultimi due pacchetti sono opzionali, anche se senza <code>schedtool</code> non potremmo usare gran parte delle potenzialità offerte dalle patch, mentre per quanto riguarda <code>time</code>, è utile solo se si vuole misurare la performance.
 
La patch <code>-ck</code> più recente può essere scaricata dal sito di Con Kolivas sulla pagina<sup>[[#Collegamenti esterni | [2]]]</sup> dedicata alle patch; sulla stessa pagina troverete il link per scaricare i sorgenti del kernel vanilla. <br/> Se la vostra Debian utilizza una versione precedente rispetto all'ultima release, potrete trovare la patch qui<sup>[[#Collegamenti esterni | [3]]]</sup>, mentre i sorgenti da patchare dovrete cercarli tra gli archivi di kernel.org<sup>[[#Collegamenti esterni | [4]]]</sup>.
Attualmente l'ultimo patch set <code>-ck</code> è il <code>4.0-ck1</code>, ed il file patch da scaricare è <code>patch-4.0-ck1.lrz </code>. Di seguito si userà, come esempio, il kernel 4.0 e le patch <code>-ck1</code> per tale kernel.
 
Spostate i due archivi appena scaricati in una directory nella nostra home, ad esempio in <code>~/src/</code> e scompattate i sorgenti
 
<pre>$ cd ~/src/
$ tar -xvf linux-4.0.tar.xz</pre>
 
Una volta scompattati i sorgenti possiamo applicare la patch con:
 
<pre>$ cd linux-4.0
$ lrzcat ../patch-4.0-ck1.lrz | patch -p1</pre>
 
Per una questione di ordine conviene rinominare la directory dei sorgenti in modo da rispecchiare la patch usata:
<pre>$ cd ../
$ mv linux-4.0 linux-4.0-ck1</pre>


; 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.
Per la configurazione, la strada più semplice è quella di copiare la configurazione funzionante di un kernel di versione simile a quello che state per compilare, ad esempio


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.
<pre> $ cd linux-4.0-ck1
$ cp /boot/config-3.16.0-4-amd64 .config
$ make oldconfig </pre>


<pre># apt-get install schedtool</pre>
Rispetto ai kernel standard la patch cambia alcune risposte predefinite in modo da ottenere un sistema adatto a un uso Desktop con bassa latenza, quindi, a meno che non abbiate diverse esigenze, potete lasciare tutte le risposte di default e passare alla compilazione.
Se siete interessati qui<sup>[[#Collegamenti esterni | [5]]]</sup> trovate alcuni suggerimenti per configurazioni da abbinare al BFS, a seconda del tipo di computer e dell'uso che si intende farne.


''(è indicato per <code>Sid</code> ma va benissimo anche per <code>Etch</code>)''
Una volta terminata la configurazione è 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:


Ecco alcuni esempi:
<pre> $ schedtool -D -e time fakeroot make-kpkg --append-to-version -bfs --revision 1 --initrd kernel_image</pre>


<pre># schedtool -D -e apt-get dist-upgrade # aggiornare in modalità SCHED_IDLEPRIO
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 <code>-ck</code> potremo comunque 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.


# schedtool -I -e xmms                # xmms in modalità SCHED_ISO
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):


# schedtool -I $$                      # trasforma la shell corrente in SCHED_ISO</pre>
<pre>$ nice -n 19 time fakeroot make-kpkg --append-to-version -bfs --revision 1 --initrd kernel_image</pre>


Per ulteriori informazioni rimando alla semplice e chiara pagina: <code>man schedtool</code>
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>.


== Installazione ==
Una volta terminanta la compilazione sarà sufficiente acquisire i privilegi di root e installare il nuovo kernel con dpkg:


Le patch <code>-ck</code> possono essere scaricate da http://www.kernel.org, al seguente indirizzo:
<pre>$ cd ../
# dpkg -i linux-image-4.0.0-ck1-bfs_1_amd64.deb</pre>


* http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/
== Utilizzo e Tuning ==


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.
Lo scheduler BFS è stato progettato per esigenze desktop pertanto il numero di impostazioni su cui si può intervenire direttamente è limitato al minimo e nella maggior parte dei casi non è necessario fare cambiamenti per migliorare le prestazioni. <br/>
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>;


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:
per lanciare un programma con priorità Idleprio si utilizza un comando del tipo


* [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]
<pre># schedtool -D -e apt-get dist-upgrade</pre>


''Nel seguito si userà, come esempio, il kernel 2.6.16 e le patch <code>-ck5</code> per tale kernel.''
in questo modo ad esempio eseguiremo un aggiornamento del sistema in background. 
Invece il comando che segue trasforma la shell corrente in SCHED_ISO


Una volta scompattati i sorgenti del kernel vanilla in <code>/usr/src/</code> si possono patchare con:
<pre>$ schedtool -I $$  </pre>


<pre>$ cd /usr/src/linux-2.6.16/
in questo modo tutti i programmi avviati con questa shell avranno priorità sched-iso e si alterneranno nell'utilizzo della cpu alla frequenza data dall' ''rr_interval''.<br/>  L'intervallo di Round Robin è impostato di default a 6ms e può essere liberamente modificato scrivendo nel file <code>/proc/sys/kernel/rr_interval</code>; i valori accettati variano da 1 a 1000 millisecondi, ad esempio per impostare il valore a 100ms
$ 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:
<pre># echo 100 > /proc/sys/kernel/rr_interval </pre>
<pre>$ cd /usr/src
$ mv linux-2.6.16 linux-2.6.16-ck5</pre>


È consigliato usare un file di configurazione per il kernel vanilla e dare oldconfig:
Con valori bassi migliora la latenza e cala il throughput, e vice versa. Alcune sperimentazioni hanno mostrato che aumentare l'rr_interval può migliorare il throughput fino a 300ms, mentre per valori superiori non ci sono ulteriori benefici. Inoltre bisogna tenere presente che l'accuratezza di questo intervallo è limitata dalla frequenza HZ del kernel, pertanto il valore di rotazione deve essere coerente col timer frequency impostato nella configurazione (in breve per valori dell'rr_interval bassi è necessaria una frequenza elevata).


<pre> $ cd linux-2.6.16-ck5
Se si vuole eseguire una sola applicazione ISO per volta da una normale shell basterà dare un
$ cp /boot/config-2.6.16-vanilla .
$ make oldconfig </pre>


A meno che non sappiate perfettamente cosa state facendo lasciate tutte le risposte di default alle domande fatte dell'oldconfig.
<pre>$ schedtool -I -e amarok</pre>


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:
questo farà partire amarok con priorità SCHED_ISO, in modo che, se necessario, possa interrompere qualsiasi task con priorità NORMAL o inferiore. Tuttavia siccome la priorità ISO è acccessibile ai normali utenti è stato stabilito un limite alle risorse utilizzabili da questi processi, in termini di percentuale di cpu disponibile sul pc; su un sistema multi-cpu il limite vale per il totale e non per ogni singola cpu. Il valore della cpu impegnata da un processo è calcolato come media mobile ogni 5 secondi e se un processo ISO utilizza più risorse di quelle prestabilite viene automaticamente rischedulato con priorità SCHED_NORMAL.<br/> La precentuale massima di cpu utilizzabile è impostata nel file <code>/proc/sys/kernel/iso_cpu</code> e il suo valore di default è 70%. Questo valore può essere liberamente modificato, a seconda delle esigenze, in un range da 0 a 100; impostare un valore di 100 significa dare a tutti gli utenti accesso alla policy RR, mentre un valore di 0 impedisce l'esecuzione di un qualsiasi
processo soft-realtime. <br/>  
Per modificare il limite, ad esempio portarlo a 85, basta un


<pre> $ schedtool -D -e time fakeroot make-kpkg --append-to-version -desktop --revision 0.1 kernel_image</pre>
<pre> # echo 85 > /proc/sys/kernel/iso_cpu </pre>


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>.
Anche se per avviare un processo ISO non sono necessarie le credenziali di root, per garantire il mantenimento della priorità impostata dall'utente durante tutta la vita del processo, è necessario essere root per cambiare nuovamente la priorità al processo ISO mentre è già in esecuzione. Quindi, per esempio, se vogliamo reimpostare a SCHED_NORMAL amarok dovremo dare un
   
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 <code>schedtool</code> è quella di lanciare la compilazione con nice 19 (la più bassa priorità di un processo SCHED_NORMAL):
<pre> # schedtool -N `pidof amarok` </pre>


<pre>$ nice -n 19 time fakeroot make-kpkg --append-to-version -desktop --revision 0.1 kernel_image</pre>
Infine è bene tenere presente che anche con le <code>patch ck</code> le priorità FIFO e RR sono accessibili solo a utenti coi privilegi di root e che lo scheduler BFS è progettato in modo da assegnare automaticmente la priorità ISO a qualsiasi applicazione che richiede priorità Sched_FIFO o Sched_RR senza avere privilegi necessari.


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>.
Il programma schedtool offre anche altre interessanti funzionalità; per maggiori dettagli <code>man schedtool</code>.


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


== Links ==
== Links ==
'''''Con Kolivas''''':
===Nel wiki===
* [http://members.optusnet.com.au/ckolivas/kernel/ Homepage delle patch Con Kolivas]
* [http://ck.kolivas.org/faqs/walkthrough.txt Quick walthrough on manually patching to -ck for beginners]
* [http://ck.kolivas.org/faqs/audio_hints Con Kolivas Audio Hints]
 
'''''Kernel''''':
'''''Kernel''''':
* [[Debian Kernel Howto]]
* [[Debian Kernel Howto]]
* [[Esempio configurazione kernel]]
* [[Esempio configurazione kernel]]
* [[Low-latency 2.6 kernel per applicazioni audio realtime]]
 
===Collegamenti esterni===
'''''BFS''''':<br/>
[1] [http://users.tpg.com.au/ckolivas/ Homepage di Con Kolivas]<br/>
[2] [http://users.tpg.com.au/ckolivas/kernel/ Patch ck più recente]<br/>
[3] [http://ck.kolivas.org/patches/ versioni precedenti]<br/>
[4] [http://www.kernel.org/pub/linux/kernel/ archivi kernel.org]<br/>
[5] [http://ck.kolivas.org/patches/bfs/bfs-configuration-faq.txt Configuration FAQ]<br/>
[6] [http://ck.wikia.com/wiki/BFS_FAQ BFS FAQ]<br/>
[7] [http://ck-hack.blogspot.com/ notizie sugli ultimi hack di C.K.]<br/>
 
'''''Vecchio patchset''''':<br/>
[8] [http://ck.wikia.com/wiki/SD Con Kolivas Wiki: SD]<br/>
[9] [http://lwn.net/Articles/224865/ The Rotating Staircase Deadline Scheduler]<br/>
[10] [http://lwn.net/Articles/226054/ RSDL hits a snag]<br/>
[11] [http://lwn.net/Articles/230574/ Schedulers: the plot thickens]<br/>
[12] [http://apcmag.com/why_i_quit_kernel_developer_con_kolivas.htm Con Kolivas: Why i quit]<br/>
 


{{Autori
{{Autori
|Autore=[[Utente:TheNoise|The Noise]]
|Autore= [[Utente:Ombra|Ombra]] 19:03, 26 apr 2015 (CEST) <br/>
(guida originariamente scritta da [[Utente:TheNoise|The Noise]])
|Verificata_da=
|Estesa_da=
|Numero_revisori=0
}}
}}
[[Categoria:Kernel]]
45

contributi