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 comentario: