14 de octubre de 2020

Las novedades de Linux 5.9

Ya se ha publicado la versión 5.9 de Linux. Esta versión incorpora una mejor gestión de la memoria anónima (malloc); un nuevo controlador de memoria slab que permite compartir esa memoria entre diferentes cgroups; soporte para defragmentación de memoria proactiva; conocimiento de las capacidades de la CPU por la clase de planificación deadline; soporte para ejecutar programas BPF cuando se accede a un socket; nueva llamada al sistema close_range() para cerrar rangos enteros de descriptores de archivos; soporte para las instrucciones x86 FGFSBASE que permiten un cambio de contexto más veloz; soporte de atributos extendidos en NFS; y soporte para kernels, discos ram e initrds comprimidos con ZSTD. Además, hay muchas otras mejoras y pequeños parches. La lista completa de cambios, en inglés, se encuentra aquí.

  •  Mejor gestión de la memoria anónima
Esta versión implementa mejor detección y protección de memoria anónima (memoria que no está respaldada por archivos, como por ejemplo la proveniente de malloc). Linux gestiona la memoria anónima ubicando sus páginas en la lista activa o inactiva. Cuando hay presión de memoria, las páginas menos utilizadas se mueven de la lista activa a la inactiva y desmapeadas, dándoles la oportunidad de ser referenciadas de nuevo (lo que se llama una falta ligera) antes de ser trasladadas al intercambio, si hay más presión.

En la implementación previa, las páginas recién creadas o traídas del intercambio se ubicaban en la lista activa, lo cual podía forzar a reubicar las que estaba siendo utilizadas activamente a la lista inactiva. En esta versión, las páginas nuevas o traídas del intercambio se ubican en la lista inactiva, y sólo son ascendidas a la lista activa si son referenciadas lo suficiente. Adicionalmente, y porque este cambio puede provocar que esas páginas hagan descender a las páginas inactivas al intercambio, se ha extendido el mecanismo de detección de carga de trabajo ya existente para que gestione también la lista de memoria anónima, para así tomar mejores decisiones.
  • Nuevo controlador de slab de cgroups que es capaz de compartir memoria
El controlador de memoria slab se basó en la idea de replicar un asignador de memoria slab en cada cgroup, lo cual tuvo como consecuencia que esos cgroups no compartiesen memoria slab entre ellos, algo que provoca baja utilización del slab y mayor uso de memoria. El controlador de slab solía ser algo opcional, pero hoy se activa por defecto en el controlador de memoria, y los sistemas modernos con systemd crean muchos cgroups, por lo que este problema afecta a mucha gente.

Esta versión incorpora una nueva implementación de controlador de slab que permite compartir memoria entre cgroups. En pruebas de Facebook, este sistema ahorra entre varios cientos de MB hasta 1 GB por equipo; de media el tamaño de la memoria de slabs se redujo un 35-45%. Los escritorios también se benefician: en un sistema Fedora de 16 GB, el nuevo controlador ahorra un 45-50% de memoria slab, medido justo tras iniciar el sistema.

  • Compactación de memoria proactiva
Las páginas gigantes (páginas mayores de 4KB en x86) son una característica de los procesadores que puede mejorar el rendimiento debido a la reducción del uso del TBL. Hacer uso de esas páginas requiere tener grandes cantidades de memoria vacía contigua, lo cual puede resultar difícil si la memoria está fragmentada. Linux soporta la compactación (es decir, defragmentación) de memoria, pero sólo entra en funcionamiento cuando se necesita asignar una nueva página de memoria, lo cual puede tomar tiempo y dañar la latencia de la asignación. Esta versión añade soporte para la compactación de memoria proactiva, es decir, el mecanismo empieza a funcionar antes de hacer ninguna asignación, de manera que futuras asignaciones puedan finalizar con mayor velocidad.

 

  • Nueva llamada al sistema close_range() para cerrar descriptores de archivos más fácilmente
Esta versión incorpora una nueva llamada al sistema, close_range(2). Permite cerrar con eficiencia un rango de descriptores de archivos de una tarea. Por ejemplo, close_range(3, ~0U) cierra todos los descriptores de archivo más allá de stderr. Resulta que hay muchos proyectos que necesitan hacer exactamente eso: gestores de servicios, libcs, gestores de contenedores, lenguajes de programación/librerías estándar (Rust/Python). Esta llamada al sistema ha sido coordinada con FreeBSD, de modo que también está disponible allí.


  • Soporte para ejecutar programas BPF cuando se accede a un socket

Como en cada nueva versión, hay muchas mejoras en BPF. Una característica interesante es un nuevo tipo de programa BPF llamado BPF_PROG_TYPE_SK_LOOKUP, que se ejecuta cuando la capa de transporte está intentando conectar con socket para establecer una nueva conexión TCP, o cuando se intenta enviar datos a un socket UDP. Este mecanismo sirve para superar las limitaciones de bind(). Hay dos casos de uso que motivan este trabajo: 1) reconducir paquetes destinados a un rango IP determinado, de un puerto a un socket, 2) reconducir paquetes destinados a una dirección IP, de cualquier puerto a un socket.

 

  • Conocimiento de las capacidades de la CPU por la clase de planificación deadline

 Desde Linux 3.14, el planificador de tareas de Linux soporte una clase de planificación deadline, diseñada con conceptos de tiempo real para aplicaciones que tienen requerimientos de tiempos muy estrictos. Esta clase de planificación no tiene noción de la existencia de plataformas con CPUs heterogeneas donde las CPUs no tienen el mismo rendimiento (por ejemplo, ARM big.LITTLE), lo cual lleva a tomar decisiones equivocadas. Esta versión hace que la clase de planificación deadline esté al tanto de la capacidad de cada CPU.

 

  • Cambio de contexto más rápido con las instrucciones de x86 FGFSBASE
Las instrucciones FGFSBASE son una característica de Intel disponible desde hace tiempo. Permiten el acceso directo a los registros de segmento FG y FS. Además de los beneficiones para las aplicaciones, hay mejoras de rendimiento en el cambio de contexto.

 

  • Soporte en NFS de atributos extendidos
Esta versión incorpora el soporte en NFS para atributos extendidos (RFC 8276), lo cual resuelve una de las carencias más importantes de NFS.
 

  • Soporte para kernel, ramdisk e initramfs comprimidos con ZSTD

Esta versión incorpora soporte para un kernel, ramdisk e initrd comprimidos con ZSTD. ZSTD ofrece buenas capacidades de compresión, y magníficas velocidades de descompresión. En pruebas de Facebook, cambiar de initrd comprimido con xz a ZSTD redujo el tiempo de descompresión de 12 segundos a 3 segundos. Cuando cambiaron el kernel, ahorraron 2 segundos en el tiempo de arranque.


Y eso es todo. Como siempre, pueden encontrar la lista completa de cambios, en inglés, en esta página.

1 de junio de 2020

Las novedades de Linux 5.7

Ya se ha publicado Linux 5.7. Las novedades de esta versión son: Soporte de Presión Termal, que permite que el organizador de tareas tome mejores decisiones en presencia de cambios de frecuencia de CPU; soporte para contabilidad del organizador de frecuencia invariante, que logra que x86 funciona con más rendimiento con el gobernador cpufreq schedutil; una nueva y mejor implementación del sistema de archivos exFAT; soporte para una característica de x86 que permite detectar operaciones atómicas que abarcan varias líneas cache; soporte de Autentificación de Punteros de ARM en el código del kernel, que frena algunos problemas de seguridad; soporte para engendrar procesos con clone() dentro de un cgroup determinado; soporte de protección para escritura en userfaultfd(), que es equivalente (pero más rápido) que usar mprotect(2) y señales SIGSEGV; y un Módulo de Seguridad Linux basado en BPF que permite una auditoría de seguridad más dinámica. Además, hay muchas otras mejoras y pequeños parches. La lista completa de cambios, en inglés, se encuentra aquí.

  • El organizador de tareas incorpora el concepto de Presión Termal
Cuando una CPU se calienta en exceso, el gobernador termal procede a limitar su frecuencia máxima. Esta limitación reduce, sin embargo, la capacidad de computación de esa CPU. Si el organizador de tareas no está al tanto de esos cambios de frecuencia, tomará decisiones equivocadas, asumiendo que la CPU tiene más capacidad de computación de la que realmente tiene en ese momento.

Esta versión incorpora el concepto de Presión Termal, que logra que el organizador de tareas esté más al corriente de los cambios de frecuencia, y por tanto, que tome mejores decisiones cuando los sistemas están calentándose en exceso, lo cual mejora el rendimiento. Artículo  LWN recomendado: Telling the scheduler about thermal pressure

  • Contabilidad del organizador de frecuencia invariante en x86.
Supongamos que una CPU tiene dos frecuencias: 500 y 1000 MHz. Cuando ejecuta una tarea que normalmente consumiría 1/3 de la CPU a 1000 MHz, aparentaría consumir 2/3 si la CPU funcionase a 500 MHz, dando la falsa impresión de que la CPU está casi al máximo de su capacidad, a pesar de que puede ir más rápido. Sin una escala de frecuencia invariante, las tareas parecen más grandes sólo porque la CPU funciona con más lentitud. El gobernador de cpufreq schedutil -que utiliza información de utilización proporcionada por el organizador de procesos para tomar sus decisiones- toma decisiones equivocadas y tiene peor rendimiento.

Esta versión incorpora una implementación de contabilidad del organizador con frecuencia invariante en algunas CPUs x86. Esto hace que las estimaciones de capacidad sean más precisas y las tareas permanezcan en la misma CPU en presencia de cambios de voltaje y frecuencia. Las mejoras introducidas han dado motivo para que el driver intel_pstate utilice por defecto el gobernador schedutil. Artículo de LWN recomendado: Frequency-invariant utilization tracking for x86.

  • Nuevo sistema de archivos exFAT
Linux 5.4 añadió una implementación experimental del sistema de archivos exFAT. Este sistema de archivos ha sido eliminado; en su lugar, se ha decidido que una implementación alternativa creada por Samsung tenía mayor calidad, y ha sido añadida en esta versión.

  • Detección de bloqueos partidos
Un bloqueo partido sucede cuando una instrucción de CPU atómica opera sobre datos que abarcan más de una línea cache. Es mucho más lento que una operación atómica que opera en una sola línea cache, y además empeora el rendimiento en otros procesadores. Esta versión incorpora una característica de x86 que permite detectar bloqueos partidos. Utilizando la opción de arranque split_lock_detect, es posible advertir o incluso enviar la señal SIGBUS a las aplicaciones que hacen uso de bloqueos partidos. Artículo de LWN recomendado: Developers split over split-lock detection.

  • Soporte de Autentificación de Punteros de ARM en el Kernel
Linux 5.0 añadió soporte para una extensión de ARM 8.3 llamada Autentificación de Punteros, que utiliza un código de autentificación de puntero para determinar si los punteros de un programa han sido modificados inesperadamente. Esto previene muchos fallos de seguridad, pero este soporte estaba limitado a espacio de usuario. En esta versión se añade soporte para el kernel arm64, que debería ayudar a proteger el kernel contra ciertos tipos de ataques. Artículo de LWN recomendado: ARM pointer authentication.

  • Soporte de protección de escritura en userfaultfd()
Esta versión añade soporte de protección de escritura a userfaultfd(), una llamada al sistema añadida en Linux 4.3 para permitir que un proceso gestione los fallos de página en espacio de usuario. Esto significa que los intentos de escribir en áreas del espacio de direcciones especificados con userfaultfd() podrán ser gestionados por el espacio de usuario. Esto es equivalente (pero más rápido) que usar mprotect(2) y un manejador de señal SIGSEGV. hugetblfs/shmem aun no están soportados. Para más detalles, vea la documentación. Artículo LWN recomendado: Write-protect for userfaultfd().

  • bpf-lsm: Un Módulo de Seguridad Linux basado en BPF
La actual infraestructura del kernel destinada a proporcionar telemetría relacionada con la seguridad (audit, perf, etc) está separada de la aplicación de reglas de acceso (LSMs). Mejorar la información proporcionada por audit requiere cambios en el kernel, su lenguage de políticas y componentes de espacio de usuario. Es más, construir una nueva política MAC basada en la nueva telemetría requiere cambios a varios LSMs y a sus respectivos lenguajes de políticas. Esta versión añade un nuevo LSM que permite que los programas BPF se vinculen con los ganchos LSM existentes, con lo cual es posible tener una política de auditoría y MAC unificado y adaptable dinámicamente mediantes programas BPF. Artículo LWN recomendado: KRSI — the other BPF security module.

  • clone(): permitir crear procesos dentro de cgroups
Esta versió añade soporte en clone() para engendrar procesos en un cgroup diferente que el de su padre, lo cual significa que los llamantes pueden limitar los procesos e hilos desde el momento en que son engendrados. Un gestor de servicios puede engendrar directamente nuevos servicios en cgroups dedicados; la pequeña contabilidad que se pierde en el tiempo en que se tarda en mover el proceso al cgroup se elimina; las aplicaciones con hilos o incluso implementaciones de hilos pueden elegir crear un diseño de cgroups específico donde cada hilo es concebido directamente en un cgroup dedicado. Artículo LWN recomendado: Cloning into a control group.

  • Mejora de funcionamiento de perf con cgroups
Antes, perf sólo podía hacer perfilados de tareas en un cgroup específico y no había manera de saber a qué cgroup pertenecía la muestra actual. En esta versión, perf incorpora información en cada muestra, lo cual hace imposible perfilar más de un cgroup y usar una clave para ordenar por cgroup en perf report.

Y eso es todo. Como siempre, pueden encontrar la lista completa de cambios, en inglés, en esta página.

25 de noviembre de 2019

Las novedades de Linux 5.4

Ya se ha publicado Linux 5.4. Las novedades de esta versión incluye el "kernel lockdown mode", con el que se pretende proteger los límites entre UID 0 y el kernel; virtio-fs, un driver virtio que permite a un huésped virtualizado montar sistemas de archivos del anfitrión; fs-verity, que permite detectar modificaciones no autorizadas en los archivos; dm-clone, que permite la clonación en vivo de targets de device-mapper; dos nuevas banderas en madvise() para mejor gestión de memoria de las aplicaciones en Android; soporte para nuevas GPUs Intel y AMD; soporte para el sistema de archivo exfat y eliminación del estatus experimental de erofs; soporte para haltpoll, un nuevo driver cpuidle que mejora el rendimiento en huéspedes virtualizados que quieren hacer polling en el loop idle; y blk-iocost, un controlador de cgroup E/S que intenta calcular mejor el coste de la E/S. Además, hay muchas otras mejoras y pequeños parches. La lista completa de cambios, en inglés, se encuentra aquí.


· Kernel lockdown mode


Esta versión incluye un modo opcional "kernel lockdown", que pretende fortalecer los límites entre UID 0 (root) y el kernel. Cuando se activa, se restringe la funcionalidad de varios aspectos del kernel. Las aplicaciones que dependen de acceso de bajo nivel o bien al hardware o al kernel podrían dejar de funcionar; por lo tanto debe evaluarse con antelación su activación. El propósito original de esta característica era honrar las protecciones anti-manipulación que se esperan de los entornos con arranque seguro UEFI, pero no está limitado a esa función.

Se ha implementado Kernel Lockdown como un módulo de seguridad de Linux, que puede configurase en modo de integridad o lockdown. Si se configura con modo integridad, se desactivarán las características del kernel que permiten modificar el kernel. Si se configura con modo de confidencialidad, también se desactivarán las características que permiten a los programas extraer información del kernel (estas restricciones no sólo se aplicarán a los programas de usuarios normales, sino también, recordemos, al usuario root). La configuración puede hacerse a través de securityfs, con un parámetro de arranque o en tiempo de compilación.

· virtio-fs, un puente para compartir sistemas de archivos con huéspedes virtualizados

Esta versión incluye virtio-fs, un driver virtio basado en FUSE que se utiliza para compartir sistemas de archivos entre huéspedes <-> anfitriones. Permite a un huésped montar un directorio que haya sido exportado desde el anfitrión. Aunque hay tecnologías similares que permiten este tipo de funcionalidad (NFS, virtio-9P), la proximidad entre VMs de virtio-fs permite aventajarles y proporcionar un rendimiento y unas semánticas de las APIs más similares a un sistema de archivos local que uno remoto.

<->· fs-verity, para la detección de modificaciones en archivos
<->fs-verity es una capa que los sistemas de archivos pueden utilizar para soportar transparentemente la protección de integridad y autenticidad de archivos de sólo lectura. Es similar a dm-verity, pero funciona a nivel de archivos, en lugar de bloques. Es utilizado por Ext4 y F2FS.
<->
<->Los programas pueden utilizar una ioctl que provoca que el sistema de archivos construya un árbol Merkle para el archivo que persista en alguna ubicación asociada con el archivo. Opcionalmente, es posible firmar archivos con una clave cargada en el keyring. Tras esta operación, el archivo se convierte en un archivo de sólo lectura, y todas las lecturas del archivo serán verificadas contra el árbol Merkle del archivo, con lo que se podrán detectar cualquier modificación, intencionada o no. Los programas pueden también obtener con rapidez el hash raíz del archivo con otra ioctl, lo cual puede ser utilizado para una serie de funcionalidades de seguridad. Para más detalles lean la<-> documentación.

<->· dm-clone
<->dm-clone es un target de device-mapper que hace una copia de una fuente de sólo lectura en un dispositivo de destino: Presenta un dispositivo de bloques virtual que muestra inmediatamente todos los datos, y redirige las lecturas y escrituras cuando sea necesario. El uso principal de dm-clone es clonar un dispositivo de bloques remoto, de alta latencia, en un dispositivo rápido y local. El dispositivo montado es inmediatamente visible y la copia de datos ocurre en segundo plano, en paralelo con la E/S de usuario.

<->· Soporte de nuevo hardware gráfico Intel/AMD
<->
<->
<->
Esta nueva versión añade soporte en el driver amdgpu para cuatro nuevos productos:: Navi 12/14, Arcturus y Renoir.<-><-> 

<->También incluye las primeras partes del soporte del futuro Intel Tiger Lake.
<->
<->· Dos nuevas banderas en madvise(): MADV_COLD y MADV_PAGEOUT
<-> Para mejorar el uso de memoria en algunos sistemas (notablemente, Android), se han incorporado dos nuevas banderas a madvise(): MADV_COLD y MADV_PAGEOUT. Estas dos nuevas banderas complementan a MADV_DONTNEED y MADV_FREE añadiendo formas no destructivas de recuperar memoria libre.
<->
<->MADV_COLD advierte al kernel de que las páginas pueden ser reclamadas cuando haya presión de memoria pero los datos deberían preservarse para el futuro, esto puede reducir el desalojo de la memoria utilizada y por lo tanto mejorar el rendimiento. Como contraste con MADV_FREE, los contenidos de la región son preservados al margen de que después se escriba a las páginas.
<->
MADV_PAGEOUT puede utilizarse por un proceso para marcar un rango de memoria como que no espera ser utilizado por un largo tiempo, de modo que el kernel reclame cualquier página de la LRU instantáneamente. El indicio puede ayudar al kernel a decidir qué páginas desalojar proactivamente. El acceso al rango tras una operación exitosa puede provocar fallos de página mayores, pero nunca perder los contenidos actualizados como ocurre con MADV_DONTNEED.
<->
<->· Erofs y exfat
<->Esta saca a erofs fuera del espacio de staging. Incluído por primera vez en Linux 4.19, erofs es un sistema de archivos de sólo lectura, con un diseño moderno para escenarios en los que se necesitan medios de sólo lectura de alto rendimiento, como firmwares de teléfonos o livecds. 

Esta versión también añade el sistema de archivos exfat al área staging.

· Polling más eficiente en huéspedes virtualizados con haltpoll
<->Esta versión incluye un driver cpuidle y un governor asociado llamados haltpoll. Estos dos mechanismos permiten a las CPUs virtuales continuar haciendo poll durante una determinada cantidad de tiempo antes de detenerse, lo cual proporciona una serie de ventajas considerables como evitar el coste de una VM-exit, que acaba traduciéndose en un mejor rendimiento. Para más detalles, lean la documentación.
<->
<->· blk-iocost, un controlador de E/S más preciso 
<->Una de las dificultades de controlar los recursos de E/S es la dificultad de observar su coste. El ancho de banda y las operaciones por segundo pueden variar enormemente dependiendo del tipo de dispositivo y de los patrones de E/S utilizados. Esto es un reto para los controladores cgroup de E/S, que deben poder calcular el coste de la E/S para hacer su trabajo: a pesar de que io.latency proporciona la capacidad de priorizar y proteger unas E/S sobre otras de otros cgroups, en la práctica su protección es binaria - el cgroup con el objetivo con mejor latencia es protegido a pesar del resto.

<->
Esta versoión incluye blk-iocost, un controlador con un modelo de coste de E/S que intenta ser más efectivo. Tiene un modelo donde cada E/S está clasificada como secuencial o aleatoria y se le da un coste base acorde. Cada E/S obtiene un coste bastante fiable, y distribuye la capacidad de E/S a cada cgroup de acuerdo con su peso jerárquico. Para más detalle, lean la documetación de io.cost.qos y io.cost.model<->.

<->· Espacio de nombres en los símbolos del kernel
<->Para soportar los módulos, el kernel necesita exportar los símbolos de las funciones utilizadas por los módulos. Con más de 30k símbolos en el kernel actual, gestionar todos los símbolos no es siempre fácil. En esta versión, el kernel permite a los mantenedores de subsistemas particionar y categorizar sus símbolos exportados en nombres de espacios diferentes, lo cual facilita el control de los símbolos. Los autores de módulos deben importar los espacios de nombres que quieran utilizar.

<->
Y eso es todo. Como siempre, pueden encontrar la lista completa de cambios, en inglés, en esta página.





<->