venerdì 19 novembre 2010

Linux: far volare il kernel senza patch

È notizia di questi giorni: una patch di appena 244 righe di codice sviluppata da Mike Galbraith permette al kernel 2.6.38 di essere incredibilmente reattivo anche sotto condizione estreme di carico.

Chiariamo subito bene il punto: non è che con la patch il kernel di Linux riesce a sfruttare potenza del processore che prima non usava, la potenza massima quella è e quella resta. Ma se questa potenza la usiamo meno per organizzare il lavoro e di più per farlo effettivamente, il sistema riesce a rispondere prima alle nostre richieste, si riduce cioè il cosiddetto tempo di latenza del sistema, e all'atto pratico lo vedrete molto più scattante.

I risultati hanno dell'eclatante, tanto da meritarsi il plauso dello stesso Linus Torvalds, il creatore di Linux. Si parla infatti di una riduzione di 10 volte del tempo massimo di latenza e di addirittura 60 volte di quello medio. Riduzioni così drastiche si notano anche a occhio nudo e se guardate i video delle prove su Phoronix che trovate in fondo al posto ve ne renderete conto da soli.

Ma, c'è un ma, e riguarda proprio il kernel: la patch infatti è presente solo nel kernel 2.6.38 che al momento è ancora instabile e perciò se ne sconsiglia l'installazione. Nel 2.6.37 e 2.6.36 invece non è proprio prevista.

Per risolvere la questione andrebbero scaricati i sorgenti del kernel 2.6.36/37 e la patch, applicata questa al kernel e poi ricompilato il kernel stesso, tutte operazioni non necessariamente alla portata di tutti. O come me, potreste semplicemente non averne voglia. ;-)

Allora rinunciamo? Ma neanche per sogno, il miracolo si può ottenere anche senza applicare la patch. Lennart Poettering, sviluppatore Red Hat, ha infatti indicato un modo per applicare delle modifiche al kernel con pochi comandi da terminale che hanno gli stessi effetti della patch.

La notizia è stata rilanciata da Ask Ubuntu e WebUpd8 con tanto di istruzioni per una generica distribuzione Linux e per Ubuntu in particolare dove queste sono un po' diverse.

Vediamo come fare.

Prima di proseguire vi avviso: nonostante non ho trovato lamentele su eventuali problemi che queste modifiche possono portare al vostro sistema, restiamo intesi che lo fate a vostro rischio e pericolo.

Ed ora le modifiche. Queste sono divise in 2 parti. La prima riguarda tutte le distribuzioni tranne Ubuntu, la seconda solamente Ubuntu.


***     Modifiche per tutte le distribuzioni TRANNE Ubuntu     ***

Aprite il terminale da Applicazioni → Accessori → Terminale e date il comando:

gedit ~/.bashrc

In fondo al file aggiungete le righe:

if [ "$PS1" ] ; then
mkdir -m 0700 /sys/fs/cgroup/cpu/user/$$
echo $$ > /sys/fs/cgroup/cpu/user/$$/tasks
fi

Salvate ed uscite.

Ora diventate amministratore con il comando

su

e date i comandi:

mount -t cgroup cgroup /sys/fs/cgroup/cpu -o cpu
mkdir -m 0777 /sys/fs/cgroup/cpu/user

Infine riavviate. Avete finito.


***     Modifiche solo per Ubuntu     ***

Aprite il terminale da Applicazioni → Accessori → Terminale e date il comando:

sudo gedit /etc/rc.local

Prima di exit 0 in fondo aggiungete le righe:

mkdir -p /dev/cgroup/cpu
mount -t cgroup cgroup /dev/cgroup/cpu -o cpu
mkdir -m 0777 /dev/cgroup/cpu/user
echo "/usr/local/sbin/cgroup_clean" > /dev/cgroup/cpu/release_agent

Salvate e chiudete.

Rendere eseguibile il file rc.local appena modificato con il comando

sudo chmod +x /etc/rc.local

Ora aggiornate il file bash.rc della vostra home con:

gedit ~/.bashrc

ed in fondo al file aggiungete:

if [ "$PS1" ] ; then
mkdir -m 0700 /dev/cgroup/cpu/user/$$
echo $$ > /dev/cgroup/cpu/user/$$/tasks
echo "1" > /dev/cgroup/cpu/user/$$/notify_on_release
fi

Salvate e chiudete.

Per assicurarsi che i cgroups (è una questione tecnica, non ve ne preoccupate se non è chiaro) vengono cancellati ogni volta dopo l'ultimo task:

sudo gedit /usr/local/sbin/cgroup_clean

e (il file dovrebbe essere vuoto) aggiungete le righe

#!/bin/sh
rmdir /dev/cgroup/cpu/$*

poi salvate, uscite, e rendetelo eseguibile con

sudo chmod +x /usr/local/sbin/cgroup_clean

Infine riavviate per applicare le modifiche. Avete finito.

Dicevo che la differenza è davvero eclatante, al punto da essere ben visibile ad occhio nudo. Se guardate i video sotto riportati delle prove fatte su Phoronix noterete come:

  • nel primo caso in cui la patch non è applicata, il refresh dello schermo è lento e lascia in giro molte finestre che non fanno in tempo ad aggiornarsi,



  • nel secondo in cui la patch è attiva, il refresh è quasi normale.



E tutto ciò mentre:
  • viene eseguita una compilazione del kernel con 64 task lanciati in parallelo;
  • viene visualizzato un filmato HD 1280p;
  • gira glxgears insieme a 2 finestre di Mozilla Firefox aperte per navigare;
  • è aperto Nautilus, il file manager di Ubuntu insieme al Monitor di Sistema di Gnome;
  • qualche altra cosa che non ricordo.

Bene, mi pare sia tutto.

Se invece volete maggiori informazioni tecniche su cosa accada realmente e come si riesca a ottenere il miracolo tramite la patch, l'articolo di Jessica Lambiase è senz'altro ottimo per approfondire la questione.

A presto, ciao ciao.
GdS