El artículo compara los dos sistemas de colas para E/S asíncrona que ofrece Linux: epoll, disponible desde 2002, e io_uring, incorporado en la versión 5.1 del kernel en 2019. El autor parte de su experiencia reescribiendo TinyGate, un proxy inverso que pasó de una arquitectura basada en workers a otra basada en epoll y, finalmente, a io_uring, tras comprobar que epoll limitaba el rendimiento frente a nginx o haproxy.
La diferencia clave es de modelo. epoll notifica cuándo una operación es posible, pero el programa debe llamar después a read() o write(); cada evento de E/S implica, como mínimo, un par de llamadas al sistema (epoll_wait más la lectura o escritura) y, por tanto, dos cambios de contexto usuario-núcleo. io_uring invierte la lógica: notifica cuándo la operación ha terminado, mediante anillos de envío y completado en memoria compartida entre la aplicación y el kernel, lo que reduce drásticamente las llamadas al sistema. Una invocación de io_uring_enter() puede tramitar lotes enteros de operaciones.
El texto incluye ejemplos de código en C con liburing para ambas APIs y repasa opciones avanzadas: E/S de copia cero mediante registro previo de búferes y IORING_OP_SEND_ZC (kernel 6.0+); el modo SQPOLL, que crea un hilo de kernel dedicado para sondear la cola y minimizar las llamadas al sistema, aunque consume CPU; y la gestión asíncrona de errores a través del campo res de los cqe. La conclusión es que, en sistemas modernos, io_uring desplaza a epoll como elección por defecto para nuevos proyectos de red de alto rendimiento.
