29 de marzo de 2009

No más atime con relatime

Por fin, despues de tanto tiempo de discusiones absurdas, en uno de sus arranques Linus ha incluido y activado por defecto relatime. Que es una abreviación de "relative atime". Y "atime" es, a su vez, una abreviación de "access time", donde se almacena la última vez que se accedió a ese archivo.

El problema de atime es que, como consecuencia, cada vez que se lee un archivo hay que realizar una escritura para actualizar ese campo. Algo que no es ninguna minucia, porque los programas están constántemente leyendo cosas, a veces con mucha frecuencia, y se generan auténticas "tormentas" de actualizaciones de atime pendientes. De hecho, es una de las cosas que más pueden enlentecer una máquina. Ya conté hace tiempo que en los pedazo de servidores de kernel.org, el simple hecho de desactivar la actualización del campo atime (con la opción "noatime") les redujo la carga del sistema a la mitad. Un simple doble click en la carpeta del navegador de archivos implica una escritura para actualizar el atime del directorio....y una adicional (en la práctica, varias adicionales) por cada uno de los archivos presentes en el directorio, a los que el navegador de archivos accede para averiguar su contenido. En un servidor web, cada petición HTTP implica una actualización del atime de todos los archivos .html/.php a los que se acceda, generando más escrituras cuantas más visitas se reciben (que es cuando menos se necesita que el disco esté perdiendo el tiempo con actualizaciones de atime)

El caso es que atime es parte de POSIX. Es uno de esos casos donde los estándares se apartan de la realidad, porque desactivar la actualización de atime es uno de los recursos más frecuentes en todo tipo de sistemas operativos (en las comparaciones windows vs linux pagadas por microsoft, lo desactivan siempre, en ambos sistemas), pero como el estándar es el estándar sigue siendo la opción por defecto en muchos sistemas. Y hay algunas utilidades -raras-, como "tmpwatch", que se basan en el campo "atime" para fijarse en si un archivo ha sido accedido recientemente. Asi que aunque se puede estar años funcionando sin atime (como un servidor) y sin tener ningún problema, las distribuciones eran reacias a cambiar una aspecto por defecto del kernel como lo es la actualización del campo atime (aunque algunas, como Ubuntu, lo han hecho). Asi que al final se ha inventado realtime: Se actualiza el campo atime...solamente si entre ese momento y la anterior fecha de atime han pasado más de 24 horas. Eso elimina gran parte de las actualizaciones de atime, pero al mismo tiempo no las elimina del todo.

El resultado es que la mayoría de las distros incorporarán este cambio, y el rendimiento de los equipos de la gente aumentará un poco...por la cara. Creo que es el primer Unix que hace algo así de serie, y ya era hora de que alguien lo hiciera.

4 comentarios:

  1. En openSUSE vendrá puesto por defecto para la versión 11.2.

    En una partición con más de 40 millones de archivos se nota... bastante.

    ResponderEliminar
  2. Un post muy instructivo, como casi todo lo que pones por aquí. Supongo que uno de los puntos donde se podría notar esto bastante sería en el proceso de boot...

    ResponderEliminar
  3. El relatime es un avence, aunque es una pena no tirar directamente al "noatime" por problemas con POSIX.

    No estaría nada mal que dicho estándar se cambiase para que no obligase el "atime", sería beneficioso para muchos sistemas tipo unix.

    ResponderEliminar
  4. Me escama de cara a la seguridad no saber si se ha accedido o no a ciertos archivos. ¿Qué han propuesto para esto? Supongo que seguir con atime...

    ResponderEliminar