Tag: kernel

SwapoutClustering patch tested

Posted by – November 2, 2009

When NetBSD and FreeBSD swap out a page from a process, they look in the process virtual address space to find nearby pages that are also candidates for being swapped out. This greatly increases the chance of swapin IO pulling in related data, reducing the number of disk seeks involved in swap IO (from kernelnewbies.org).
I’ve tested the Swapout Clustering patch here and it seems to improve the overall swapping system.
I wrote a benchmark tool to test the swapping system of Linux and collect results.
The benchmark allocates and locks a high amount of physical memory and measures timings of reads and writes to swapped memory.

Actually the parent process sucks all the memory, locks it (unswappable memory) and other 30 processes allocate their own memory to perform reads and writes on.
Three parameters (amount of memory to lock, number of benchmark processes, amount of memory allocated per process) can be tuned to perform a reasonable benchmark on different systems.

Results have been collected on a virtual machine running in KVM, with 128MB RAM.
The benchmark tool has been launched by locking 110MB of physical memory; 30 processes performed reads and writes on a 10MB memory space.
Build and run with

make swapbench
./swapbench -a 110 -p 30 -l 10

Set a reasonable amount of memory to lock and force the system to swap benchmark processes’ memory in and out.

Results

I run the benchmark many times to collect reliable results on a Kvm virtual machine with 128MB Ram, Intel Core2Duo processor and the kernel versions reported in the table below:

kernel version Avg. read (s) Avg. write (s) Overhead read Overhead write
linux-git 2.6.32-rc5
0.560072201681
0.560865798319
%
%
linux-git-swapoutclustering-patch
0.433929222689
0.43047510084
-23%
-23%

Download

The source code of the benchmark as well as the collected results is available for download.

Filename Description Download
swapbench.c Source code of the benchmark tool (not complete but fully functional) here
bench_swap_cluster.txt Results collected from linux-git here
bench_swap_cluster_patch.txt Results collected from linux-git-cluster-patch here
readstats.py Python utility to compute averages from result files here

Compilare e ottimizzare il kernel FreeBSD

Posted by – November 22, 2006

Una volta eseguita l’installazione di una macchina FreeBSD solitamente si richiede una minima ottimizzazione ricompilando il kernel installato di default.
Prima di addentrarsi nei meandri della compilazione è necessario procurarsi i sorgenti del kernel con questi pochi passaggi:

# /stand/sysinstall

scegliere


'Configure'
'Distributions'
'src'
'sys'

quindi ‘OK’ e di nuovo ‘OK’

Selezionare un FTP da cui scaricare i sorgenti. Quindi, ad installazione completata uscire da sysinstall scegliendo ‘Exit’

Il nuovo albero dei sorgenti risiede in /usr/src/sys

Entriamo in /usr/src/sys/i386/conf
GENERIC è il file di configurazione di un kernel generico che dovrebbe funzionare con qualsiasi sistema.
E’ chiaro che se non si possiede alcuna interfaccia scsi o dispositivi elencati nel file suddetto sarebbe bene commentarli o rimuovere le voci corrispondeti.
Di solito si copia il file GENERIC in un file miokernel e si eseguono le modifiche su quest’ultimo.
A questo punto lanciare un config , dove è il file di configurazione.
Il comando config ritorna alla console il path relativo dalla directory di compilazione vera e propria.

cd alla directory ritornata da config quindi
make depend
make
make install

Qualora ci fossero errori già dopo la fase di make è bene non lanciare il make install

Ottimizzazione in fase di compilazione

Un primo upgrade lo fa il buon vecchio
portupgrade -ra

Il processo di compilazione necessita di un pò di tempo (dipendente dalla macchina).
In alternativa si scaricano i soli distfiles e poi si aggiorna offline con
portupgrade -Fra

Il resto delle ottimizzazioni si fanno a livello di compilazione quindi è necessario modificare il file /etc/make.conf, che presenta dei tag molto comprensibili (a rigor di logica).
I tag sono:

CPUTYPE=cpu_type dove cpu_type può essere uno di questi: i386, i486, i586, i586/mmx i686, p2, p3, p4,
k6, k6-2, or k7. Attenzione perchè gcc v2 di FreeBSD non supporta le ottimizzazioni per l’ultimo Athlon.
In quei casi usare k7. Con gcc v3 c’è maggior supporto alle ottimizzazioni

CFLAGS= -O3 -pipe -funroll-loops -ffast-math dove
-O3 setta il livello di ottimizzazione al massimo (il codice del kernel non viene considerato per questo livello
-pipe permette il passaggio di codice da un processo all’altro attraverso pipeline anzichè file temporanei riducendo fortemente le operazioni di I/O.
-funroll-loops permette l’iterazione di cicli per un numero prefissato di volte
-ffast-math breaks IEEE/ANSI regole matematiche strict, assumendo che la radice quadrata di un numero è positiva. Non si consiglia di usare questo flag se si sta compilando codice basato sull’ implementazione esatta delle regole ANSI di IEEE.

COPTFLAGS= -O2 -pipe -funroll-loops -ffast-math stessa cosa del CFLAGS ma usata per la compilazione del kernel. Si preferisce -O2 invece di -O3 perche -O3 genera kernel non corretti. Ufficialmente è supportato solo -O ma usare -O2 è ormai uno standard de facto.
Si potrebbe compilare con ottimizzazione anche aggiungendo la riga ‘makeoptions COPTFLAGS’ al file di configurazione del kernel.