21 de junio de 2014

Lo que se espera de un sistemas de archivos moderno

Recientemente ha corrido por internet este post de un tipo que ha perdido 28 archivos de un total de 15264 debido a corrupción en el disco duro en el que guarda una de las copias de seguridad. El post, sin embargo, está dedicado casi íntegramente a quejarse de lo malo y viejo que es HFS+. Y no deja de ser curioso, porque en este caso HFS+ no tiene la culpa de nada.

En realidad, el autor lo ha reconocido a posteriori en una edición al final del artículo, reconociendo lo obvio: que la corrupción es debida a fallos en el disco duro, no a una corrupción causada por HFS+. Pero eso no es suficiente para esconder la tendencia del artículo, que queda bien patente en la frase "HFS+ lost a total of 28 files over the course of 6 years", resaltada en negrita. Es errónea, HFS+ no ha "perdido" nada, ha sido la corrupción del disco duro. Si hubiese utilizado ZFS hubiera recibido advertencias de la corrupción, pero sin tener configurada algún modo de duplicación de datos, las corrupciones hubiesen sido igualmente irrecuperables.

Aun así, el autor podría tener algo de razón destacando que la culpa es de HFS+, ya que al carecer HFS+ de checksum de datos, si se corrompe un archivo esa corrupción se puede extender a las copias de seguridad sin que nadie lo note. Es cierto, pero resulta un tanto dramático. Windows, que está infinitamente más extendido que OS X, tampoco tiene ningún tipo de checksums ni para datos ni para metadatos (sólo el raid integrado de storage spaces), y hay millones de personas que hacen copias de seguridad en sistemas Windows (bueno, quizás no tantas...), y sin duda debe haber personas a las que los discos duros les corrompen algún archivo. Si la gente en Windows está acostumbrada a esta realidad, debe ser a que han logrado acostumbrarse a ello, o que los programas de copia de seguridad utilizan checksums por su cuenta.

Pero dejando este dilema de lado, lo que destacaría es el efecto que ha tenido ZFS: la gente acepta como algo natural exigir que su sistema de archivos sea capaz de detectar y gestionar correctamente la corrupción. Hace unos años esto no pasaba.

14 de junio de 2014

Las novedades de Linux 3.15

Ya se ha anunciado la versión 3.15 de Linux. Entre las novedades de esta versión destacan que los sistemas con discos duros reanudan el sistema más rápido tras la suspensión, destaca también la capacidad para el renombrado cruzado y atómico de archivos, añade dos nuevos modos en fallocate(2) que permiten eliminar porciones de archivo o reescribirlas con ceros, el sistema de gestión de memoria se adapta mejor al tamaño de la carga de memoria del sistema, mejora el rendimiento de escritura de FUSE, se añade soporte para el algoritmo LZ4 en el sistema de compresión de memoria zram, kernels de 64 bits pueden cargarse desde firmwares EFI de 32 bits y se añade soporte para las instrucciones vectoriales AVX-512 que serán incluidas en futuras CPUs Intel. También se han incluido drivers nuevos y muchas otras mejoras y pequeños cambios. La lista completa de cambios, en inglés, puede encontrarse aquí, como siempre.


· Reanudación de la suspensión más rápida en sistemas con discos duros
La reanudación de la suspensión tardaba más de lo necesario en sistemas con discos duros tradicionales, porque el sistema se pausaba hasta que el disco duro terminara de encenderse. En esta versión, los comandos enviados al disco se envían asincrónicamente, de modo que el sistema no necesita pausarse para esperar al disco duro. El resultado es que los sistemas con discos duros reanudarán el proceso de suspensión varios segundos más rápido. Para más detalles, lea este blog.
 
· Mejora de la detección del tamaño de la memoria de trabajo
Cuando no hay suficiente espacio para toda la memoria en RAM, el kernel tiene la responsabilidad de decidir qué partes de la memoria deben permanecer en RAM y cuáles deben enviarse a swap o ser descartadas. Para poder tomar buenas decisiones en esa tarea, es necesario tomar nota de qué memoria es la más usada y merece permanecer en RAM y cuál puede ser evacuada. El modo en que el kernel Linux hace esto es manteniendo una lista de memoria "activa" e "inactiva", de modo que cuando unos datos son movidos a la memoria RAM su memoria es marcada como activa. A medida que se va usando más y más memoria, la lista activa se llena y la memoria menos usada se mueve a la lista inactiva.

El problema central de este algoritmo está en determinar cuál debe ser el tamaño de cada lista. Linux tiene una política de no permitir que la lista activa pueda crecer más que la inactiva, pero esta aproximación causa problemas. En esta versión, Linux toma nota con más detalle del uso de memoria y puede determinar con más fiabilidad el tamaño adecuado de las listas, lo cual hace que Linux funcione mejor en determinadas cargas, y que se adapte mejor a los cambios de carga, además de crear una fundación sólida que permitirá implementar políticas más eficaces en el futuro. Para más detalles, lea el artículo: Better active/inactive list balancing

· Los kernels EFI 64 bit pueden arrancar desde firmware de 32 bits
La mayoría de las CPUs x86 a día de hoy son de 64 bits, pero muchos sistemas modernos utilizan firmware EFI de 32 bits. Esto impedía cargar un kernel para sistemas de EFI de 64 bits desde ese firmware de 32 bits, pero esa limitación ha sido eliminada en esav versión (nótese que no es posible arrancar un kernel desde un stub EFI, es necesario un cargador que siga un protocolo determinado)

· Nuevo sistema de bloqueo de archivos: bloqueos privados de archivos
Debido a una historia desafortunada, los bloqueos de archivos POSIX tienen semánticas muy extrañas y poco útiles: los bloqueos son abandonados si el proceso cierra algún descriptor de archivo asociado con el inodo, y los bloqueos tomados por diferentes hilos del mismo proceso no se afectan entre si, lo cuál hace a este sistema inútil para el bloqueo de archivos entre hilos.

Esta versión añade un nuevo tipo de bloqueo que pretende solventar esos problemas. Estos nuevos bloqueos se afectan entre si con los bloqueos clásicos POSIX, pero tienen semánticas más similares a los bloqueos BSD respecto a la herencia y el comportamiento en el cierre del archivo. Para más documentación sobre la nueva API, lea el artículo: File-private POSIX locks

· Borrado y puesta a cero de partes de archivo más veloz
Esta versión de Linux incorpora dos nuevas flags de modo a fallocate(2):

  · FALLOC_FL_COLLAPSE_RANGE: Permite eliminar una porción de un archivo sin dejar agujeros, mejorando el rendimiento de operaciones que antes tenían que hacerse con atajos más costosos.

 · FALLOC_FL_ZERO_RANGE: Permite reescribir con ceros una porción de un archivo con más velocidad de lo que tomaría hacerlo manualmente (esta característica estaba disponible previamente en XFS con la ioctl XFS_IOC_ZERO_RANGE)

En esta versión, sólo XFS y ext4 tienen soporte para esas flags. Para más detalles, lea el artículo: Finding the proper scope of a file collapse operation

· Soporte para el renombrado cruzado de archivos
Esta versión añade soporte para el renombre cruzado, una variedad del renombrado de archivos en el cual dos archivos intercambian su nombre. Esta característica permite casos de usos interesantes que no eran posible antes, como por ejemplo reemplazar atómicamente un directorio con un enlace simbólico. También permite que sistemas de archivo como overlayfs operen en medio de whiteouts atómicamente. Para más detalles, lea el artículo Exchanging two files

· zram: soporte de compresión LZ4, rendimiento mejorado
Zram es un sistema de compresión de memoria utilizado por Android, Cyanogenmod, Chrome OS, Lubuntu y otros proyectos, y que fue añadido en Linux 3.14. En esta versión zram incorpora soporte para el algoritmo de compresión LZ4, que es mejor que el algoritmo actual LZO en algunos casos.

Esta versión también incorpora mejoras de rendimiento para la compresión concurrente de varios streams de compresión, y la habilidad para cambiar el algoritmo de compresión en vivo en /sys/block/zram0/comp_algorithm

· Soporte de las instrucciones vectoriales de Intel AVX-512
Las instrucciones AVX-512 son extensiones de 512 bits a las instrucciones SIMD de 256 bits "Advanced Vector Extensions" para x86. Han sido propuestas por Intel, y se espera que sean soportadas en 2015 en los procesadores Intel Knights Landing. Para más información sobre estas extensiones, lea la documentación.

· Mejora del rendimiento de la escritura de FUSE
En esta versión FUSE ha añadido la capacidad de usar el cache de escritura, lo cual mejora el rendimiento de las operaciones de escritura.

Y eso es todo. La lista completa de cambios en inglés, aquí.