19 de enero de 2016

Las novedades de Linux 4.4

Ya se ha anunciado la versión 4.4 de Linux. Esta versión añade soporte 3D para el driver de la GPU virtual, que permite usar la aceleración 3D de hardware en sistemas virtualizados; se añade también soporte de E/S directo y asíncrono en el dispositivo loop, lo cual ahorra memoria y mejora el rendimiento; se añade soporte para discos SSDs Open-Channel, que son SSDs que intentan compartir con el sistema operativo la responsabilidad de la FTL; la gestión de los "TCP listener" se hace ahora sin ningún tipo de bloqueo y permite que los servidores TCP sean más rápidos y mucho más escalables; journaling de RAID5 en la capa MD que permite solucionar el llamado "write hole"; los programas eBFP pueden ahora ser ejecutados por usuarios sin privilegios, pueden hacerse permanentes tras el fin de un proceso, y la utilidad perf ha añadido soporte para eBFP también; una nueva llamada de sistema mlock2() que permite bloquear la memoria añadida desde los fallos de página; y soporte de polling en dispositivos de bloques que mejora el rendimiento en los dispositivos de muy alto rendimiento. 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.


· Dispositivo loop más rápido y ligero con E/S Directa y Asíncrona

  Esta versión incorpora soporte de E/S directa y asíncrona en el dispositivo de bloques loop. Esto tiene varias ventajas: se mejora el consumo de memoria porque se evita mantener un cache duplicado; y se mejora el rendimiento al evitarse cambios de contexto

· Soporte en el driver de GPU virtual

  virtio-gpu es un driver para huéspedes de virtualización que permite utilizar las capacidades gráficas del anfitrión eficientemente. En esta versión, se permite que el huésped utilice las capacidades de la GPU del anfitrión para acelerar los gráficos 3D. En la práctica, esto significa que un huésped virtualizado Linux puede ejecutar juegos OpenGL utilizando la GPU, como se muestra aquí o aquí. Se requiere el uso de QEMU 2.5 o superior.

· LightNVM añade soporte para SSDs Open-Channel

  Los SSDs Open-Channel son dispositivos que comparten con el sistema operativo la responsabilidad de implementar y mantener las características que los SSDs implementan típicamente en el firmware, tales como la Flash Translation Layer (FTL), la gestión de bloques dañados, y unidades del hardware como el controlador flash, el controlador de la interfaz, y muchos chips flash. De este modo, los SSDs Open-Channel exponen un acceso directo al almacenamiento físico flash.

LightNVM es una especificación que da soporte a SSDs Open-Channel. LightNVM permite al sistema gestionar la ubicación de los datos, la recolección de memoria y el paralelismo, mientras que otras características permanecen en control del hardware. Esta versión de Linux añade soporte para lightnvm y para NVMe.

· Gestión de TCP listeners sin bloqueos

  En esta versión, y como resultado de un esfuerzo que empezó hace dos años, la implementación TCP ha sido reescrita para que no haya ningún bloqueo en las rutas más comunes del código que gestiona a los programas que hacen escuchas TCP. En pruebas, un servidor fue capaz de procesar 3.500.000 de paquetes SYN por segundo en un sólo listener y sin llegar a ocupar todo el tiempo de CPU, esto representa entre 2 y 3 órdenes de magnitud de lo que era posible previamente. SO_REUSEPORT también ha sido extendido para añadir afinidades de CPU/NUMA.

· Soporte de journalled RAID5 en MD

  Esta versión añade soporte de RAID 5 journalled en la capa MD (RAID/LVM). Con un dispositivo de journal configurado (típicamente NVRAM o SSD), los datos y la paridad de un array RAID se escriben primero al journal, y luego al array. Si el sistema se bloquea, se pueden recuperar datos del log. Esto puede acelerar la resincronización RAID y resuelve el problema del "write hole" de RAID5 - un cuelgue durante el modo degradado no resultará en corrupción de datos. En futuras versión el journal será utilizado también para mejorar el rendimiento y la latencia.

· Programas eBPF sin privilegios + programas eBPF persistentes

  Programas eBPF sin privilegios
  Los programas eBPF consiguieron su propia llamada al sistema en Linux 3.18, pero hasta ahora su uso había estado restringido a root, porque estos programas son peligrosos para la seguridad. Sin embargo, los programas eBPF son validados por el kernel, y en esta versión el verificador de programas eBPF ha sido mejorado y como resultado los usuarios sin privilegios pueden hacer uso de ellos (aunque sólo podrán construir programas tipo filtro de sockets, los programas que usen funciones de trazado o del control de tráfico de red requerirán root). esta característica puede ser desactivada con la sysctl kernel.unprivileged_bpf_disabled (una vez desactivada sólo root podrá usar programas eBPF, y la sysctl no podrá volver a cambiarse)

  Programas eBPF persistentes
  Esta versión añade soporte para mapas/programas eBPF "persistentes". El término "persistente" ha de entenderse como un mecanismo que permite que sobrevivan al fin del proceso que los crea. Hay usuarios eBPF que desean este tipo de comportamientos, por ejemplo el clasificador de tráfico tc(8). Cuando tc hace uso de un objecto eBPF, nuevas invocaciones de tc no podrán reutilizarlo.

  Para solucionar ese problema, se ha añadido un sistema de archivos virtual que puede almacenar programas y mapas eBPF en /sys/fs/bpf/. Los objetos eBPF son creados mediante la llamada al sistema bpf() junto con una ruta y dos nuevos comandos (BPF_OBJ_PIN/BPF_OBJ_GET) que crean los archivos correspondientes en el sistema de archivos. Estos archivos pueden ser reutilizados posteriormente por otros procesos, a través también de bpf(2).

· Integración de perf y eBPF

  En esta versión, los programas eBPF han sido integrados en perf. Cuando se pasa a perf un archivo .c eBPF (o uno .o compilado con el target "bpf" de clang) será compilado automáticamente, validado y cargado en el kernel, pudiendo ser utilizado posterioemente por perf trace y otras herramientas.

  Los usuarios pueden hacer uso de un filtro eBPF con comandos como: # perf record --event ./hello_world.o ls; y el programa eBPF será conectado a un evento perf que puede ser utilizado por el resto de herramientas.

· Soporte de polling para dispositivos de bloque

  Esta versión añade soporte básico para hacer polling para que una petición de E/S concreta se complete, lo cual puede mejorar la latencia y el rendimiento en dispositivos muy rápidos. De momento, se soportan escrituras y lecturas síncronas con O_DIRECT. Este soporte es preliminar y sólo debe ser utilizado para pruebas, en próximas versiones se utilizarán estadísticas para hacer uso de este modo automáticamente. De momento, se añade un archivo en sysfs (io_poll) que controla si el polling está activado o no.

· Llamada al sistema mlock2() que permite a los usuarios bloquear memoria en fallos de página

  mlock() permite a un usuario bloquear la memoria de un programa en la RAM, pero esto tiene como coste la necesidad de incluir en la RAM toda la memoria de una vez. Este comportamiento no es muy adecuado cuando se necesita usar mlock() con mapeados de archivos muy grandes: Por ejemplo, las aplicaciones sensibles con la seguridad que usan mlock() pueden verse forzadas a bloquear un búfer demasiado grande. O quizás un modelo gráfico gigantesco donde la ruta de un grafo no es conocida hasta el tiempo de ejecución, en lugar de bloquear en memoria sólo las partes utilizadas están forzadas a bloquear todo el grafo o ir bloqueando página tras página a medida que van siendo utilizadas.

Esta nueva llamada al sistema, mlock2(), trata de conseguir una solución intermedia. Las páginas de la memoria no son bloqueadas en memoria inmediatamente, sino que se van bloqueando aquellas que van siendo mapeadas en memoria.

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