jueves, 15 de septiembre de 2011

Acelerar el proceso de inicio en GNU/Linux




Para reducir el tiempo de inicio en Linux hay varias cosas que pueden hacerse. Paralelizar la carga de scripts de inicio, deshabilitar servicios que no utilicemos, cargar demonios en segundo plano entre algunas de ellas. En este caso la reduccion de los tiempos se traslada a nivel de disco. Es decir, lo que se intenta hacer es reacomodar la informacion que se utiliza en el arranque para que esta pueda ser leida sin que el cabezal del disco rigido tenga que "saltar" de un sector a otro. Si tenes un disco SSD esto no aplicará ninguna mejora por la forma en que se acceden los datos en este tipo de discos.

Todo esto es posible gracias a E4rat (ext4 Reduced Access Time), un conjunto de herramientas que aprovechan una caracteristica que fue introducida en la version del kernel 2.6.31 que permite la defragmentacion on line de los volumenes con formato ext4. 

Las siguientes son las imagenes del bootchart que el autor publico en su sitio web donde se muestra la mejoria de estas herramientas. En una CPU Intel Core2Duo E8200 con un disco rigido Western Digital WD2500YS-01S corriendo Debian Wheezy paso de aproximadamente 45 segundos a tan solo casi 15 segundos. En mi caso con una PC mas modesta y corriendo Ubuntu 10.10 solo pude obtener una mejora del 25% (nada despreciable de todas formas)


Bootchart antes de la optimización



Bootchart luego de la optimización


Manos a la obra!


Primero descargan el .deb dependiendo la arquitectura que utilicen o el archivo fuente si no son usuarios de Debian o algun derivado desde este link. Para arch esta disponible via AUR pero en mi caso aplicar este metodo me ha sido contraproducente, tal vez sea por la forma en que Arch inicia.

Si utilizan Ubuntu este paquete tiene un conflicto con ureadahead y para que e4rat funcione es necesario desinstalarlo previamente. 


sudo dpkg --purge ureadahead ubuntu-minimal

Ahora instalá las dependencias requeridas por e4rat
sudo aptitude install libblkid1 e2fslibs
o 
sudo apti-get install libblkid1 e2fslibs (Ubuntu 11.04)

El proceso se divide en 2 partes: 
 Recoleccion de informacion
 Realocacion de la información

Recoleccion de informacion


E4rat debe saber cuales son los archivos que deben realocarse para acelerar el proceso de inicio. Es por esto que hay que agregar a la linea del kernel en el archivo /boot/grub/grub.cfg o menu.lst lo siguiente:

init=/sbin/e4rat-collect


Entonces la entrada del grub quedaria algo similar a esto


menuentry "Ubuntu, with Linux 2.6.35-30-generic" --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod part_msdos
        insmod ext2
        set root='(/dev/sda,msdos2)'
        search --no-floppy --fs-uuid --set=root 28fff97a-ca59-4660-92eb-9d7d0dc617bf
        linux   /vmlinuz-2.6.35-30-generic root=UUID=db9568fb-579e-4a0c-8d04-5b2bd8260456 ro quiet splash nomodeset video=uvesafb:mode_option=1024x768-24,mtrr=3,scroll=ywrap init=/sbin/e4rat-collect
        initrd  /initrd.img-2.6.35-30-generic
}


Luego de guardar los cambios hay que reiniciar para que comience la recoleccion de informacion necesaria para la realocacion de los datos. Desde que se inicia el sistema E4Rat colectará informacion durante los siguientes 120 segundos. Al principio tarda unos segudnos pero seguramente vas a tener el sistema funcionando antes de los 120 segundos. Durante ese tiempo se siguen monitoreando los archivos que se utilicen, entonces para terminar la recoleccion de informacion podes ejecutar en la consola

sudo e4rat-collect -k
o

sudo killall e4rat-collect


Con esto, ya se saben que archivos deberian ser realocados en el disco. La lista de estos archivos se puede encontrar en /var/lib/e4rat/startup.log por si queres saber cuales son

Si los datos fueron recolectados ahora es necesario eliminar la linea en el kernel que se agrego anteriormente para que en el proximo reinicio no vuelva a ejecutarse la herramienta de recoleccion.

Ya casi terminando es necesario eliminar la linea que se agrego al kernel en el grub.cfg para que en el proximo inicio no se intente recolectar informacion nuevamente.

Realocacion de la informacion 


Para que la informacion se ordene hay que abrir una consola y ejecutar:

sudo init 1

con esto se quedaran sin interfaz grafica pero a no asustarse que no hay que hacer mucho. A los usuarios de Ubuntu les aparecerá un menu donde deben elegir root console o similar sino deben loguearse como root. Una vez autenticados como root se comienza la recoleccion ejecutando:
e4rat-realloc /var/lib/e4rat/startup.log

Esto puede tardar un tiempo dependiendo de la cantidad de archivos que deben reorganizarse y es aconsejable ejecutarlo unas cuantas veces hasta que no haya ninguna mejora por aplicar.

Por ultimo para que esta mejora se aplique hay que añadir lo siguiente a la linea del kernel en el grub.cfg (o menu.lst)

init=/sbin/e4rat-preload


Resultando algo similar a esto
menuentry "Ubuntu, with Linux 2.6.35-30-generic" --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod part_msdos
        insmod ext2
        set root='(/dev/sda,msdos2)'
        search --no-floppy --fs-uuid --set=root 28fff97a-ca59-4660-92eb-9d7d0dc617bf
        linux   /vmlinuz-2.6.35-30-generic root=UUID=db9568fb-579e-4a0c-8d04-5b2bd8260456 ro   quiet splash nomodeset video=uvesafb:mode_option=1024x768-24,mtrr=3,scroll=ywrap init=/sbin/e4rat-preload
        initrd  /initrd.img-2.6.35-30-generic
}


No es un proceso dificil de realizar y ademas se obtiene una buena mejora en la carga de nuestro GNU/Linux

No hay comentarios:

Publicar un comentario