Patch Con Kolivas: incrementare le prestazioni desktop

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca

Introduzione

Le patch Con Kolivas (-ck) 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 nice.

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 -ck nei loro kernel di default.

Con Kolivas mantiene anche un altro insieme di patch, chiamate -cks, che sono specificatamente pensate per ottimizzare le prestazioni dei server.

Descrizione della patch

Staircase Scheduler

Le patch -ck includono l'innovativo staircase scheduler. Questo è uno schedule con una logica e una implementazione più semplice di quello usato attualmente nel kernel Linux (ingo scheduler) che si presta ottimamente all'uso interattivo, senza penalizzare le prestazioni server. Attualmente è in discussione la possibile sostituzione dello scheduler di Linux con lo staircase.

Le uniche perplessità sembrano essere sul fatto se lo staircase scheduler abbia prestazioni uguali al ingo scheduler su sistemi multiprocessori (sui quali lo scheduler attuale è altamente ottimizzato). Test prestazionali sono attualmente in corso.

Ecco come Con Kolivas descrive lo staircase scheduler:

This is a complete rewrite of the scheduler policy for normal tasks built on top of the O(1) scheduler. The aim was to make a very lean simple but effective design scheduler that is intrinsically interactive and responsive instead of modifying an existing design with tweaks to make it interactive.

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.

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

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à:

SCHED_NORMAL
questa è, se non diversamente specificato, priorità dei processi in Linux. I processi di questa classe possono avere un nice da 99 (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_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 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 -ck 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_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 schedtool. E' presente il seguente repository per debian:

deb http://users.tpg.com.au/sigm/debian sid main

(è indicato per sid ma va benissimo anche per etch)

Ecco alcuni esempi:

schedtool -D -e apt-get dist-upgrade # aggiornare in modalità SCHED_IDLEPRIO
schedtool -I -e xmms                 # xmms in modalità SCHED_ISO
schedtool -I $$                      # trasforma la shell corrente in SCHED_ISO

Per ulteriori informazioni rimando alla semplice e chiara pagina: man schedtool

Installazione

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

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 -ck 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 -ck è il 2.6.16-ck5, ed il file da scaricare e porre in /usr/src/ è il seguente:

Nel seguito si userà, come esempio, il kernel 2.6.16 e le patch -ck5 per tale kernel.

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

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

Per una questione di ordine conviene rinominare la directory dei sorgenti in modo da rispecchiare la patch usata:

$ cd /usr/src
$ mv linux-2.6.16 linux-2.6.16-ck5

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

$ cd linux-2.6.16-ck5
$ cp /boot/config-2.6.16-vanilla .
$ make 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 alla debian-way. Se abbiamo già in esecuzione un kernel -ck possiamo lanciare la compilazione in modalità SCHED_IDLEPRIO:

$ schedtool -D -e time fakeroot make-kpkg --append-to-version -desktop \
  --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 time.

Se non abbiamo un kernel -ck, 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 -D con -B. 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 schedtool è 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 \
  --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 schedtool e delle funzionalità delle patch -ck.

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

Links

Con Kolivas:

Kernel:


~ The Noise 03:26, 14 Apr 2006 (EDT)