Cómo mejorar el tiempo de inicio de Ubuntu Linux (8.04)

Martes, 22 de julio de 2008 Dejar un comentario Ir a comentarios

Actualización: Se han hecho cambios al kernel para mejorar agresivamente el tiempo de inicio. En el caso extremo que incluye usar un disco de estado sólido como el del Asus EEE, se logra iniciar el sistema en sólo 5 segundos

Como les había contado, en mi laptop logré reducir el tiempo de booteo de 51 segundos a 25 segundos!. Solamente me enfoqué en reducir el tiempo en donde el sistema se inicia hasta antes de lanzar el entorno gráfico, así 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 están 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 partición de windows se está montando automáticamente y no la necesito (32s)
  • El resto son cosas chicas que podrían 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 -> Administración -> 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

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 algún 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.

Tags: , ,






  1. Nestor
    Martes, 22 de julio de 2008 a las 03:33 | #1

    Hola Franco, el articulo es muy interesante, pero es solo para laptop?…gracias

  2. Martes, 22 de julio de 2008 a las 11:24 | #2

    No, es para cualquier equipo.

  3. Martes, 22 de julio de 2008 a las 12:21 | #3

    hola Franco esta super weno el articulo..

    Pero servirá para agilizar debian?

    saludos

  4. Martes, 22 de julio de 2008 a las 12:25 | #4

    Los conceptos son los mismos para cualquier distribución, solo cambian las herramientas. Lo único que no te puedo asegurar es que en tu distribución venga incluido readahead, o si viene incluido,que se puede hacer profiling.

    Recién me mandaron un bootchart de fedora en donde el proceso era de 35 segundos sin readahead.

  5. Alec
    Martes, 22 de julio de 2008 a las 13:21 | #5

    Muy bueno el articulo. Lo podré aplicar el Windows?… jeje. Por ahora no uso Linux en mi laptop de oficina. Culpa de Cisco. Pero en casa si y voy a probar tus tips.
    Saludos,

  6. Martes, 22 de julio de 2008 a las 13:49 | #6

    Bueno, algunas conceptos si son aplicables.

    - Desactivar servicios que no requieras en el panel de control
    - Desactivar aplicaciones que no requieras con msconfig (creo que asi se llama)

    Segun entiendo, tanto windows como osx aplican la técnica de readahead

  7. Ivan Altamirano
    Martes, 22 de julio de 2008 a las 16:15 | #7

    Yo lo que hacia para agilizar un tanto el cuento era quitar los permisos directamente desde el directorio /etc/init.d/
    La mayoria de los ficheros que se encuentran ahi tienen una descripción que es posible consultarla con un \”man XXX\”, sino con google.cl
    Lo que no me he dado el tiempo de indagar es como hacer que el sistema parta, por ejemplo, en un rc5, y asi separar las cosas que realmente importan en cada nivel.

    Respecto al montaje de los dispositivos, siempre ocupaba esas opciones, pero no sabia que significaban jajaja.

    Saludos.

  8. Martes, 22 de julio de 2008 a las 17:09 | #8

    El problema de hacerlo mediante permisos es que cuando actualices los paquetes en donde vienen esos archivos vas a perder tu cambio, o la distribución te avisará que hay diferencias. Pierdes la característica automática de las actualizaciones.

    Para que tu sistema parta en rc5 puedes crear un archivo /etc/inittab que diga

    id:5:initdefault

    El script de upstart /etc/event.d/rc-default se encarga de mantener esa compatibilidad en el sistema de inicio tradicional

    Para ver las opciones de montaje, aplica man fstab
    También puedes ver como funciona mirando los scripts /etc/init.d/checkroot.sh y /etc/init.d/checkfs.sh

  9. Martes, 22 de julio de 2008 a las 23:27 | #9

    hola Franco
    te las mandaste con el medio tutorial…lo aplicaré terminando de poner las notas y cerrar el semestre…respaldo…y a ver que pasa!
    saludos.

  10. Martes, 22 de julio de 2008 a las 23:54 | #10

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

    uf! en mi caso cuando lo hice pase de 824 a un poco más de 1000!

    aun con esto, ya he bajado algunos preciosos segundos.

    aun sigo investigando para mejorar.

  11. Max Celedon Collins
    Miércoles, 23 de julio de 2008 a las 03:00 | #11

    Yo optimizo mis kernels y tengo un rendimiento superior a todos ustedes…

    Viva Slackware y abajo los lamers que usan distros para niñas!

  12. Miércoles, 23 de julio de 2008 a las 11:23 | #12

    Vladimir, seguramente estas cargando más servicios. Mira tu lista para ver qué cosas no archivos no te cuadran con lo que tu quieres cargar al inicio

  13. Miércoles, 23 de julio de 2008 a las 11:25 | #13

    Max, ahora mismo me tiro a recompilar todos mis paquetes nia hahaha

  14. Miércoles, 23 de julio de 2008 a las 12:59 | #14

    “distros para niñas”

    avísale po!

    boina negra!

    jajajajajaja

  15. Alvaro Navarro
    Jueves, 24 de julio de 2008 a las 12:41 | #15

    ¿El mismo Max Celedón que en USENET años atrás despotricaba contra Linux y gritaba a los 4 vientos su amor por las ventanitas de Gates? Uf, como nos cambia la vida :-)

    -alv-

  16. Jueves, 24 de julio de 2008 a las 15:17 | #16

    A mi no me aparece la imagen en ninguna parte. Habrá que instalar algo adicional aparte de bootchart ?? algún módulo especial en el kernel ?. Tampoco aparece el demonio bootchartd. Si es posible una ayuda

  17. Jueves, 24 de julio de 2008 a las 16:26 | #17

    No hay ningun demonio bootchartd.
    Sólo asegúrate de que en la linea de inicio del sistema en el grub, le pases el parámetro bootchart

  18. Jueves, 24 de julio de 2008 a las 23:24 | #18

    …ups, my mistake … cuando instalo la actualización del kernel y como había modificado a mano el menu.lst, al preguntarme le dije que dejara el archivo tal cual, por ende tenía todo configurado para usar el 2.6.24-19, pero en el menu del grub solo aparecía el 2.6.24-16 a elegir … gracias de todos modos.

  19. ygallardo
    Viernes, 25 de julio de 2008 a las 02:18 | #19

    Solo es necesario instalar el paquete bootchart y se agrega automaticamente al Kernel que estas usando, las imagenes quedan en /var/log/bootchart aunque si no lo ves en el menu.lst lo agregas ?init=/sbin/bootchartd? al final de la linea del kernel que usas y listo.

    Saludos…

  20. F3lip3
    Viernes, 25 de julio de 2008 a las 02:51 | #20

    Yo solo saque mysql y mi tiempo es de 30 segundos. Yo utilizaba siempre ReiserFs como sistema de archivos pero me cuando usaba Feisty (creo) comencé a notar que el inicio era lento, por eso uso EXT3. No se si tenga que ver pero como dije solo con detener Mysql llegue a ese tiempo

  21. Viernes, 25 de julio de 2008 a las 11:38 | #21

    Al menos en el paquete para ubuntu no viene ese archivo sino que se integra con initramfs (man initramfs-tools).

    Ahora que veo el script, ni siquiera necesitas decirle en la linea de boot del kernel que diga bootchart, sólo está la opción para deshabilitarlo (bootchart=disable)

    Mas detalles en /usr/share/initramfs-tools/scripts/init-top/bootchart

    (BTW: tengo /var/log/bootchart lleno de graficos :) )

  22. Viernes, 25 de julio de 2008 a las 12:00 | #22

    Yo creo que si tiene que ver el sistema de archivos, porque a mi se me demoraba el fsck del reiserfs.

    Lo malo es que yo he tenido malas experiencias con ext3, se corrompía facilmente, algo que nunca me ha pasado con reiserfs pese a todos los que me han dicho que no es confiable.

  23. ygallardo
    Viernes, 25 de julio de 2008 a las 12:34 | #23

    Solo es necesario instalar el paquete bootchart y se agrega automaticamente al Kernel que estas usando, las imagenes quedan en /var/log/bootchart aunque si no lo ves en el menu.lst lo agregas ?init=/sbin/bootchartd? al final de la linea del kernel que usas y listo.

    Saludos…

  24. Viernes, 25 de julio de 2008 a las 12:37 | #24

    @ygallardo, pero para que es el /sbin/bootchartd si no viene?

    fcatrin@shaman:~$ ls /sbin/bootchartd
    ls: no se puede acceder a /sbin/bootchartd: No existe el fichero ó directorio
    fcatrin@shaman:~$ dpkg -L bootchart

    /etc/init.d/stop-bootchart
    /usr/share/bootchart/bootchart.jar
    /usr/share/initramfs-tools/scripts/init-top/bootchart
    /usr/share/doc/bootchart/changelog.gz
    /usr/share/doc/bootchart/changelog.Debian.gz
    /var/log/bootchart

  25. Jueves, 31 de julio de 2008 a las 00:32 | #25

    buen articulo franco

    max xup@10

  26. miguel
    Sábado, 30 de agosto de 2008 a las 20:01 | #26

    Magnifica inmersion en linux-ubuntu.Cientifica: causas y efectos, y el porquè, antes que el como.Me tentò. pero mi level, me aconsejò prudencia; de momento.Te agradeceria ese 2º trabajo que aludes asi como ciertas aclaraciones para experimentar sobre estos y otros temas.Cuando descubro por tu script los dos archivos de fabrica del /etc/readahead, la 1ª idea fue borrar en directo, pero me abstube.Estoy buscando un curso de ubuntu-linux argumentado y no hay manera: siempre el who to, sin el porquè.Por que, el como, debe ser siempre despues del porquè,verdad? Gracias por tu trabajo.

  27. Sábado, 30 de agosto de 2008 a las 20:24 | #27

    Hola Miguel, gracias!

    El archivo /etc/readahead lo puedes borrar, no va a pasar nada malo. Lo puedes regenerar con el parámetro “profile”.

    Para aprender como parte el sistema y hacer pruebas sin miedo, te recomiendo leer por aqui:

    Sistema de inicio tradicional:
    http://tldp.org/LDP/sag/html/boots-and-shutdowns.html
    http://tldp.org/LDP/sag/html/init-intro.html

    Sistema de inicio usado por Ubuntu
    http://www.netsplit.com/category/tech/upstart/

  28. Viernes, 3 de octubre de 2008 a las 05:22 | #28

    Jejeje para avanzados, definitivamente.. por cierto
    sudo apt-get remove bootchart ¿es seguro?
    porque lo instale antes de leer el centro del articulo, si es posible una respuesta y que no me vaya a quedar sin sistema.. salu2

  29. Viernes, 3 de octubre de 2008 a las 12:46 | #29

    Puedes eliminar bootchart con tranquilidad. El paquete de bootchart se encargará de eliminarse limpiamente.

  30. Viernes, 3 de octubre de 2008 a las 14:09 | #30

    Actualización: Se han hecho cambios al kernel para mejorar agresivamente el tiempo de inicio. En el caso extremo que incluye usar un disco de estado sólido como el del Asus EEE, se logra iniciar el sistema en sólo 5 segundos

    http://lwn.net/Articles/299483/

  31. Domingo, 16 de noviembre de 2008 a las 14:22 | #31

    Esta weno el artículo Franco… Pero una consulta.. Yo uso Debian, en esta distro, ¿será el mismo procedimiento?

    Crees que se pueda presentar algun inconveniente?

    saludos, quedó wena la nueva apariencia de tu blog

  32. Domingo, 16 de noviembre de 2008 a las 18:03 | #32

    En debian no tienen este sistema para ayudar a instalar estos drivers. En todo caso es probable que en Debian además tengan una versión anterior de X.org

    Saludos y gracias!

  33. Domingo, 16 de noviembre de 2008 a las 18:05 | #33

    Olvida lo que acabo de decir haha, tenía en mente otro artículo.

    En Debian el procedimiento debe ser similar, pero no se si manejarán readahead

  34. Juan
    Viernes, 27 de febrero de 2009 a las 16:45 | #34

    Hola Franco y demás colaboradores. Mi problema es el siguiente:
    He instalado bootchart y he añadido el init=/sbin/bootchartd en el menu.lst, pero al reiniciar me dice lo siguiente:

    kinit: name_lo_div_t (/dev/disk/ …)
    =sda7(8,7)
    kinit: No resume image, doing normal boot …
    target filesystem doesn’t have /sbin/bootchartd

    La entrada de mi ubuntu en menu.lst es la siguiente:

    title Ubuntu 8.04, kernel 2.6.24-19-generic
    root (hd0,4)
    kernel /boot/vmlinuz-2.6.24-19-generic root=UUID=f384d9d0-642a-4e3d-860f-1ed6a131ff60 ro quiet splash
    initrd /boot/initrd.img-2.6.24-19-generic
    quiet

    y después de modificarlo me queda así:

    title Ubuntu 8.04, Bootchart
    root (hd0,4)
    kernel /boot/vmlinuz-2.6.24-19-generic root=UUID=f384d9d0-642a-4e3d-860f-1ed6a131ff60 ro quiet init=/sbin/bootchartd
    initrd /boot/initrd.img-2.6.24-19-generic
    quiet

    que es lo que estoy haciendo mal? Gracias de antemano

  35. Viernes, 27 de febrero de 2009 a las 20:38 | #35

    Si usas Ubuntu no necesitas modificar tu menu.lst a menos que quieras desactivar bootchart.

    Sigue mis indicaciones de arriba, solo apt-get, reboot y a revisar el gráfico.

    BTW: lo que hiciste con ese cambio fue arruinar la carga de todo el sistema de inicio. Bootchartd se integra al sistema de inicio estándard, no es necesario hacer lo que hiciste ahi. Lo bueno es que puedes volver a dejarlo como estaba presionando la tecla “e” en el menú de grub.

  36. Juan
    Martes, 3 de marzo de 2009 a las 16:50 | #36

    Hola Franco.
    Lo acabo de probar y en la carpeta /var/log/bootchart no hay absolutamente nada. No se qué hacer. ¿Qué crees que estoy haciendo mal? (uso Ubuntu 8.10).
    Gracias

  37. Juan
    Miércoles, 4 de marzo de 2009 a las 09:41 | #37

    Buenas!
    Creo que se donde puede estar el error:
    el bootchart funciona pero solo genera el grafico para el ultimo kernel instalado y yo no lo veo porque no es el kernel con el cual booteo.
    Ahora el tema es saber cual es el último kernel y cómo modificar mi menu.lst para que cargue con él.
    Si alguien me puede ayudar …

  38. SetLorD
    Sábado, 6 de marzo de 2010 a las 23:30 | #38

    Franco, tremendo artículo, lo leí en Linux+ (fíjate en el número que vamos acá en Chile [navidad 2008])
    ¿Cómo sería para Ubuntu 9.10?

    Gracias!

  39. Domingo, 7 de marzo de 2010 a las 11:24 | #39

    Recién llegó ese!? Increíble

    Para 9.10 no es necesario hacer mucho, ya viene bastante optimizado.

  1. Domingo, 12 de julio de 2009 a las 18:37 | #1
Debes estar registrado para dejar un comentario.