Acelerando el arranque

2008 Octubre 25
etiquetas: ,
by Sr. Luzbel

Como les había contado, en mi laptop logré reducir el tiempo de booteo de 51 segundos a 25 segundos!. Sólamente me enfoqué en reducir el tiempo en donde el sistema se inicia hasta antes de lanzar el entorno gráfico, asi que todavía queda por mejorar en esa parte.

Antes de que sigan leyendo tengo que advertir que es probable que no puedan aplicar lo mismo que yo porque hay cosas que dependen de la configuración de cada uno, y también advertir que si no saben lo que estan haciendo, es mejor no meter las manos a menos que sepan como arreglarlo.

Para explicar el método voy a usar mi caso particular, ustedes deben seguir la misma metodología pero en su configuración.

Bootchart
El primer paso es instalar la herramienta bootchart. Esta herramienta permite generar un gráfico que describe todo el proceso de inicio del sistema, mostrando el uso de recursos (CPU, I/O) e indicando cada proceso que se ejecuta. Es vital para medir los cambios y ver si la cosa va mejorando o empeorando. Además sirve para visualizar cuellos de botella.

Se instala via apt-get:

sudo apt-get install bootchart

Una vez instalado ya pueden generar su primer gráfico de referencia. Solo basta reiniciar el sistema ya que bootchart se activará por omisión. Para desactivarlo se puede pasar el parámetro bootchart=disable en las opciones de inicio del kernel.

Una vez iniciado el sistema, pueden encontrar el gráfico resultante en /var/log/bootchart

Aqui pueden ver mi primer bootchart que usaré de base para explicar el método.

Análisis del bootchart
Al mirar el gráfico generado por bootchart detecté lo siguiente:

  • El tiempo de inicio es de 51 segundos
  • Hay dos momentos en que el sistema pareciera no hacer nada, esta esperando que algo suceda. Esto es en el segundo 4 y en el segundo 26
  • Hay dos momentos en que se ocupa el disco en forma intensiva y por mucho tiempo. Uno es cuando se ejecuta readahead (9s) y el otro es cuando se ejecuta fsck (20s)
  • Hay procesos que detienen el inicio mientras no se terminen, por ejemplo readahead (9s), lrm-manager (13s), fsck (21s), postgresql (40s), etc.
  • Hay varios servicios que no estoy usando o que no necesito que se inicien automáticamente todos los dias, como mysql y postgresql
  • La particion de windows se está montando automátiamente y no la necesito (32s)
  • El resto son cosas chicas que podrian ayudar a ganar 1 o 2 segundos.

Desactivar servicios no utilizados
Esta es la parte más obvia de la optimización: desactivar todos los servicios que no estemos usando. Hay varias formas de hacerlo, recomiendo primero ir a Sistema -> Administracion -> Servicio y desactivar todo que evidentemente no debe iniciarse en forma automática. En mi caso postgresql y mysql.

Hay muchos servicios que no aparecen con este editor. Hay varias herramientas para modificarlos y visualizarlos. Lo más simple es ver el contenido del directorio /etc/rc2.d:

ls /etc/rc2.d
K08vmware           S16ssh  S20apmd           S20winbind     S89cron
... etc

Todo lo que empieza con “S” son servicios que se van a iniciar al entrar a runlevel 2 (modo normal de ubuntu).

Una forma rápida de ver qué hace cada servicio es mirar su script en /etc/init.d. Por ejemplo para ver S16ssh:

fcatrin@desktop:~$ grep Desc /etc/init.d/ssh
# Short-Description:	OpenBSD Secure Shell server

Para activar o desactivar se pueden usar herramientas como sysv-rc-conf o update-rc.d

¡Actualizado!

El runlevel (del inglés, nivel de ejecución) es cada uno de los estados en que se encuentra el sistema. Existen 7 niveles de ejecución en total:

  • Nivel de ejecución 0: Apagado.
  • Nivel de ejecución 1: Monousuario (sólo usuario root; no es necesaria la contraseña). Se suele usar para analizar y reparar problemas.
  • Nivel de ejecución 2: Multiusuario sin soporte de red.
  • Nivel de ejecución 3: Multiusuario con soporte de red.
  • Nivel de ejecución 4: Como el runlevel 3, pero no se suele usar
  • Nivel de ejecución 5: Multiusuario en modo gráfico (X Windows).
  • Nivel de ejecución 6: Reinicio.

Desactivar servicios de sistema
Antes de que el ubuntu entre en runlevel 2 tiene que levantar servicios que operan a nivel de sistema, son de base. Algunos de ellos si bien son útiles para muchos, puede ser que para tí no lo sean. Estos servicios se ejecutan en el runlevel “S” y se pueden ver en el directorio /etc/rcS.d. Por ejemplo:

fcatrin@desktop:~$ ls -1 /etc/rcS.d
README
S01mountkernfs.sh
S01readahead
S02hostname.sh
S06keyboard-setup
S07linux-restricted-modules-common
S08hwclockfirst.sh
...

Al igual que en rc2.d, estos archivos son enlaces simbólicos a scripts de servicios que estan en /etc/init.d

fcatrin@desktop:~$ grep Desc /etc/init.d/mountkernfs.sh
# Short-Description: Mount kernel virtual file systems.
# Description:       Mount initial set of virtual filesystems the kernel

Al mirar esa lista, se puede deducir que cuando el sistema parte hace lo siguiente:

  • Montar los sistemas de archivo virtuales del kernel (como /proc)
  • Pre-leer un conjunto de archivos
  • Asignar el nombre de host
  • Configurar el teclado
  • Cargar los modulos restringidos como el driver de nvidia
  • Configurar el reloj
  • etc

Este sistema modular facilita desactivar servicios a nivel de sistema sin tener que hacer algo distinto a desactivar un servicio normal. Es algo que echaba de menos en OTRAS distribuciones que tienen todo esto en un solo gran script.

En mi caso deactivé los siguientes servicios de sistema:

  • linux-restricted-modules-common : lo necesitas sólo si tu hardware requiere drivers propietarios. Cómo saberlo? ejecuta Sistema -> Administración -> Controladores de Hardware. Si la lista esta vacia, es seguro deshabilitar este servicio
  • pcmciautils : lo necesitas si tienes dispositivos pcmcia
  • brltty : lo necesitas si tienes un display braile
  • apparmor : lo necesitas si quieres mantener tu sistema seguro. Si eres confiado lo puedes desactivar

Hay otros más, se debe ver caso a caso

Configurar la revisión de los sistemas de archivo
Una de las tareas que más tiempo consume es revisar la consistencia de los sistemas de archivo (fsck). En mi caso lo que hice fue desactivar la revisión de mis sistemas de archivo de windows porque casi nunca los ocupo (en mi laptop), y desactivar la revisión de mi sistema raiz ya que es reiserfs y se autocorrige (hasta ahora). Con eso ahorré unos 5 segundos o más.

El archivo /etc/fstab contiene todos los sistemas de archivo que se montarán automáticamente al iniciar el sistema, y al final de cada linea indica si se va ejecutar fsck para revisar la consistencia.

Entonces originalmente era algo similar a esto:

/dev/sda1 /               reiserfs defaults        0       1
/dev/sda4 /media/sda4     vfat    defaults,utf8,umask=007,gid=46 0       1

Y lo dejé como:

/dev/sda1 /               reiserfs defaults        0       0

Con eso eliminé el montaje y revisión de la partición de windows y al cambiar el 1 por el 0 al final de la primera linea desactivé la ejecución de fsck.

Ojo, en esta parte debes estar seguro de lo que estas haciendo

Readahead : pre-lectura de archivos
Finalmente lo que hice fue mejorar la pre-lectura de archivos. De qué se trata? Cuando el sistema parte, se dedica a leer de una pasada todos los archivos que en algun momento posterior va a tener que leer, eso hace que todos queden en caché y así reduce cualquier latencia posterior que se agudiza con la latencia de esperar a leer un archivo de disco.

En el directorio /etc/readahead hay dos archivos de texto que contienen una lista de archivos a preleer: boot que se pre-lee al iniciar el sistema y desktop que se pre-lee al iniciar el entorno gráfico.

Estas listas vienen de fabrica y es muy probable que al modificar los servicios queden en estas listas muchos archivos que ya no se necesitan volver a leer, entonces hay que regenerar las listas. Para regenerar la lista se debe reiniciar el sistema y agregar el parámetro profile a la linea de inicio del kernel. Grub permite modificar las opciones de inicio presionando la tecla “e” para editar, y una vez hecho los cambios se inicia con la tecla “b”. Estos cambios no se guardan en disco.

La linea de inicio del kernel debería quedar similar a ésta, agregando el parámetro profile:

kernel /vmlinuz-2.6.24-19-generic root=/dev/sda1 ro quiet splash profile

El sistema se demorará en partir porque estará generando estas listas. Esto sólo sucedera cuando usemos la opción “profile”.

Estas listas también se pueden revisar para ver si hay archivos que segun nosotros, no se deberían estar leyendo (así encontré apparmor).

Cuando apliqué esto, mi lista de readahead bajó de 777 archivo a 526.

Ordenar la lista de readahead
Las listas generadas con la opción profile estarán en el orden en que se leyeron los archivos. Esta lista se puede hacer más eficiente ordenándola por la ubicación de los archivos en el disco, de tal forma que los archivos se lean en forma secuencial físicamente.

Una forma rápida de ordenarla es con los siguientes comandos:

cat /etc/readahead/boot | xargs stat -c %i.%n | sort -n | cut -d"." -f2- > boot.sorted
sudo cp boot.sorted /etc/readahead/boot

Lo que hace el comando es obtener el numero de inode de cada archivo y usarlo como criterio para ordenar. Luego genera la nueva lista en base a esa lista ordenada.

Otras mejoras
Otra posibles mejoras que aun no he aplicado son :

  • desactivar algunos servicios del escritorio (Sistema -> Preferencias -> Sesiones -> Programas de inicio)
  • eliminar algunos archivos que se leen pero que no se van a ocupar (ej: drivers). Se pueden determinar mirando las listas de readahead
  • ordenar físicamente los archivos que se preleen para que queden contiguos
  • generar un gran archivo que contenga todos los archivos que se preleen para leerlos de una sola pasada

Al menos con los cambios aplicados hasta el momento mi bootchart final quedó en sólo 25 segundos.

Vía | Tuxpan

En mi caso logre optimizarlo aún más:

2 comentarios dejar un →

Referencias & Pingbacks

  1. Noticias varias « Arukard’s Weblog
  2. Mi Xubuntu bootea en 29′ « Tuxbelito

Escribe un comentario

Nota: Puede usar XHTML básico en sus comentarios. Su dirección de correo electrónico nunca será publicada.

Subscripción al comentario vía RSS