31 de mayo de 2011

El tenebroso mundo del firmware

Si les gustan las historias de terror que causan pesadillas por la noche y se llevan en un saco la poca inocencia que les pueda quedar, prueben a leer este post de Matthew Garrett. En el se cuenta cómo hay cinco maneras teóricas de provocar el reinicio de un PC, pero ninguna de ellas funciona correctamente por si sola en todos los equipos del mercado: sólo es posible conseguir un reinicio fiable imitando lo que Windows haga, porque Windows es lo único que los desarrolladores de las BIOS testean.

Y si les queda sangre en las venas, pueden probar con otros posts suyos anteriores, como el tenebroso caso de la implementación EFI de Apple, la especificación ACPI que todo el mundo pisotea, comportamientos absurdos con el bus PCI, o ordenadores nuevos que son incapaces de implementar bien características que los PCs tienen desde hace 25 años. Todos con el mismo síntoma: lo que Windows implemente se convierte en la regla. Esta es una de las razones por las que un día Linus dijo que las especificaciones no sirven para nada.

No sé ustedes, pero yo admiro profundamente a los programadores que tienen que lidiar con estas cosas. Son como los funcionarios de chaqueta gris y cargos relativamente importantes pero lejos de la cúpula, que se encargan de hacer el verdadero trabajo de gestión de los gobiernos. Nadie les conoce, pero son los verdaderos héroes.

27 de mayo de 2011

Las novedades de Linux 2.6.39

Perdón por el imperdonable retraso en escribir este artículo, una semana después de lo debido. En mi defensa, señalaré que esta ha sido el periodo de desarrollo desde 2.6.14, hace más de 5 años.

Ya se ha anunciado la versión 2.6.39 del kernel Linux. Las novedades principales en esta versión son grandes mejoras de escalabilidad en Ext4, aumento de la ventana inicial de congestión de TCP, soporte de una nueva arquitectura de CPU llamada UniCore-32, una característica que permite la creación y gestión de grupos de recursos de red llamada IPset, pequeñas actualizaciones en Btrfs, una característica que permite almacenar la información de un cuelgue en el firmware para recuperarlo tras un reinicio, actualizaciones de perf, y muchos otros pequeños cambios y drivers nuevos. La lista completa de cambios, en inglés, puede encontrarse aquí, como siempre.

· Escalabilidad SMP de Ext4: La lista de cambios de 2.6.37 mencionó unas mejoras enormes de rendimiento de Ext4 en sistemas con múltiples CPUs. Sin embargo, esa característica no estaba preparada del todo y fue desactivada antes de la versión final, algo que la lista de cambios no mencionó. En esta versión se han corregido los problemas y esta característica se ha activado por defecto, algo

Esta es la descripción de aquella lista: "En esta versión, Ext4 enviará los datos al subsistema de dispositivos de bloques mediante una nueva capa llamada "bio". Esta capa "bio" (que es un alias de "block I/O": Se trata de la parte del kernel que se encarga de enviar peticiones al I/O scheduler) fue una de las primeras características que se incluyeron en Linux 2.5.1, y fue un reemplazo de la capa que sustituía, llamada "buffer", que tenía muchos problemas de escalabilidad y rendimiento: Al usarla, Ext4 sólo podía hacer peticiones de 4KB cada vez; utilizando la capa bio Ext4 puede enviar peticiones de 512KB cada vez. En el benchmark FFSB ejecutado en un equipo con 48 procesadores AMD y con almacenamiento de array RAID de 24 discos SAS, utilizando 192 threads paralelos de ffsb, la mejora fue del 300%".

· Incrementar la ventana de congestión TCP a 10 paquetes: La ventana inicial del algoritmo anticongestión de TCP ha sido aumentada a 10 paquetes. Este es un cambio muy técnico, pero de una importancia considerable. Se trata de un cambio sugerido por Google, quien asegura que puede mejorar la latencia un 10% sin detrimento del rendimiento. Recomendado este artículo de LWN: Increasing the TCP initial congestion window.

· IPset: IPset (página web) permite crear grupos de recursos de red (direcciones IPv4/v6, puertos TCP/UDP, emparejamientos IP<->MAC, emparejamientos IP<->puerto) llamados "IP sets", que luego se utilizan para definir reglas de iptables. Estos sets son mucho más eficientes a la hora de clasificar paquetes que las reglas de iptables por si solas, aunque consumen más memoria. Existen diferentes algoritmos y diferentes estructuras para que el usuario escoja una solución óptima. Esta característica ha estado disponible durante mucho tiempo como un añadido en los parches xtables-addons.

· Actualizaciones de Btrfs: Btrfs permite aplicar diferentes configuraciones de compresión y copy-on-write a nivel de directorio. También se incluyen algunas mejoras de rendimiento, y tracepoints para el análisis en tiempo de ejecución.

· Pstore: almacenamiento de la ínformación de un crash: Pstore es una interfaz en forma de sistemas de archivo que permite almacenar y recuperar información de un cuelgue en lugares como el ERST -un lugar especificado por ACPI para almacenar esas cosas. De ese modo se puede recuperar un dmesg del equipo colgado, por ejemplo.

· Nueva arquitectura: UniCore32: UniCore-32 es una arquitectura de 32 bits que incluye una serie de diseños de chip RISC licenciados por PKUnity Ltd.

· Memoria 'trascendente': La memoria 'trascendente' (el nombre es un poco raro, aviso) es un nuevo tipo de memoria con un conjunto de características muy particular. De LWN: "la memoria trascendente puede concebirse como un disco RAM con unas características interesantes: nadie sabe cómo es de grande, las escrituras al disco podrían no ser exitosas, y los datos escritos al disco podrían desvanecerse antes de ser releídos". Aunque no lo parezca a primera vista, hay usos útiles para este tipo de memoria, como el caché de páginas, la memoria de intercambio, o virtualización. En esta versión esta memoria se utiliza para implementar un sistema de cacheado con compresión llamado zcache.

· BKL: Eso es todo, amigos: En 2.6.37 fue posible compilar, por primera vez, un kernel Linux sin soporte de BKL. En esta versión, el BKL se ha eliminado por completo de las fuentes del kernel, incluyendo las propias definiciones e implementaciones de lock_kernel() y unlock_kernel().

· Llamadas del sistema open-by-handle: Se han añadido dos nuevas llamadas al sistema, name_to_handle_at() y open_by_handle_at(). Estas llamadas al sistema devuelven un "handle" de archivo que puede ser útil para sistemas de archivo en espacio de usuario, software de copia de seguridad y otras herramientas de gestión de espacio de almacenamiento. Esos "handles" pueden utilizarse en la llamada al sistema open() junto con un nuevo flag: O_PATH.

· Actualizaciones de perf: Se permite filtrar eventos de cada cgroup en perf stat y perf record, utilizando la opción -G, una nueva UI basada en slang con anotación en vivo, comando perf top --tui, soporte para Intel SandyBridge, soporte de filtros en perf probe como por ejemplo perf probe -V schedule --externs --filter=cpu* y otras mejoras menores por el estilo.


Estas son las novedades principales. La lista completa de cambios, en inglés, puede encontrarse aquí, como siempre.

7 de mayo de 2011

La perseverancia

En The H han escrito un gran artículo de esos que no se leen a menudo, sobre los problemas de soporte de hardware que tuvo Linux en el pasado y que ha solventado a día de hoy a base de perseverancia de hormiga. ¿Quién no recuerda el infierno que era, hace no tanto tiempo, hacer funcionar los drivers para casi cualquier tarjeta WiFi? De hecho, a grandes rasgos, hacer funcionar un portátil con Linux era en muchos casos una experiencia mística, que requería buscar alguna guía para saber qué parámetros del kernel o qué configuración de las X había que retocar para que todo funcionara. Hoy hay muchos menos problemas, páginas como esta ya no sirven de mucho.

Pero hay problemas de los que no habla el artículo. Recuerden que no había en el kernel una pila genérica 802.11, no había APIs homogéneas para las herramientas de gestión de red, y las que había eran "extensiones wifi" (parcheando hasta el infinito, y más allá) que daban mil problemas. En Gnome y KDE la gestión de red no estaba bien integrada, no existía Network Manager (y no es que yo, que lo odio con saña, no lamente el día que se empezó a desarrollar, pero reconozco que ha facilitado la vida a mucha gente). ¿Y el soporte ACPI? Sin comentarios.

Mucha gente usaba, por necesidad más que por gusto, cosas como ndiswrapper. Recordemos que se nos decía la cantinela de siempre: que el problema era el modelo de desarrollo de Linux, que los cambios frecuentes de API y la exigencia de que todo fuera libre eran obstáculos insalvables que impedían que los fabricantes soportaran Linux, y que necesitábamos un cambio de mentalidad para fomentar la aparición de drivers privativos. Se equivocaron: Hasta Broadcom colabora hoy para soportar sus drivers, algo que hace no mucho hubiera sonado a ciencia ficción. Y el apoyo de AMD a los drivers gráficos libres está empezando a dar beneficios, hasta el punto de que están planeando empezar a soportar los nuevos chips antes de que salgan a la venta. La perseverancia y el trabajo de hormiguita de unos pocos es lo que hace posible estos pequeños milagros.

(Y antes de que alguien lo diga: si, todavía hay personas que necesitan utilizar ndiswrapper, todavía hay gente que necesita retocar configuraciones, pero a día de hoy son excepciones).