libuv, una biblioteca multiplataforma utilizada en muchos proyectos para el soporte para E/S
Hace poco se dio a conocer el lanzamiento de la nueva versión de la biblioteca libuv 1.45.0, la cual es ampliamente utilizada para multiplexación de conexiones y procesamiento de E/S asíncrono en muchos proyectos destinados al procesamiento de alto rendimiento de solicitudes de red y archivos, por ejemplo, en la plataforma Node.js, BIND 9 y Knot.
Para quienes desconocen de libuv, deben saber que esta es una biblioteca C multiplataforma que brinda soporte para E/S asíncrona basada en bucles de eventos. Es compatible con epoll Windows kqueue IOCP, puertos de eventos de Solaris y en Linux es una de las bibliotecas que brinda soporte a io_uring.
Sobre libuv
libuv está diseñado principalmente para su uso en Node.js, pero también lo utilizan otros proyectos de software. Originalmente era una abstracción en torno a libev o Microsoft IOCP, ya que libev no es compatible con IOCP en Windows.
La biblioteca permite organizar un bucle de eventos sin bloqueo utilizando métodos como epoll en Linux, kqueue en BSD y macOS, IOCP en Windows y puertos de eventos en Solaris
De las características que se destacan de libuv:
- Bucle de eventos con todas las funciones respaldado por epoll, kqueue, IOCP, puertos de eventos
- Sockets TCP y UDP asíncronos
- Resolución DNS asíncrona
- Operaciones asincrónicas de archivos y sistemas de archivos
- Eventos del sistema de archivos
- Código de escape ANSI controlado TTY
- IPC con uso compartido de sockets, utilizando sockets de dominio Unix o canalizaciones con nombre (Windows)
- Procesos secundarios
- Grupo de subprocesos
- Manejo de señales
- reloj de alta resolucion
- Primitivas de enhebrado y sincronización
Las funciones multiplataforma están disponibles para que las aplicaciones trabajen con conexiones de red TCP y UDP en modo asíncrono, resolución de DNS asíncrono, trabajo asíncrono con archivos, seguimiento de eventos en el sistema de archivos, organización de IPC para compartir sockets, organización de un grupo de subprocesos procesamiento de señales y uso de temporizadores de alta precisión.
La biblioteca también incluye primitivas para organizar la ejecución de subprocesos múltiples y la sincronización de subprocesos. Junto con el bucle de eventos, se utilizan dos primitivas básicas abstractas de alto nivel: «manejadores» para implementar objetos de larga duración que realizan múltiples operaciones y «solicitudes» para realizar solicitudes de corta duración.
Principales novedades de libuv 1.45
Una mejora clave en la nueva versión es la implementación de la tan esperada compatibilidad con la interfaz de E/ S asíncrona io_uring proporcionada por el kernel de Linux desde la versión 5.1.
Ademas de ello, tambien se destaca la compatibilidad con el sondeo de E/S y la capacidad de trabajar con y sin almacenamiento en búfer con la API io_uring, los desarrolladores del kernel intentaron abordar las deficiencias de la antigua interfaz aio. En términos de rendimiento, io_uring está muy cerca de SPDK y supera significativamente a libaio cuando el sondeo está habilitado.
En libuv, la interfaz io_uring se puede usar en plataformas Linux con kernel 5.1+ en primitivas de manipulación de archivos asincrónicos como lectura, escritura, fsync, fdatasync, stat, fstat y lstat. En otros sistemas operativos y sistemas con núcleos más antiguos, se sigue utilizando el grupo de subprocesos.
Se menciona que las pruebas de rendimiento han demostrado que el uso de io_uring en libuv puede lograr un aumento de rendimiento de 8 veces. El trabajo de agregar io_uring a libuv fue apoyado por el ISC (Internet Systems Consortium), que usa la biblioteca en cuestión en el servidor BIND DNS.
Otras de las mejoras de la nueva versión, destaca la configuración de un único tamaño de pila de 8 MB para el grupo de subprocesos en todas las arquitecturas y plataformas.
Tambien se destaca que se agregó una nueva API uv_metrics_info() para recopilar métricas, como el recuento de iteraciones en el ciclo de eventos, la cantidad total de eventos procesados y la cantidad de eventos en espera en la cola en el momento en que se envió la solicitud.
Finalmente, si estás interesado en poder conocer más al respecto, debes saber que el código del proyecto está escrito en C y se distribuye bajo la licencia MIT. Puedes consultar los detalles en el siguiente enlace.