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.





<->

6 de mayo de 2019

Las novedades de Linux 5.1

Ya se ha publicado la versión 5.1 de Linux. Entre los cambios que trae consigo está versión se encuentra: io_uring, una nueva interfaz de alto rendimiento para E/S asíncrona; también se incluyen mejoras a fanotify que proporcionan una manera escalable de vigilar los cambios en sistemas de archivos grandes; se añade un método para permitir la entrega segura de señales en presencia de reutilización de PIDs; la memoria persistente puede utilizarse como RAM; los niveles de compresión Zstd en Btrfs son configurables; también se añade un nuevo gobernador cpuidle que toma mejores decisiones de gestión energética que el gobernador menu; todas las arquitecturas de 32 bits han añadido llamadas al sistema con time_t de 64 bits para afrontar el problema y2038; es posible arrancar desde un dispositivo de device-mapper sin usar initramfs; y el parcheo en vivo ha añadido soporte para parches acumulativos. Además, hay muchas otras mejoras y pequeños parches. La lista completa de cambios, en inglés, se encuentra aquí.


1. E/S asíncrona de alto rendimiento con io_uring

Linux soporta E/S asíncrona desde hace mucho tiempo. Sin embargo, la interfaz tiene un amplio número de problemas. No soporta, por ejemplo, E/S con búfers, sólo E/S sin buffers (O_DIRECT), que sólo utiliza un subconjunto de un subconjunto de aplicaciones. Incluso en esos casos, la E/S no era siempre asíncrona ni rápida. Todos los intentos de mejorar la interfaz existente han fracasado. 

Esta versión incluye una nueva interfaz, io_uring, que trae a Linux E/S asíncrona rápida y escalable, tanto con búfers como sin ellos, y soporta también E/S asíncrona con polling. Para más detalles, lea este  documento (PDF) que explica las razones por las que se ha creado io_uring, su funcionamiento interno, y la interfaz de cara al usuario. Para detalles sobre el rendimiento, vea este email.

Adicionalmente, se ha creado una librería, liburing, para las aplicaciones que no necesitan o no quieran preocuparse de juguetear con los detalles de bajo nivel de la interfaz. Tiene ayudantes que permiten a las aplicaciones configurar una instancia io_uring y enviar/completar E/S  in conocer los detalles más escabrosos de los anillos; continuará añadiendo ayudantes y más características con el tiempo.

2. Mejoras en fanotify para una mejor monitorización del sistema de archivos

A diferencia de otros sistemas operativos, Linux no proporciona un sistema eficiente para vigilar los cambios que ocurren en un sistema de archivos grande. La única manera de monitorizar eventos de modificación a un directorio es inotify, que escala mal con grandes árboles de directorios. La interfaz fanotify, introducida en Linux 2.6.36, tenía la pretensión de sustituir inotify y solucionar sus deficiencias, e inicialmente dió algunos pasos en esa dirección, pero la funcionalidad requerida para sustituir a inotify por completo.

Esta versión (junto con los cambios añadidos en Linux 4.20) expanden inotify para proporcionar la funcionalidad "super block root watch", que es una manera escalable de observar los cambios en grandes sistemas de archivos. Para más detalles, lea el wiki del proyecto.

3. Entrega segura de señales en presencia de reutilización de PID

La llamada al sistema kill(2) opera con PIDs. Tras la salida y muerte de un proceso, su numero de PID puede ser reutilizado por otro proceso. Si un proceso envía una señal a un PID reutilizado, estará enviando la señal al PID equivocado. Este es un problema conocido con el diseño de Unix, y ha provocado numerosos problemas de seguridad.

Tras considerar varias opciones, Linux ha añadido la llamada al sistema pidfd_send_signal(2), que utiliza descriptores de archivo de /proc/ para referencias a struct pid. Incluso tras el reciclado de un número PID, el descriptor no cambiará y hará referencia al viejo PID y no al nuevo, lo cual permite enviar señales al PID que en verdad se desea.

4. Utilización de memoria persistente como RAM

Linux soporta dispositivos de memoria persistente, pero normalmente son utilizados como dispositivos de almacenamiento. Algunas personas desean utilizar la memoria persistente como memoria volátil, están dispuestos a lidiar con las diferencias de rendimiento con la RAM, y quieren utilizar las APIs tradicionales de gestión de memoria en lugar de un asignador de memoria en espacio de usuario ubicado sobre el mmap() de un archivo DAX. Esta versión de Linux les permite hacer eso.

5. TEO, un gobernador alternativo a 'menu'

El  subsistema cpuidle es la parte del kernel encargada de decidir qué estado de sueño profundo utilizar cuando la CPU no tiene nada que hacer (los estados de sueño más profundo ahorran más energía, pero cuesta más salir de ellos). Hay dos gobernadores cpuidle, "menu" y "ladder", cada uno con diferentes heurísticas. Sin embargo, se cree que el gobernador "menu" tiene una serie de deficiencias que han llevado a añadir una alternativa: TEO, Timer Events Oriented Governor, que parece ofrecer mejoras de rendimiento sin aumento del consumo de energía. Puede observarse el gobernador que está siendo utilizado en /sys/devices/system/cpu/cpuidle/current_governor_ro, y cambiar el gobernador por defecto en el arranque con el parámetro cpuidle.governor=teo.

6. Más preparación para el año 2038

Como parte del trabajo para prepararse para el problema del año 2038, esta versión incluye llamadas de sistema con time_t de 64 bits para todas las arquitecturas de 64 bits. Esto permite finalmente tener llamadas al sistema con 64-bit time_t en todas las arquitecturas.

7. Compresión Zstd configurable para Btrfs

Btrfs tiene soporte de compresión Zstd desde Linux 4.14, pero no permitía configurar el nivel de compresión utilizado. Esta versión añade soporte para configurar el nivel de compresión en Btrfs, como se hace con zlib, utilizando la opción de montaje -o compress=zstd:nivel. Para ver los niveles disponibles y su impacto en el rendimiento y en el ratio de compresión, vea este commit.

8. Arranque desde un dispositivo de device mapper sin initramfs

Para arrancar a un sistema de archivos ubicado en un dispositivo device mapper, se necesita un initramfs. Algunas personas, sin embargo, querrían o no pueden usar un initramfs. Esta versión permite utilizar targets DM en el proceso de arranque sin la necesidad de initramfs, con la ayuda de un complicado parámetro de arranque del kernel. Para más detalles vean la  documentación.

9. parcheado en vivo: soporte para parches acumulativos

Puede haber dependencias entre los parches en vivo. Si diferentes parches necesitan hacer diferentes cambios a la misma función, es necesario definir el orden en el que los parches serán instalados. Y implementaciones de funciones en los parches en vivo más nuevos deberán realizarse encima de los viejos, algo que pronto se convierte en una pesadilla para mantener, especialmente si alguien quiere eliminar uno de los parches que está en medio de la pila. Una solución elegante que se incluye en esta versión es algo llamado "reemplazo atómico". Permite la creación de "parches acumulativos" que incluyen todos los cambios de los parches viejos y los reemplazan por completo en una sóla transición. Como resultado, los autores de parches en vivo pueden mantener las fuentes para un sólo parche acumulativo. Para más detalles, vea la documentación

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

29 de enero de 2018

Las novedades de Linux 4.15

Ya se ha anunciado la versión 4.15 de Linux. Además del código más actualizado para lidiar con Meltdown/Spectre, esta versión incluye soporte de modesetting y otras funciones avanzadas de display en el driver amdgpu; mejor gestión energética en sistemas con SATA Aggressive Link Power Management; un port para las CPUs RISC-V; soporte inicial para cifrado de memoria virtualizada en CPUs de AMD; soporte para la función de seguridad "User Mode Instruction Prevention" de Intel; soporte para el controlador de CPU en el sistema de control de recursos cgroupv2; una nueva bandera mmap(2) para permitir escritura directa a la memoria persistente que sea gestionada por sistemas de archivos; y muchos drivers nuevos y otras mejoras. La lista completa de cambios, en inglés, puede encontrarse aquí.



· Meltdown/Spectre 
Esta versión incorpora el último código para lidiar con Meltdown/Spectre. Para solucionar el problema Meltdown en CPUs Intel se incluye Page Table Isolation (puede ser desactivada con la opción del kernel pti=off). Para mitigar el problema Spectre v2, que afecta tanto a Intel como AMD, se requiere una versión de GCC que soporte la opción -mindirect-branch=thunk-extern, y puede desactivarse con la opción del kernel spectre_v2=off (si no tienes un compilador con esa funcionalidad, tendrás una mitigación mínima que sólo está en el código escrito en ensamblador, pero no en el código en C). La arquitectura PowerPC también está afectada por Meltdown en muchos modelos, y para prevenir ataques se incorpora la funcionalidad "RFI flush of L1-D cache". ARM también está afectada por Meltdown, pero las soluciones para ello se incluirán en la próxima versión. Tampoco se incluyen soluciones para Spectre v1.

Se ha añadido un directorio /sys/devices/system/cpu/vulnerabilities/ en el que se muestran las vulnerabilidades que afectan a la CPU y las mitigaciones que están siendo aplicadas.


· Modesetting y mucho mejor soporte de vídeo en el driver amdgpu


Esta versión incluye por fin el "display code" (132k LoC) que faltaban desde hace mucho tiempo en el driver amdgpu. Proporciona la funcionalidad "atomic modesetting" para hardware DCE8 (CIK), DCE10 (Tonga, Fiji), DCE11 (CZ, ST, Polaris), DCE12 (vega10), y DCN1 (RV); incluyendo HDMI y audio DP, DP MST, y muchas otras funciones avanzadas. Este soporte ha sido activado por defecto para Vega10 y Raven; el hardware anterior a vega10 aun no por dudas sobre la estabilidad, pero quien quiera probar puede activarlo manualmente con la opción del módulo amdgpu.dc=1


· Mejor gestión energética en sistemas con SATA Link Power Management


Durante muchos, muchos años, Linux ha tenido problemas con los sistemas que tienen controladores SATA AHCI con ALPM (Aggressive Link Power Management), es decir, equipos con Haswell, Broadwell o Skylake. Debido a la escasa documentación disponible, Linux no ha soportado correctamente este ALPM, y sin un soporte correcto de esa función, el sistema no puede entrar en los modos de ahorro de energía profundo, lo que se traduce en un acortamiento notorio de la vida de la batería. A mejorar esta situación no ha ayudado que una gestión incorrecta de ALPM se tradujese con frecuencia en pérdida de datos.

En esta versión, se ha incluído un parche que intenta implementar ALPM imitando el comportamiento por defecto de Windows, lo cual proporciona mejoras en el consumo de energía sin poner en riesgo los datos. En un portátil de prueba T440, el ahorro en estado de reposo es de entre 0.9 y 1.2W.


· Nueva arquitectura: RISC-V

Esta versión incorpora las principales partes del port a CPUs RISC-V. RISC-V es un con junto de instrucciones abierto que, a diferencia de las CPUs propietarias, puede usarse libremente para cualquier propósito, permitiendo a cualquier persona diseñar, manufacturar y vender chips y software RISC-V.

Este port está a medias. Aunque compila y arranca, los drivers aun no están disponibles en esta versión.


· Soporte para cifrado de memoria virtualizada en chips AMD


Linux 4.14 ya añadió soporte para AMD Secure Memory Encryption, una característica que permite que la memoria en RAM esté cifrada, y se descifre y cifre de nuevo automáticamente cuando la CPU lea o escriba a la memoria RAM, protegiendo de ese modo sus contenidos de ataques físicos al sistema.

Esta versión incorpora soporte inicial para Secure Encrypted Virtualization, que integra el cifrado de memoria en la arquitectura de virtualización AMD-V para así permitir máquinas virtuales cifradas; máquinas virtuales cuya memoria descifrada sólo puede ser accedida por la propia la máquina virtual, mientras que otras máquinas virtuales, o incluso el propio host, no pueden. Secure Encrypted Virtualization es especialmente útil en la nube, donde las máquinas virtuales no tienen por qué confiar en la empresa que la gestiona. Esta versión añade soporte para usar memoria cifrada en el huésped, los cambios necesarios para crear y gestionar huéspedes con memoria cifrada desde el anfitrión serán incluídos en las próximas versiones.


· Soporte para User-Mode Instruction Prevention

Esta versión incorpora soporte para una característica de CPUs intel llamada "User Mode Instruction Prevention". Cuando está activada, esta característica desactiva para el espacio de usuario ciertas instrucciones como SGDT, SLDT, SIDT, SMSW y STR, lo cual dificulta la creación de ciertos exploits. Por requerimientos de emuladores como WineHQ y DOSEMI2, las instrucciones SGDT, SIDT y SMSW serán emuladas en el modo protegido y virtual-8086 and protected modes (no habrá emulación para los procesos en modo "long").


· Mejor restricción del uso de CPU con el controlador de CPU para cgroupv2

La característica "control groups" con la jerarquía unificada, también llamado cgroup v2, fue implementada in 2.6.24 y declarada como estable en 4.5. Los controladores de recursos individuales tenían que ser portados a este nuevo diseño. La ausencia más llamativa era la del controlador de CPU, que proporciona a los cgroups la capacidad de limitar el uso de CPU para grupos de procesos. El problema es que para la inclusión del controlador de CPU se requería en primer lugar completar la funcionalidad de cgroupv2, específicamente el "thread mode", que fue incluido en 4.14, y que proporciona soporte para la gestión de recursos entre los hilos de un grupo. Tras todo ese trabajo llega a esta versión, por fin, el controlador de CPU para cgroupv2.


· Nueva bandera mmap(2) MAP_SYNC para permitir escritura directa a la memoria persistente que esté gestionada por sistemas de archivos.

Esta versión introduce las banderas MAP_SYNC y MAP_SHARED_VALIDATE a mmap(2). Para más detalles, ver este artículo de LWN: Two more approaches to persistent-memory writes.


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

2 de mayo de 2017

Las novedades de Linux 4.11

Ya se ha anunciado la versión 4.11 de Linux. Esta versión añade soporte para cambiar el planificador de E/S en vivo en la capa de bloques multiqueue, soporte de journalling en la implementación RAID5 MD que permite cerrar el "write hole", una implementación de swap más escalable para el swap ubicado in SSDs, una nueva llamada al sistema que resuelve deficiencias de la actual interfaz stat(), una nueva herramienta perf ftrace que actúa como un frontend para la interfaz ftrace, soporte para dispositivos de almacenamiento que siguen la especificación OPAL, soporte para el protocolo Shared Memory Communications-RDMA protocol definido en el RFC7609 y búfers persistentes para la consola VGA. 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. 



· Soporte para cambiar el planificador de E/S en vivo en la capa de bloques multiqueue

Es bien sabido que la capa de bloques de Linux tiene diferentes planificadores de E/S (deadline, cfq, noop, etc), con diferentes características cada uno, y los usuarios pueden cambiar entre uno y otro en vivo. En Linux 3.13, la capa de bloques añadió un nuevo diseño multicola, diseñada para el hardware moderno (SSD, NVMe). Sin embargo, este nuevo diseño multicola no incluía el soporte para planificadores de E/S. Esta versión resuelve ese problema con la inclusión de soporte de planificadores de E/S en el soporte multicola de la capa de bloques. También se ha incluído un port del planificador deadline (otros serán añadidos en el futuro). 


· Swapping escalable para SSDs

Los dispositivos de almacenamiento como SSDs hacen que el uso de swap más atractivo, no sólo como una manera de lidiar con el exceso de uso de memoria, sino también como una técnica de mejora de rendimiento. Por ejemplo, los proveedores de servicios de nubes pueden hacer overcommit de memoria más agresivamente y meter más VMs en una plataforma con el swap ubicado en un dispositivo de almacenamiento rápido. Sin embargo, la implementación de swap fue diseñada para los discos duros tradicionales, para los que el rendimiento y la latencia del swap no era tan importante. Esta versión mejora la implementación de swap para hacerla más escalable, y por lo tanto más adecuada para ser utilizada con dispositivos de almacenamiento modernos. 


· Journaling en RAID5 para cerrar el write hole

Basada en el trabajo que empezó en Linux 4.4, esta versión añade soporte de journaling para RAID4/5/6 en la capa MD (no confundir con el RAID de btrfs). Cuando se configura un dispositivo de journaling (típicamente NVRAM o SSD), el "write hole" de RAID5 desaparece - un crash durante el modo degradado no puede causar corrupción. 


· statx(2), una alternativa moderna para stat(2)

Debido a varias carencias en la llamada al sistema stat(2) (tal y como no estar preparada para el problema y2038 o no funcionar bien con los sistemas de archivo de red), se ha estado trabajando durante años en una nueva llamada al sistema, y el resultado final ha sido statx(2), una nueva llamada que ha sido añadida en esta versión. Para más información: statx() v3. 


· Nueva herramienta de perf, perf ftrace

Perf ha añadido una nueva herramienta: perf ftrace. Esta herramienta pretende ser un simple front-end para la interfaz ftrace. En esta versión, perf ftrace sólamente soporta dos trazadores, function_graph y function (por defecto function_graph; pueden configurarse otros con la opción de configuración ftrace.tracer). En esta versión solamente se soporta el trazado de un sólo proceso, y la herramienta sólo lee el archivo trace_pipe y lo escribe a stdout. En el futuro se añadirán otras características. 


· Soporte para dispositivos de almacenamiento OPAL

La Especificación de almacenamiento OPAL es un conjunto de especificaciones para dispositivos de almacenamiento que mejora su seguridad. Por ejemplo, define una manera de cifrar los datos para que personas no autorizadas no puedan acceder a los datos. Es decir, es una especificación para discos auto-cifrados. Esta versión añade soporte de OPAL con controladores NVMe.


· Soporte para el protocolo SMC-R (RFC7609)

Esta versión añade la implementación inicial del protocolo "Shared Memory Communications-RDMA" (SMC-R) tal y como está definido en el RFC7609. SMC-R es un protocolo de IBM que proporciona capacidades RDMA sobre RoCE de manera transparente para aplicaciones que usan sockets TCP. SMC-R no pretende reemplazar TCP, introduce una familia de protocolos PF_SMC. Las aplicaciones no requieren modificaciones más allá de especificar el uso de la nueva familia de sockets AF_SMC; las aplicaciones que no han sido modificadas incluso pueden ser utilizadas con ayuda de preloading de una librería.


· Búfers persistentes para las consolas VGA

No se trata de una característica importante, especialmente para los usuarios de tmux/screen, pero probablemente fastidioso para otros: esta versión añade soporte opcional para que el historial de scrollback de las consolas no se borre cuando se cambia de una a otra.

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

10 de marzo de 2017

Las novedades de Linux 4.9

(Nota: esta es una entrada atrasada sobre la versión de kernel anterior a la actual)

Ya se ha anunciado la versión 4.9 de Linux. Esta versión añade soporte para extents compartidos (soporte de cp --reflink) y soporte de copy-on-write para XFS; soporte para mapear la pila del kernel en memoria virtual; mejoras de BPF que ponen las capacidades de Linux a nivel de Dtrace; un nuevo algoritmo de congestión TCP llamado BBR; llamadas al sistema para usar la característica "protected keys" de Intel; soporte para el bus Greybus del Proyecto Ara; y un detector de latencias creadas por el firmware. 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.

· Extents de datos compartidos + soporte de copy-on-write en XFS

Esta versión incorpora varias características a XFS, basadas en el "mapeado inverso" introducido en la anterior versión. Se añade el soporte para que dos extents de datos sean compartidos entre dos archivos. Es decir, se añade soporte para cp --reflink=always. Como consecuencia, también se añade soporte para deduplicacion de datos, y la posibilidad de descompartir datos mediante la interfaz FALLOC_FL_UNSHARE de fallocate(2).

Esta versión también añade soporte de copy-on-write para datos: En lugar de sobreescribir los bloques existentes usados por un archivo, se copian los datos a un bloque nuevo y, una vez copiados los datos, se modifican los metadatos para que apunten a los nuevos bloques. 

Todas estas características suponen una gran cantidad de funcionalidad experimental que conllevan novedades en el formato de disco y en la infraestructura interna.

· Pilas mapeadas virtualmente

Linux siempre ha mapeado la memoria utilizada por la pila del kernel directamente, algo que hace que en algunas situaciones con poca memoria pueda ser difícil crear nuevas pilas, y además no tiene protección de ningún tipo si el kernel excede el tamaño de la pila. Esta versión permite que la pila del kernel sea mapeada en memoria virtual, lo cual permite asignar memoria para nuevas pilas incluso en situaciones con poca memoria, y además añade una página de memoria virtual falsa a continuación de las de la pila, para que sea posible detectar si el kernel intenta sobrepasar los límites de la pila.

· Análisis BPF más eficiente
Esta versión incluye la infraestructura necesaria para permitir que los programas BPF sean asociados a eventos perf de hardware y software, lo cual permite hacer análisis más complejos y eficientes que ponen las capacidades de análisis de Linux al nivel de DTrace, de acuerdo con Brendan Gregg (ver su blog para más información)

· Algoritmo BBR para el control de la congestión TCP
Esta versión incorpora otro algoritmo de control de congestión TCP: BBR (Bottleneck Bandwidth and RTT). Generalmente, los algoritmos de control de congestión utilizan heurísticas basadas en la detección de pérdidas de paquetes. De acuerdo con los autores de BBR, este sistema ya no es válido para las redes modernas. En el Internet de hoy, los algoritmos basados en la detección de pérdidas de paquetes contribuyen a magnificar los problemas causados por el famoso "bufferbloat", provocando un rendimiento deficiente debido a que la existencia de grandes búfers en la red provocan sobrerreaciones y alteraciones bruscas del tráfico. El algoritmo BBR, en cambio, intenta establecer el ancho de banda máximo, sin prestar atención a las pérdidas de paquetes. El algoritmo BBR ha aumentado el rendimiento y reducido la latencia en las redes internas de Google, la página google.com y los servidores de Youtube.

· Llamadas de sistema para la característica "protection keys"

"Protection keys" es el nombre de un sistema de protección de memoria por hardware que fue incluído en Linux 4.6. Pero en esa versión, el uso de esta característica estaba limitado a que el kernel lo utilizara automáticamente, sin petición explícita de los programas, en APIs de alto nivel como mmap(..., PROT_EXEC) y mprotect(ptr, sz, PROT_EXEC).

En esta versión se incorporan llamadas al sistema que ofrecen una API completa que permite utilizar las "protection keys". Para más detalles, ver este artículo o la documentación.

· Soporte del bus Greybus


Esta versión añade Greybus, un nuevo subsistema que da soporte al bus Greybus: un bus diseñado para el hardware modular, hot-pluggable, del difunto Proyecto Ara. A pesar de la muerte del proyecto, el código aun está siendo usado. Para más detalles, ver este artículo: Greybus

· Trazado de la latencia del hardware

El trazador de latencia del hardware es una herramienta diseñada para detectar grandes latencias provenientes de interrupciones causadas por el firmware (BIOS/EFI, SMI, etc), que el kernel desconoce por completo. El sistema funciona simplemente creando un proceso que ejecuta un bucle sin fin mientras mide el tiempo que transcurre, e intenta detectar lapsos de tiempo no esperados. Esta herramienta tiene como propósito comprobar si un sistema es adecuado para tareas de tiempo real


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

20 de febrero de 2017

Las novedades de Linux 4.10


Ya se ha anunciado la versión 4.10 de Linux. Esta versión añade soporte para GPUs virtualizadas, una nueva herramienta 'perf 2c2' para el análisis de contención de cachelines en sistemas NUMA, un nuevo comando 'perf sched timehist' para obtener un historial detallado de la asignación de tareas, una mejora en la gestión de escritura a disco que debería proporcionar mejor interactividad bajo escritura intensa, un nuevo método de polling híbrido para dispositivos de bloque que utiliza menos CPU que el polling puro, soporte para dispositivos ARM como el Nexus 5 y 6 o Allwinner A64, una característica que permite asignar programas eBPF a cgroups, un caché experimental de RAID5 en el subsistema MD y soporte para la tecnología de Intel Cache Allocation Technology. 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.



· Soporte para GPUs virtualizadas

Esta versión añade soporte para Intel GVT-g para KVM (KVMGT), una solución de virtualización de GPU, que está disponible a partir de la 4ª generación de procesadores Intel Core con Intel Graphics. Esta característica está basada en un nuevo framework de "Mediated devices" de VFIO. A diferencia de las soluciones de pass-through, los "dispositivos mediados" permiten que KVMGT ofrezca una GPU virtualizada que ofrece todas las características de una GPU real a todos y cada uno de los huéspedes virtualizados, al mismo tiempo que se mantiene un rendimiento casi similar al nativo. Para más detalles, ver estos papers:
A Full GPU Virtualization Solution with Mediated Pass-Through
KVMGT: a Full GPU Virtualization Solution
vGPU on KVM (video)
Intel GVT main site


· Nueva herramienta 'perf c2c' para el análisis de contención de cachelines

En los sistemas modernos con múltiples procesadores, los módulos de memoria están conectados físicamente a diferentes CPUs. En estos sistemas, llamados NUMA, los accesos de una CPU a la memoria del módulo que tiene conectado son más rápidos que los accesos a los módulos conectados a otros procesadores. Cuando un proceso tiene muchos hilos, cada hilo puede ejecutarse en diferentes CPUs al mismo tiempo; si esos hilos intentan acceder y modificar la misma memoria, pueden tener problemas de rendimiento debido a los costes en que se incurre para mantener los caches de las CPUs coordinados.

perf c2c (de "cache to cache") es una nueva herramienta diseñada para analizar y encontrar esta clase de problemas de rendimiento en sistemas NUMA. Para más detalles, ver https://joemario.github.io/blog/2016/09/01/c2c-blog/


· Historial detallado de los eventos de la planificación de procesos con 'perf sched timehist'

'perf sched timehist' proporciona un análisis de los eventos de la planificación de procesos. Ejemplo: $ perf sched record -- sleep 1; perf sched timehist.

            time    cpu  task name         wait time  sch delay  run time 
                         [tid/pid]            (msec)     (msec)    (msec)
        -------- ------  ----------------  ---------  ---------  --------
        1.874569 [0011]  gcc[31949]            0.014      0.000     1.148
        1.874591 [0010]  gcc[31951]            0.000      0.000     0.024
        1.874603 [0010]  migration/10[59]      3.350      0.004     0.011
        1.874604 [0011]                  1.148      0.000     0.035
        1.874723 [0005]                  0.016      0.000     1.383
        1.874746 [0005]  gcc[31949]            0.153      0.078     0.022


· Mejora de la gestión de escritura a disco

Desde el principio de los tiempos, el mecanismo encargado de escribir al disco los datos que los procesos han creado y que no han pedido escribir inmediatamente ("background writeback") ha tenido problemas. Cuando Linux escribe al disco todos esos datos en el transfondo, deberían tener poco impacto en los procesos que están ejecutándose. Pero desde hace muchísimo tiempo, no ocurre eso. Por ejemplo, si haces algo como $ dd if=/dev/zero of=foo bs=1M count=10k, o intentas escribir archivos a un dispositivo USB, e intentas arrancar una aplicación pesada, el inicio prácticamente se eternizará hasta que el proceso de escritura termine. Estos problemas ocurren porque las escrituras intensas llenan las colas de la capa de bloques, y otras peticiones de E/S tienen que esperar mucho para ser atendidas (para más detalles, este artículo de LWN).

Esta versión añade un mecanismo que intenta frenar las escrituras intensas e impide que se monopolicen las colas de la capa de bloques, lo cual debería proporcionar una mayor sensación de interactividad en el escritorio. Esta opción debe ser configurada y, como cualquier cambio de estas características, puede no ser perfecto en esta primera versión.


· Polling de bloques híbrido

Linux 4.4 añadió soporte para hacer polling en las peticiones a la capa de dispositivos de bloque. Se trata de un mecanismo a lo que NAPI hace en tarjetas de red, y puede mejorar el rendimiento para dispositivos de alto rendimiento (ej. NVM). Sin embargo, hacer polling constantemente puede consumir demasiada CPU, y en algunos casos incluso reducir el rendimiento. Esta versión de Linux incorpora un sistema híbrido: polling adaptativo. En lugar de hacer polling inmediatamente tras la petición de E/S, el kernel introduce un pequeño retraso. Por ejemplo, si el kernel espera que una petición de E/S vaya a ser atendida en 8 µsegundos, el kernel duerme durante 4 µsegundos, y luego empieza a hacer polling. Con este sistema híbrido, el kernel puede conseguir grandes reducciones de latencia como las del polling puro, pero sin tanto abuso de la CPU. Gracias a las mejoras en la obtención de estadísticas de la capa de bloques que han sido incluidas en esta versión, el kernel puede analizar el tiempo que tarda las peticiones de E/S en completarse y calcular automáticamente el tiempo que debería dormir

Este sistema híbrido está desactivado por defecto. Se ha añadido un nuevo archivo sysfs, /sys/block//queue/io_poll_delay, para configurarlo

· Mejor soporte de dispositivos ARM como el Nexus 5 y 6 o Allwinner A64

Como evidencia de los progresos que se están haciendo para acercar las diferencias entre los kernels Android y Linux, esta versión añade soporte para socs ARM como:
 - Huawei Nexus 6P (Angler)
 - LG Nexus 5x (Bullhead)
 - Nexbox A1 y A95X Android TV boxes
 - placa de desarrollo Pine64 basada en Allwinner A64
 - placa Globalscale Marvell ESPRESSOBin basada en Armada 3700
 - Renesas "R-Car Starter Kit Pro" (M3ULCB)

· Permitir asignar programas eBPF a cgroups

Esta versión añade la capacidad de asociar programas eBPF a cgroups, con el propósito de que esos programas eBPF se apliquen automáticamente a todos los sockets de las tareas ubicadas en el cgroup. Se ha añadido un nuevo tipo de programa eBPF, BPF_PROG_TYPE_CGROUP_SKB. La llamada al sistema bpf(2) ha sido extendida con dos nuevos comandos, BPF_PROG_ATTACH y BPF_PROG_DETACH, que permiten asociar y disociar programas a un cgroup. Esta característica es configurable (CONFIG_CGROUP_BPF). Artículo LWN recomendado: Network filtering for control groups

Esta versión también añade un nuevo tipo de programa eBPF, BPF_PROG_TYPE_CGROUP_SOCK. Al igual que los programas BPF_PROG_TYPE_CGROUP_SKB, pueden ser asignados a un cgroup, para permitir la modificación de un campo, sk_bound_dev_if.

· Cache de writeback RAID5 y soporte de "failfast"

Esta versión implementa un nuevo caché de writeback RAID5 en el subsistema MD (Multiple Devices). Su objetivo es agregar varias escrituras para poder hacer una escritura de "franja" completa, y de ese modo reducir el coste del proceso "read-modify-write" que daña el rendimiento de RAID5. Es beneficiosa para las cargas que hacen grandes escrituras secuenciales seguidas de fsync, por ejemplo. Esta característica está desactivada por defecto.

Esta versión añade también soporte para "failfast". Los discos RAID que tengan muchos fallos de E/S serán marcados rápidamente como rotos, de modo que no se recurrirá a ellos en el futuro, lo cual puede mejorar la latencia de las peticiones de E/S.

· Soporte para Intel Cache Allocation Technology

Esta es una característica de CPUs Intel que permite asignar políticas en los cachés L2/L3; ej. a una tarea de tiempo real se le podría asignar exclusivamente un espacio de caché. Para más detalles, ver este artículo de LWN: Controlling access to the memory cache.


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

3 de enero de 2017

Las novedades de Linux 4.8


(Post muy retrasado)
La versión 4.8 de Linux se anunció el  2 de Octubre de 2016. Esta versión añade soporte para el uso de páginas gigantes en el caché de páginas; soporte de eXpress Data Path, una opción para el tráfico de red programable y de alto rendimiento; soporte para mapeados inversos en XFS que son la fundación de varias mejoras que se añadirán en el futuro; verificación más estricta de las copias de memoria de espacio de usuario; soporte de etiquetado de seguridad en IPv6 (CALIPSO, RFC 5570); soporte para plugins de GCC; una nueva funcionalidad de virtio, vsocks, para facilitar la comunicación entre huéspedes y anfitriones; un nuevo algoritmo de congestión, TCP New Vegas; y la documentación ha sido convertida al formato reStructuredText. 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.


· Soporte para el uso de páginas gigantes transparentes en el caché de páginas
Las páginas gigantes permiten la utilización de páginas mayores de 4Kb (en x86); cuando el sistema utiliza estas páginas automáticamente las llamamos "transparentes". Hasta ahora, Linux no soportaba el uso de páginas gigantes en el caché de páginas (páginas utilizadas para almacenar un caché de los sistemas de archivos). En esta versión se añade soporte para el uso de páginas gigantes transparentes en el caché de páginas cuando se utilicen sistemas de archivo tmpfs/shmem (el soporte para otros sistemas de archivo se añadirá en el futuro).

Se puede controlar el uso de páginas gigantes en tmpfs utilizando la opción de montaje huge=, que puede recibir cuatro parámetros: always (se intentará utilizar páginas gigantes cada vez que se necesite una nueva página); never (no utilizar páginas gigantes - este es el valor por defecto); within_size (solo se utilizarán páginas gigantes si no sobrepasa el tamaño de archivo, también se respetan las pistas a fadvise()/madvise()); advise (sólo se utilizarán páginas gigantes si son solicitadas con fadvise()/madvise()).

También hay un archivo en sysfs para controlar la asignación de páginas gigantes en montajes internos shmem: /sys/kernel/mm/transparent_hugepage/shmem_enabled. Este valor es utilizado para SysV SHM, memfds, shared anonymous mmaps (de /dev/zero de MAP_ANONYMOUS), objetos DRM de controladores GPU, ashmem. Además de las políticas señaladas arriba, shmem_enabled permite dos valores adicionales: deny (para ser usado en emergencias, para forzar la opción de páginas gigantes de todos los montajes); force (forzar el uso de páginas gigantes para todos - útil principalmente para pruebas)


· Soporte de eXpress Data Path

XDP o eXpress Data Path proporciona una ruta para datos de red de alto rendimiento y programable. Proporciona procesamiento de paquetes con poca sobrecarga al nivel más bajo de la capa de software. La mayor parte de la gran mejora de velocidad viene del procesado de páginas-paquetes RX directamente fuera del anillo RX del driver, antes de que haya alguna asignación de estructuras de metadatos, como SKBs. Sus propiedades son: XDP está diseñado para alto rendimiento; XDP está diseñado para ser programable, se puede implementar nueva funcionalidad al vuelo sin requerir modificaciones en el kernel; XDP no intenta circunvalar el kernel, se integra en las rutas rápidas de la pila de red; XDP no reemplaza a la pila TCP/IP, la complementa y se coordina con ella; XDP no requiere hardware especializado. Para más información, ver https://www.iovisor.org/technology/xdp y Express_Data_Path.pdf


· Mapeado inverso en XFS

El mapeado inverso permite a XFS localizar al propietario de un bloque específico en el disco de manera precisa. Está implementado como una serie de btrees (uno por cada grupo de asignación) que llevan cuenta de los propietarios de los extents. Se trata, de hecho, de un "árbol de espacio utilizado" que se actualiza cuando el sistema de archivos asigna o libera extents y es por tanto coherente con los btrees de espacio libres.

Esta infraestructura de mapeo inverso es el bloque fundacional de varias características que se añadirán a XFS en el futuro - reflink, copy-on-write, deduplicación, scrubbing online de metadatos y datos, reporte detallado de errores a los usuarios, y reconstrucción de sistemas de archivos dañados y corruptos significativamente mejorada. Hay muchas cosas nuevas que se incorporarán en las próximas versiones, y todo se basa en esta infraestructura. Por esa razón, se trata de una gran cantidad de código nuevo con nuevas características de formato de disco e infraestructura interna. Se trata de una característica experimental y no se recomienda su uso por el momento.


· Verificación más estricta de las copias de memoria desde el espacio de usuario

Esta es una característica de seguridad portada de Grsecurity. Cuando el kernel copie memoria desde o hacia el kernel (mediante las funciones copy_to_user() y copy_from_user()), se harán comprobaciones extra para asegurarse de que los rangos de memoria afectados no son sospechosos. Esto imposibilita toda una serie de exploits de heap overflow y exposiciones de memoria del kernel. El impacto en el rendimiento es apenas notable.


· Soporte para plugins de GCC

Al igual que el anterior, esta característica ha sido portada de Grsecurity. Permite el uso de plugins de GCC, que son pequeños módulos de compilador cargables que permiten analizar, cambiar y añadir código durante la compilación y pueden utilizarse para la instrumentación en tiempo de ejecución y análisis estático de código. Grsecurity utilizar estos mecanismos para mejorar la seguridad. Esta versión incluye dos plugins: sancov, un plugin que se utiliza como ayuda para kcov; y el plugin cyclomatic para el análisis de la complejidad ciclomática de una función


· virtio-vsocks para facilitar la comunicación entre huésped y anfitrión

Esta version añade virtio-vsock, que proporciona sockets AF_VSOCK que permiten la comunicación entre aplicaciones del huésped y el anfitrión. A diferencia de virtio-serial, virtio-vsock soporta la API de sockets POSIX, de modo que las aplicaciones de red existentes necesitan pocas modificaciones. La API permite conexiones N:1, de modo que múltiples clientes pueden conectarse a un mismo servidor simultáneamente. El dispositivo tiene una dirección asignada automáticamente, de modo que no es necesaria configuración alguna dentro del huésped.



· Soporte de etiquetado de seguridad IPv6 (CALIPSO, RFC 5570)

Esta versión implementa el RFC 5570 - Common Architecture Label IPv6 Security Option (CALIPSO). Está diseñado para ser usado en entornos de red MLS confiables. CALIPSO es muy similar a su primo de IPv4 CIPSO, y esta característica está basada en gran medida en ese código.



· Nuevo algoritmo de control de congestión TCP New Vegas

Esta versión añade un nuevo algoritmo de control de congestión, TCP New Vegas, que es una actualización importante de TCP Vegas. Al igual que Vegas, New Vegas es un sistema para evitar la congestión basado en el retraso. Su mecanismo de filtrado es similar: utiliza las mejores mediciones en un periodo concreto para detectar y medir la congestión. Está desarrollado para coexistir con redes modernas donde los anchos de banda son de 10 Gbps o mayores, donde los RTTs son de décimas de microsegundos, etc.Puede encontrarse una descripción aquí: http://www.brakmo.org/networking/tcp-nv/


· Documentación convertida al formato reStructuredText 

En un intento de modernizar la documentación del kernel, va a ser convertida al sistema Sphinx, que utiliza el formato reStructuredText.






Estas son las novedades principales de este kernel. Como siempre, pueden encontrar la lista completa, y en inglés, en esta página.

25 de julio de 2016

Las novedades de Linux 4.7

Ya se ha anunciado la versión 4.7 de Linux. Esta versión añade soporte para las recientemente puestas en venta GPUs Radeon RX 480 'Polaris', soporte para búsquedas de rutas de archivo paralelas en el mismo directorio, un nuevo gobernador de frecuencia experimental "schedutils" que debería ser más rápido y veloz que otros gobernadores, soporte para el mecanismo EFI "Capsule" que facilita las actualizaciones de firmware, soporte de controladores virtuales USB en la funcionalidad USB/IP para que los emuladores de teléfonos puedan funcionar como dispositivos USB reales, un módulo de seguridad llamado "LoadPin" que asegura que los módulos del kernel sólo se puedan cargar desde un sistema de archivos determinado, soporte para construir histogramas de eventos en la interfaz de trazado ftrace, soporte para asociar programas BPF a tracepoints del kernel, soporte para callchains en la utilidad perf trace, y soporte estable para la funcionalidad sync_file de Android. 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.



· Soporte para GPUs Radeon RX 480 'Polaris'

Como resultado de la nueva política de drivers libres de AMD, esta versión incluye soporte en el driver amdgpu para las recientísimamente puestas en venta GPUs Polaris, la nueva generación de  GPUs Radeon RX 480. El soporte está al mismo nivel que el resto de dispositivos del driver.



· Búsquedas de ruta de archivo paralelas en el mismo directorio

El caché de directorio (conocido como "dcache") es una de las partes más críticas del kernel, se trata de un caché de las rutas de los sistema de archivos, lo cual permite agilizar enormemente ciertas operaciones; por ejemplo, permite determinar si cierto archivo o directorio existe o no sin tener que leer datos del disco. Este cache usa un mutex para serializar las búsquedas de rutas en el mismo directorio.

Esta versión permite hacer búsquedas de rutas en el mismo directorio; el mutex serializador ha sido sustituido por un semáforo de lectura-escritura. Esta mejora no se notará en la vastísima mayoría de casos, porque las búsquedas en el caché de directorios son muy rápidas y es muy raro que se convierta en un punto de contención. Pero para algunas cargas específicas que utilizan la búsqueda de rutas muy intensivamente, verán una mejora del rendimiento porque a partir de ahora podrán hacerse en paralelo. La mayor parte  de los sistemas de archivos han sido convertidos para utilizar esta característica.


· Nuevo gobernador de frecuencia experimental 'schedutils'

Esta versión incorpora un nuevo gobernador para el subsistema de escalado de frecuencias (cpufreq). Hay dos grandes diferencias entre este nuevo gobernador y los existentes. Primero, schedutils utiliza información proporcionada directamente por el planificador de procesos. Segundo, puede invocar los drivers cpufreq y cambiar la frecuencia más rápidamente.

Lo que esto significa es que el tiempo que tarda el gobernador en hacer cambios de frecuencia y la calidad de las decisiones tomadas mejora respecto a anteriores gobernadores. Nótese que este nuevo gobernador es muy simple, y está considerado como una base sobre la que fundar futuros cambios que mejoren la integración entre el planificador de procesos y la gestión de energía. Sin embargo, funciona y los resultados preliminares son prometedores. Este gobernador comparte algunos valores tuneables con los otros gobernadores.


· Soporte para construir histogramas de eventos en la interfaz de trazado ftrace

Los "Hist triggers" son una funcionalidad que se incorpora a ftrace, la infraestructura de trazado de Linux disponible desde 2.6.27 que está embebida en el kernel y disponible en /sys/kernel/debug/tracing. Esta versión añade el comando "hist" a ftrace, que permite construir "histogramas" de eventos, agregando el número de eventos en una tabla hash. Como ejemplo, vamos a suponer que un usuario quiere conseguir una lista de bytes leídos por cada proceso en el sistema. Se puede hacer con el comando "hist" de la siguiente manera:

# echo 'hist:key=common_pid.execname:val=count:sort=count.descending' > /sys/kernel/debug/tracing/events/syscalls/sys_enter_read/trigger

Lo que hace este extraño comando es escribir un comando al archivo trigger del evento sys_enter_read (el evento que corresponde a entrar en la llamada al sistema read(), es decir, intentar leer un archivo). Cuando se produzca el evento, se ejecutará un comando hist (hist:) que significa lo siguiente: cada vez que se dispare el evento, leer el PID (common_pid - puedes ver todos los campos posibles del evento en el archivo /sys/kernel/debug/tracing/events/syscalls/sys_enter_read/format) y convertirlo a nombre de proceso (sufijo .execname); esto será usado como clave (key=) en el histograma. El parámetro val=count hace que se lea también el campo count, que en el evento sys_enter_read se refiere al número de bytes leídos. Finalmente, tras el separador :, el parámetro sort=count.descending hace que el comando ordene el resultado por el campo count en orden descendiente. La salida resultante es esta:


Esta salida muestra qué procesos han leído archivos, cuantos bytes (count), y con cuanta frecuencia (hitcount, que no fue especificado en el comando pero se incluye por defecto).

Como se puede observar, esta pequeña herramienta permite hacer análisis muy útiles del sistema, y si bien ftrace no puede competir (ni lo pretende) con herramientas de trazado más potentes como LTTng, perf o SystemTap, puede ser una herramienta muy conveniente. Para más información, puedes ver la documentación sobre hist triggers, or leer este post recomendado de Brendan Egg: Hist Triggers in Linux 4.7. Para más documentation sobre ftrace, ver Documentation/trace/ftrace.txt


· Soporte para callchains en la utilidad perf trace

En esta versión, perf trace añade la habilidad de mostrar callchains cada vez que el proceso a trazar encuentra una llamada al sistema. Puedes probarlo con comandos como # perf trace --call dwarf ping 127.0.0.1. Puedes mostrar callchains para los eventos deseados: # perf trace --event sched:sched_switch/call-graph=fp/ -a sleep 1. El trazado de fallos de página (options -F/--pf) también lo soportan, por ejemplo, para trazar las llamadas a write() y los fallos de página con callchains mientras se inicia firefox, puede hacerse con # perf trace -e write --pf maj --max-stack 5 firefox. Una análisis de perf trace con callchains de todos los procesos de un sistema completo puede encontrarse aquí.


· Permitir que los programas BPF usen tracepoints

Los tracepoints son una suerte de printf()s dinámicos que los desarrolladores introducen en su código para que puedan ser utilizados más tarde para analizar el comportamiento del sistema. Los Tracepoints pueden ser utilizados por muchas utilidades: LTTng, perf, SystemTap, ftrace...pero no podían ser utilizados por programas BPF

Esta versión añade un nuevo tipo de programa BPF (BPF_PROG_TYPE_TRACEPOINT) que puede usarse para construir programas BPF que puedan recoger datos de los tracepoints y procesarlos dentro del programa BPF. Esta alternativa puede ser más rápida que acceder a los tracepoints mediante kprobes, puede hacer las interfaces de los programas de trazado más estable, y permite la construcción de herramientas de trazado más complejas.


· Soporte para el mecanismo 'Capsule' de EFI

Esta versión añade soporte para el mecanismo 'Capsule' de EFI, que permite pasar a EFI archivos de datos. EFI los valida y toma decisiones de acuerdo con sus contenidos. El uso más común para este mecanismo es incluir actualizaciones de firmware en una Capsule para que EFI haga la actualización en el próximo reinicio. Los usuarios pueden subir datos a Capsule escribiendo el firmware en el dispositivo /dev/efi_capsule_loader device.


· Soporte para controladores de USB virtuales en USB/IP

USB/IP permite compartir dispositivos USB sobre la red. Los dispositivos a compartir necesitan, sin emabrgo, ser reales. Esta versión soporte la capacidad de crear dispositivos USB virtuales sin necesidad de tener un dispositivo USB físico, tal sólo utilizando el subsistema de USB gadgets.

Esta característica tiene varios usos; el más obvio (el que ha motivado su desarrollo) es la mejora de la emulación de teléfonos en los entornos de desarrollo. Los teléfonos emulados pueden ahora conectarse a la máquina del desarrollador, o a una virtual, mediante USB/IP, y así utilizarlos como si fuera un teléfono físico. También es útil, por razones obvias, para pruebas y experimentos.


· El mecanismo de fencing de Android, sync_file, se considera estable

En esta versión, el código sync_file que estaba en el directorio de pruebas staging/, ha sido movido al kernel principal. Sync_file es una API desarrollada para Android para cubrir las deficiencias del mecanismo de fencing de Linux; para los interesados se pueden encontrar más detalles en la documentación oficial, Documentation/sync_file.txt.


· LoadPin, un módulo de seguridad para restringir el origen de los módulos del kernel 

LoadPin es un módulo de seguridad que se asegura de que todos los archivos cargados por el kernel (módulos del kernel, firmware, imágenes kexec, políticas de seguridad, etc) tengan origen en un mismo sistema de archivos. Las expectativas son que ese sistema de archivos sea de sólo lectura, como por ejemplo un DVD o dm-verity (esta característica viene de ChromeOS, donde el sistema principal está verificado criptográficamente con dm-verity). Los sistemas con este tipo de sistemas de archivos podrán con este sistema forzar las restricciones citadas sin tener que recurrir a firmar criptográficamente los módulos (algo que Linux también soporta), lo cual es obviamente beneficioso para la seguridad


Estas son las novedades principales de este kernel. Como siempre, pueden encontrar la lista completa, y en inglés, en esta página.

14 de junio de 2016

Apple ya tiene su ZFS: APFS

ZFS fue una revolución en el mundo de los sistemas operativos de propósito general, hasta el punto que se puede afirmar tajantemente que el sistema operativo que no tenga un sistema de archivos inspirado en él, está obsoleto. En Apple no son tontos y en seguida se interesaron al menos en facilitar el uso de ZFS, pero acabaron abandonando la idea por problemas de licencia. Aun así, surgieron rumores de que Apple estaba desarrollando un sustituto de HFS+, sin que llegaran nunca a nada.

Hoy, en su conferencia para desarrolladores, Apple ha anunciado su nuevo sistema de archivos APFS. No se han dado muchos detalles, pero no se diferencia en nada de lo que se podría esperar de un clon de ZFS. Habrá que esperar hasta el año que viene para que den más detalles y publiquen el código fuente: APFS está tan verde, que ni tan siquiera garantizan la estabilidad del formato de disco.

Sorprende que Apple, con sus inacabables recursos monetarios, se haya tomado tanto tiempo en crear un clon de ZFS: todos sus sistemas usan aun HFS+ (prueba de que, como se ha sugerido en el pasado en este blog, una implementación rápida y estable de un sistema de archivos es mucho más importante en la práctica que las campanitas y luces de colores de un formato de disco nuevo). Un servidor esperaba a APFS años mucho antes; hace cuatro años predecía, erróneamente, que veríamos un ZFS de Apple antes de ver ReFS -el ZFS de Microsoft, recuerden- en los Windows de escritorio.

Pero sobre todo, lo que esperaba de Apple es que se atreviese a ir más allá de los sistemas de archivo jerárquicos. Tras haber contratado al desarrollador del sistema de archivos de BeOS, uno se esperaba que se atreverían a copiar su implementación de atributos extendidos, pero no parece haber ninguna innovación en ese frente. No pierdo la esperanza de que lo tengan reservado para el futuro.

2 de junio de 2016

Las novedades de Linux 4.3

(Tras un larguísimo retraso, esta es la lista de cambios de Linux 4.3)

Ya se ha anunciado la versión 4.6 de Linux. Esta versión elimina el sistema de archivos Ext3 (a partir de ahora los sistemas de archivo Ext3 se tendrán que montar con Ext4, que siempre los ha soportado). También añade la llamada al sistema userfaultfd() para gestionar fallos de páginas desde espacio de usuario; la llamada al sistema membarrier() para enviar barreras de memoria a un conjunto de hilos; un controlador de PIDs para limitar el número de PIDs que puede haber en un cgroup; "ambient" capabilities para hacer el sistema de capabilities menos difícil de usar; un sistema para conseguir mejores estadísticas sobre la memoria que está siendo utilizada por un proceso; soporte para Identifier Locator Addressing de IPv6, que permite implementar túneles o virtualización de redes sin encapsulación; soporte para Virtual Routing and Forwarding Lite, túneles de red ligeros, y muchas otras mejoras y nuevos controladores. La lista completa de cambios, en inglés, puede encontrarse aquí, como siempre.


· Eliminación del sistema de archivos Ext3
Se ha eliminado el sistema de archivos Ext3. La motivación es que los sistemas de archivo Ext3 siempre han estado soportados por Ext4, que de hecho Ext4 se creó pensando en sustituir Ext3, y que las principales distribuciones llevan ya mucho tiempo utilizando Ext4 para montar sistemas de archivos Ext3. Ahora que Ext4 es bastante estable, los mantenedores creen adecuado librarse de él.

· userfaultfd(), una llamada al sistema para gestionar fallos de página en espacio de usuario

Un fallo de página es algo que ocurre cuando un proceso que tiene alguna cosa mapeada en su espacio de direcciones, por ejemplo, un archivo, pero ese archivo no está en la memoria RAM: al tratar de acceder al archivo, se produce un fallo de pagina. El kernel es quien, normalmente, se ocupa de gestionar ese fallo de página: carga la porción del archivo en memoria.


En esta versión, Linux añade soporte para gestionar fallos de página en espacio de usuario a través de una nueva llamada al sistema: userfaultfd(). La ventaja de esta llamada al sistema comparada con las operaciones de gestión de memoria habituales como mremap()/mprotect() es que es mucho más ligera.

El principal usuario de esta llamada al sistema es QEMU, que puede usar esta llamada al sistema para implementar migración en vivo post-copia: se migran las VMs de un host a otro sin migrar su memoria, lo cual hace que la migración sea mucho más rápida, y una vez migrada la VM, QEMU utiliza userfaultfd() para ir transfiriendo la memoria al nuevo host a medida que ocurren fallos de página.

· membarrier(), una llamada al sistema para enviar barreras de memoria a un conjunto de hilos 

Esta versión añade una nueva llamada al sistema, membarrier(2), que ayuda a distribuir los costes de las barreras de memoria en espacio de usuario utilizadas para ordenar los accesos a memoria en sistemas multicore, y lo logra transformando parejas de barreras de memoria en parejas consistentes en membarrier(2) y una barrera de compilador. Para las primitivas de sincronización que distinguen entre el lado de lectura y el de escritura (por ejemplo, RCU, read-write locks), el lado de la lectura puede acelerarse significativamente con esta llamada al sistema, ya que se mueve la sobrecarga de la barrera de memoria al lado de la escritura. La idea fundamental es hacer que las CPUs ejecuten las barreras solamente cuando se requiere sincronización por parte del hilo que modifica datos, a diferencia de ejecutar las barreras antes y después toda vez que se acceden los datos desde un hilo de lectura.

· Nuevo controlador de PIDs para limitar el número de PIDs en los cgroups.

Esta versión añade un controlador de PIDs que permite limitar el número de procesos que pueden crearse dentro de un cgroup. Los PIDs son un recurso fundamentalmente global, porque es bastante fácil acabar con todos los PIDs posibles antes de alcanzar otros límites de recursos. Como resultado, es posible paralizar el sistema. El controlador de PIDs está diseñado para prevenir estos abusos.


Esencialmente, se trata de una implementación del límite RLIMIT_NPROC, sólo que se aplica a un cgroup en lugar de a un árbol de procesos. Sin embargo, hay que notar que las operaciones de añadir PIDs a un cgroup manualmente no están afectadas por el límite, sólo están limitados los procesos creados a través de fork().

Para usar este controlador de PIDs, hay que configurar el número máximo de tareas en pid.max. El número de procesos disponibles en el cgroup es proporcionado por pids.current. Para que el cgroup no tenga límite de procesos, se puede configurar pid.max a "max".

· Ambient capabilities

En Linux, hay un número de capabilities ("capacidades") definidas por el kernel. Para ejecutar varias operaciones privilegiadas, los procesos pueden ejercer las capacidades que tengan asignadas. Cada proceso tiene cuatro máscaras de capacidades: "effective", "permitted", "inheritable", y "bounding set". Cuando el kernel comprueba la validez de las capacidades comprueba la máscara "effective", el resto de máscaras sirven para modificar las capacidades que pueden estar en "effective"

Debido a los defectos de diseño de las capacidades de Linux (artículo de LWN recomendado al respecto: Inheriting capabilities), la herencia de capacidades no es muy útil. Para resolver los problemas, esta versión añade una quinta máscara llamada máscara "ambient". Esta máscara hace lo que la mayor parte de la gente esperaría que hiciera la máscara "inheritable". No se puede cambiar ningún bit de capacidades en "ambient" si no está previamente en "inheritable" y "permitted". Eliminar un bit de "permitted" o "inheritable" elimina ese bit de "ambient". Esto asegura que los programas que quieran intentar desprenderse de capacidades pueden hacerlo, sin complicaciones. Como la herencia de capacidades en Linux actualmente es tan chapucera, configurar prctl(PR_SET_KEEPCAPS,...), usar setresuid() para cambiarse a una uid no-root, y después llamar a execve(), tiene como efecto que se desactivan las capabilities. Por lo tanto, setresuid() de root a no-root limpia la máscara "ambient" al menos que no esté activada SECBIT_NO_SETUID_FIXUP.

Si eres no-root pero tienes una capacidad, puedes añadirla a "ambient". Si lo haces, tus hijos también tendrán esa capacidad en "ambient", "permitted" y "effective". Por ejemplo, puedes configurar CAP_NET_BIND_SERVICE en "ambient", y tus hijos podrán, automáticamente, hacer bind() a puertos con números bajos. Los usuarios sin privilegios pueden crear espacios de nombres de usuario, mapearse ellos mismos a una uid no-cero, y crear árboles de procesos privilegiados y no privilegiados (relativos a su espacio de nombres).


· page tracking, una manera más precisa de medir la memoria utilizada por las aplicaciones
Saber qué páginas de memoria están siendo accedidas por una carga determinada y cuáles es útil para saber el tamaño de trabajo de la carga, lo cual es útil para configurar la aplicación, decidir en qué nodo debe ejecutarse, o configurar límites de memoria. Actualmente, la única manera de estimar la cantidad de memoria que no está siendo usada es /proc/PID/clear_refs y /proc/PID/smaps: el usuario puede eliminar el bit de acceso de todas las páginas de un determinado proceso escribiendo "1" al archivo clear_refs, esperar un tiempo, y contar la memoria que está siendo utilizada en la sección "Referenced" del archivo smaps. Sin embargo, este método tiene dos inconvenientes serios: 1) no puede contar las memoria de archivo que no está mapeada (ej, los archivos no mapeados, accedidos mediante read()/write()) 2) limpiar el bit de acceso de las páginas distorsiona la gestión de memoria.

Para resolver esos problemas, esta versión introduce una nueva manera de analizar el uso de memoria. Para estimar la cantidad de páginas que no están siendo usadas por una aplicación, se deben seguir los siguientes procesos:
  · Marcar todas las páginas de la tarea en cuestión, configurando los bits correspondientes en /mm/page_idle/bitmap (este archivo implementa un bitmap donde cada bit representa una página de memoria). Las páginas a ser marcadas pueden encontrase en /proc/PID/pagemap, si se trata de un proceso, o /proc/kpagecgroup (un nuevo archivo) si se trata de una carga ubicada en un cgroup.
  · Esperar a que la carga en cuestión haga su trabajo
  · Leer /sys/kernel/mm/page_idle/bitmap y contar el número de bits que han cambiado

· Soporte para IPv6 Identifier Locator Addressing

Esta versión añade soporte para Identifier Locator Addressing, un mecanismo diseñado para permitir la implementación de túneles o virtualización de redes sin encapsulación. El concepto básico de ILA es que una dirección IPv6 es dividida en dos partes de 64 bits: localizador e identificador. El identificador es la identidad de la entidad que se comunica ("quien"); el localizador expresa la localización de la entidad ("dónde"). Las aplicaciones usan direcciones visibles externamente que contienen el identificador. Cuando se envía un paquete, se hace una traducción que sobreescribe los primeros 64 bits de la dirección con el localizador. El paquete puede entonces ser redirigido por la red al host donde esté ubicada la entidad. El receptor hace la traducción inversa de manera que la aplicación vea la dirección original, sin traducir.

Esta característica se configura con el comando "ip -6 route", usando la opción "encap ila ", donde es el valor a configurar en el localizador de destino del paquete, ej. ip -6 route add 3333:0:0:1:5555:0:1:0/128 encap ila 2001:0:0:1 via 2401:db00:20:911a:face:0:25:0 configurará una ruta donde 333:0:0:1 será sobreescrito por 2001:0:0:1

· Túneles de red ligeros

Esta versión proporciona infraestructura para soportar túneles ligeros tales como túneles ip sobre MPLS. Permite una encapsulación escalable sin la sobrecarga de un netdevice completo. Para más información, leer este artículo de LWN Identifier locator addressing, o estas diapositivas netconf2015Herbert-ILA.pdf

iproute2 ha sido extendido con dos nuevos casos: VXLAN: ip route add 40.1.1.1/32 encap vxlan id 10 dst 50.1.1.2 dev vxlan0; MPLS: ip route add 10.1.1.0/30 encap mpls 200 via inet 10.1.1.1 dev swp1

·  Soporte de Virtual Routing and Forwarding (Lite)

 
Esta versión añade soporte de Virtual Routing and Forwarding (VRF), que, combinado con reglas ip, proporciona la abilidad de crear enrutados virtuales y dominios de reenvío (VRFs, o más bien VRF-lite para ser más específico). Para más información, leer la documentación en Documentation/networking/vrf.txt 


Estas son las novedades principales de este kernel. Como siempre, pueden encontrar la lista completa, y en inglés, en esta página.