domingo, 12 de junio de 2011

Famoso "noatime"

Bueno señores, hoy vamos a ver una configuración muy simple de aplicar, y que hace que el sistema vaya muuucho más flúido. Y estoy hablando del parámetro "noatime".

Qué es esto de "noatime"? Pues "noatime " es un parámetro especial en el montaje de los dispositivos como discos duros o memórias extraibles. Se acostumbra a modificar en el fichero /etc/fstab.

[Explicación]
Resulta que nuestro sistema de ficheros guarda, para cada uno de nuestros ficheros, un parámetro que se llama "atime", o "access time". Total, que cada vez que accedemos ( leemos ) un fichero, el valor "atime" se actualiza. Así podemos saber cuál fué la última vez que accedimos/leimos un determinado fichero.

Pero claro, esto tiene un comportamiento no deseado: Resulta que por cada lectura que hacemos a disco, necesitamos escribir algo a disco!! ( actualizar el valor "access time"). Esto parece absurdo! Para leer tenemos que escribir.

Habrá alguien que pensará: exagerado! No es para tanto. Total, tiene que escribir a disco tan solo unos pocos bytes, esto no es nhà.

Pues bueno, resulta que escribir estos pocos bytes si jode, y mucho. Me explico. Linux tiene un sistema fantástico de caches, completamente transparente para el usuario. Te permite hacer lo siguiente:

# cat ./bashrc
# cat ./bashrc


La primera vez que haces el "cat" de cualquier fichero ( en nuestro caso, .bashrc ), se va al disco duro, y lo lee. Pero también lo pone en la memória RAM. La segunda vez que ejecutas el comando "cat", sabe que lo tiene cacheado y lo lee directamente de memória RAM. No hace falta tocar disco duro. Esto hace que el sistema vaya muuuucho más rápido, ya que todo los ficheros que hayas leido una vez ( y no se hayan modificado ) ya están cacheados, y no se precisa leer a disco. Pero que pasa si no tenemos desactivado el "atime", pues que con cada lectura, aunque la tuvieses cacheada, tienes que hacer una escritura a disco para actualizar el tiempo de acceso. Nos ha jodido.

Esto, en portátiles tiene un impacto muy grande ya que al cabo de X segundos de no utilizar el disco duro, éste se para. Un tema de ahorro de energía. Qué pasa si queremos hacer una lectura o escritura? Pues que el disco se tiene que volver a poner a girar con el consiguiente consumo energético/tiempo perdido. Pero si intentamos leer un fichero CACHEADO por el sistema, el disco duro ni se entera. Sigue parado. Por lo que es genial.

[HOTWO]
Cómo activar la opción "noatime"?
Con tu editor preferido (gedit, nano, emacs) el fichero, en mi caso "vim":
# sudo vim /etc/fstab

Busca tu disco duro principal. Lo mas seguro es que sea una entrada como esta:
UUID=3e9532f9-226c-4f17-ae64-dad42519a1fc / ext4 errors=remount-ro 0 1

y añade simplemente "noatime" en las opciones para que quede tal que así:
UUID=3e9532f9-226c-4f17-ae64-dad42519a1fc / ext4 noatime,errors=remount-ro 0 1

y punto. Reinicia y ya lo tienes.


[Prueba de concepto]
Para los menos crédulos: que os den ¬¬. Y para los mas frikis, vamos a hacer una prueba de concepto. El siguiente comando busca TODOS los ficheros están en /etc y les hace un "cat". Redirijo la salida a /dev/null porque no me interesa ver el contenido de los ficheros, sinó que simplemente mi máquina los lea enteritos una vez y los cachee. Fijáos, de 2.62 segundos a 0.037. Y la segunda vez sin tocar disco duro!!! It rocks!!

inedit@tpad:/etc$ time find /etc -name ".*" -exec cat '{}' ";" > /dev/null 2>/dev/null

real 0m2.622s
user 0m0.024s
sys 0m0.044s
inedit@tpad:/etc$ time find /etc -name ".*" -exec cat '{}' ";" > /dev/null 2>/dev/null

real 0m0.037s
user 0m0.020s
sys 0m0.016s

[Cuándo aplicar esta configuración]
Bueno pues, recomendado, a todas las máquinas en general. Sin excepción.

Muy recomendado, en portátiles. Por el tema de ahorro de corriente, y del encendido/parado del disco.

Y OBLIGATORIO en los equipos:
- Servidores ( web-ftp-sambda ) con muchas lecturas. Aquí si que utilizar el sistema de cachés es algo básico, y no quitar el atime podría hacer que el rendimiento fuese pésimo.
- Equipos con discos duros SSD. Esto es debido a que los SSD tienen un número de escrituras máximas por bloque, y al llegar este número se desactiva el bloque y no se utiliza nunca más. Por lo que tener el "atime" activado significa que la vida del disco va a ser mucho mas corta.


El desarrollador del kernel Ingo Molnar dijo:

Atime updates are by far the biggest IO performance deficiency that Linux has today. Getting rid of atime updates would give us more everyday Linux performance than all the pagecache speedups of the past 10 years, _combined_.


Un saludo, Jan!

8 comentarios:

  1. Hola! esta información es muy buena e interesante, solo tengo una duda, el archivo fstab me marca mis particiones "/" "/home" y "swap" el "noatime" lo pongo en "/" o lo puedo poner en "/" y "/home"?

    ResponderEliminar
  2. Estoy contento de que te haya sido de utilidad este post, rob-soto.

    Pues el parámetro "noatime" se lo puedes poner a cualquier partición ext3/ext4 que desees. O sea que si, es muy buena idea que se lo pongas a ambos directorios, tanto "/" como "/home" y así aprovecharás la ventaja de no tener que escribir a disco cada vez que hagas una lectura.

    Como veo que estás optimizando el uso de disco, te recomiento que veas artículos sobre "tmpfs", que son sistemas de ficheros que se montan en memoria RAM.

    Mira, sabes que? Durante esta semana escribo un artículo sobre tmpfs, que veo que no tengo nada.

    Un saludo, y si tienes alguna otra duda, no dudes en preguntar ;)

    ResponderEliminar
  3. Explicación genial, gracias!!

    ResponderEliminar
  4. Muchas gracias, Anónimo. Me complace saber que te ha gustado el post ;)

    Un saludo!

    ResponderEliminar
  5. En caso de tener una partición / y otra /home, ambas en ext4, recomendarías también el parámetro noatime para /home? o solamente para /?
    Un post bien interesante.
    Un saludo y gracias!

    ResponderEliminar
  6. glups... no leí el primer comentario, así que olvida la primera frase y quédate con las dos siguientes.
    (soy el anónimo de antes)

    ResponderEliminar
  7. Jejeje, tranquilo Anónimo.

    Muchas gracias por comentar. Siempre se agradece saber que éste post le ha servido a alguien ;)

    Un saludo, Jan.

    ResponderEliminar
  8. Creo que habría que agregar lo del sistema de ficheros que son compatibles al tutorial men. De no ser por que leí los comentarios, lo hubiera aplicado a mi boot ext2. Gracias

    ResponderEliminar