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.