22 de julio de 2011

Las novedades de Linux 3.0

Ya se ha anunciado (por diferentes canales)la versión 3.0 del kernel Linux. Aparte de un nuevo sistema de numerar versiones, este kernel tiene unas cuantas novedades: defragmentación automática y 'scrubbing' de datos en Btrfs, envío de mensajes ICMP_ECHO sin privilegios, wake on WLAN, filtrado de paquetes BFP acelerado mediante JIT, soporte de XEN dom0, un sistema a lo memcached para el caché tde páginas, la llamada al sistema sendmmsg() que envía múltiples instancias de sendmsg(), la llamada al sistema setns() para gestionar mejor los sistemas de virtualización ligera, como los contenedores, soporte de nuevo hardware como por ejemplo Microsoft Kinect y APUs AMD Llano Fusion, y muchos otros drivers y pequeños cambios. La lista completa de cambios, en inglés, puede encontrarse aquí, como siempre.

· Btrfs: defragmentación automática, scrubbing, mejoras de rendimiento 
  · Defragmentación automática: Los sistemas de archivos COW (copy-on-write, copiar-al-escribir) tienen muchas ventajas, pero también algunas desventajas, como por ejemplo la fragmentación. Cuando Btrfs escribe un archivo al disco por primera vez lo hace secuencialmente, pero el diseño COW implica que cualquier modificación posterior no debe reescribir los datos antiguos, sino escribirlos en un bloque libre del disco, lo cual causa fragmentación (las bases de datos RPM son un caso común de este problema). Además, están los problemas de fragmentación comunes a todos los sistemas de archivos. Btrfs ya ofrecía algunas alternativas para luchar contra este problema. En primer lugar, soporta defragmentación en vivo utilizando el comando "btrfs filesystem defragment". En segundo lugar, tiene una opción de montaje, -o nodatacow, que desactiva el COW para los datos. Ahora se añade una tercera opción, la opción de montaje -o autodefrag. Este mecanismo detecta pequeñas escrituras aleatorias en los archivos y los defragmenta automática y transparentemente, sin intervención del usuario. Aun no funciona bien con imágenes de virtualización o grandes bases de datos, pero funciona bien para los archivos pequeños como bases de datos rpm, sqlite o bdb.

  · Scrubbing

"Scrubbing", que podría traducirse como "fregar", o "restregar", consiste en comprobar la integridad de todos los datos del sistema de archivos: Se van comprobando los checksums de todos los datos, y si hay alguno erróneo, o el disco está dañado, se restaura una copia en buen estado, de haberla.

  · Mayor velocidad de creación/eliminación de archivos: Btrfs tiene bajo rendimiento en la creación/eliminación de archivos, la razón es que cada creación/eliminación necesita hacer modificaciones en el b+tree, como insertar o eliminar un item de inodo, de nombre de directorio, índice de directorio, etc. Ahora btrfs puede retrasar la inserción/eliminación de items en el b+tree, lo que permite acumular modificaciones y hacerlas todas de una vez. Los microbenchmarks de creación de archivos se han acelerado un ~15%, los de eliminación un 20%.

  · No escribir al disco items de checksum de datos que no han cambiado: Mejora el rendimiento de fsync. Un benchmark sysbench haciendo "escritura aleatoria + fsync" ha aumentado de 112.75 peticiones/segundo a 1216 requests/seg.

  · Asignador de espacio en configuraciones con múltiples discos: El asignador de "chunks" (el que busca espacio para usar en el disco) siempre asigna el espacio en las configuraciones multidisco en el mismo orden. Esto causa una distribución de los datos subóptima, especialmente usando RAID1/10 y un número impar de dispositivos. Ahora btrfs intenta buscar espacio en primer lugar en los discos con más espacio.

· sendmmsg(): acumulación de llamadas a sendmsg():

recvmsg() y sendmsg() son las llamadas al sistema que se utilizan para recibir/enviar datos a la red. En Linux 2.6.33 se añadió recvmmsg(), una llamada al sistema que permite recibir en una sola llamada al sistema los datos de varias llamadas recvmsg(), lo cual mejora el rendimiento y la latencia en muchos casos. Ahora, se ha añadido su equivalente sendmmsg(). Los microbenchmarks muestran una mejora de ancho de banda en el envío de tráfico UDP del 20% y un 30% en sockets raw.

· Soporte de Xem Dom0: Por fin, Linux tiene soporte del modo Dom0 de Xen, requisito para poder funcionar como host Xen sin parches.

· Cleancache: Cleancache es algo opcional que permite aumentar el rendimiento del caché de páginas del kernel. Podría describirse como algo análogo a memcached, pero para páginas de cache. Proporciona un almacenamiento no directamente direccionable por el kernel, que no garantiza que los datos que se escriban en él no desaparecerán. Puede ser usado por sistemas de virtualización para mejorar la gestión de memoria de las VMs, pero también puede usarse para implementar un caché comprimido.

· Filtrado de paquetes BPF mediante JIT: El filtrado de Berkeley Packet Filter, que es lo que utilizan herramientas como libpcap/tcpdump, normalmente se hace con un intérprete. En esta versión se ha añadido un JIT que genera código nativo para los filtros, y hace que el filtrado sea mucho más rápido. Aunque pueda parecer una exageración tener un JIT en el kernel, lo cierto es que se trata de un JIT muy, muy simple, y es algo que otros sistemas operativos, como FreeBSD, tienen desde hace años.


· Wake on WLAN: Wake-on-LAN es la capacidad de que un sistema dormido pueda ser "despertado" por un paquete de red especial. En esta versión se añade en la implementación 802.11 la misma capacidad, pero para tarjetas de red inalámbricas.

· Mensajes ICMP_ECHO sin privilegios: Esta versión permite enviar mensajes ICMP_ECHO (es decir, un ping) sin necesidad de privilegios de root, lo cual permite que la herramienta ping no requiera setuid.

· Llamada al sistema netns(): Linux soporta diferentes espacios de nombre para los diferentes recursos que gestiona; por ejemplo, las formas ligeras de virtualización, como los contenedores o systemd-nspaw, muestran a los procesos virtualizados un PID virtual en lugar del PID real. Lo mismo puede hacerse con la estructura de directorios del sistema de archivos, los recursos de red, IPC, etc. La única manera de configurar diferentes espacios de nombre es usar diferentes flags en la llamada al sistema clone(), pero ese método no permite hacer cierto tipo de cosas, como permitir que un proceso acceda al espacio de nombres de otro proceso. La llamada al sistema setns() resuelve ese problema.

· Temporizadores-alarma: Los temporizadores-alarma son temporizadores híbridos, similares a los temporizadores de alta resolución, sólo que cuando se suspende el sistema, se activa el RTC para que se dispare y despierte el sistema.Este concepto está inspirado en los temporizadores-alarma de Android, y la API usa la interfaz de relojería POSIX.

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

13 comentarios:

  1. Tío, eres mi ídolo. Eres uno de los pocos que puede explicar aspectos técnicos del kernel en extensión y sin asustar. Gran trabajo.

    Por curiosidad: yo creo que la inclusión de Xen en el kernel llega demasiado tarde para desplazar a KVM. Si hubiera ocurrido hace un par de años, cuando todavía se estaba "cocinando" RHEL6, podría haber sido su salvación. Pero ahora mismo no veo a todas las distribuciones que quitaron Xen volviendo a meterlo. ¿Tú qué opinas?

    ResponderEliminar
  2. Anónimo9:32 a. m.

    Supongo que los temporizadores-alarma son lo que utiliza windows 7 para pasar automáticamente de suspendido a hibernado, en el periodo que se haya programado.

    ResponderEliminar
  3. Anónimo10:30 a. m.

    Hola Diego,
    ¿Sabes si se ha corregido el problema que hacía que desde la 2.6.38 en los portatiles se consumiera mucha más batería de lo normal?

    Gracias.

    ResponderEliminar
  4. Anónimo12:08 p. m.

    http://www.phoronix.com/scan.php?page=article&item=windows_ubuntu_pow&num=9

    ResponderEliminar
  5. Yo no tengo mucha idea del tema, lo reconozco, pero sinceramente, me despista que en el kernel se vaya dando soporte a tecnologías diversas que persiguen los mismos objetivos. ¿No dicen que quien mucho abarca poco aprieta? Si ya estaba SELinux, ¿por qué meten AppArmor?. Si ya estaba KVM, ¿por qué meten Xen? Es un lío.

    ResponderEliminar
  6. Roberto: Definitivamente Xen debería haberse incluido mucho, mucho antes, los de Xen sabrán por qué insistieron en meter tanto la pata. Pero al margen de la competencia con KVM, la inclusión de Xen es una buena noticia porque hay muchísima gente utilizándolo y tenerlo en mainline facilita las cosas: a los usuarios el usar un kernel reciente, las distros pueden dar soporte por defecto sin romperse la cabeza, los de Xen ven reducido la montaña de parches que aplican, etc etc...

    Osqui: No es un lío, Linux siempre ha permitido la coexistencia de tecnologías competidoras, siempre que haya justificación técnica para ello. No hay más que ver la cantidad de sistemas de archivos que hay, por ejemplo.

    ResponderEliminar
  7. Muchas gracias por tus artículos, Diego. Son maravillosos.

    Este momento de la publicación del Kernel Linux 3.0 es un acontecimiento largamente anhelado por mí. Llega en un tiempo en el que se le vá a conceder menos "atención y transcendencia" de los que se llevó el paso de la versión 2.4 a la 2.6.

    Saludos.

    ResponderEliminar
  8. Anónimo2:24 p. m.

    20 años... version 3 ... esos "miserables" cambios, cuota de mercado de un 5-8% (pc personales).. en serio... se puede considerar un exito?? si este producto se pagara, ya habria quebrado hace tiempo..

    ResponderEliminar
  9. Anónimo9:51 p. m.

    Solo te falta decir que Windows ha evolucionado más y mejor. Hay que ser gilipollas...

    ResponderEliminar
  10. @Anónimo: sí se puede considerar un éxito, no hay más que ver esto: http://top500.org/stats/list/37/osfam, donde se puede ver que el 91% de todos los súperordenadores del mundo utilizan Linux (ya sea RHEL, Suse, etc.). Y podrás decir: «bah, pero eso yo no lo uso». Pues puede que en un futuro (y no es que te lo desee), tengas algún tipo de enfermedad, como cáncer, y que con uno de estos súperordenadores, algún científico descubra la forma de curarte. ¿O a lo mejor te niegas porque se ha descubierto la cura con Linux?.

    Por otra parte, y esto lo "utilizas" sí o sí, muchísimos servidores web utilizan como sistema operativo Linux, como Google (¿no usas Google?, ¿ni Maps, etc.?), Facebook («Su infraestructura principal [...] que usan distribuciones del sistema operativo GNU/Linux usando LAMP.» [http://es.wikipedia.org/wiki/Facebook]), etc.

    ResponderEliminar
  11. Anónimo2:06 a. m.

    Cual es la novedad principal para q sea 3.0¿..?

    ResponderEliminar
  12. Anónimo2:15 a. m.

    Soy el del anterior post, Diego nos puedes explicar el nuevo stma de numeración de versiones?
    Si por casualidad lo sabes?
    Por q creí q 3.0 seria la hostia y parece mas de lo mismo.

    ResponderEliminar
  13. A los dos últimos anónimos.
    El cambio de número de versión se dio solamente porque a Linus se le complicaba ir con numeraciones tan altas (2.6.38) y además porque empieza la 3er década (recordemos que cumplió 20 años el núcle Linux)-

    ResponderEliminar