epoll es un mecanismo de notificación de eventos de E/S introducido en el kernel de Linux 2.5.44 que proporciona una forma escalable y eficiente de monitorizar un gran número de descriptores de archivo (sockets, pipes, etc.) para eventos de E/S (lectura, escritura, errores). A diferencia de sus predecesores, select y poll, epoll no requiere copiar la lista completa de descriptores de archivo entre el espacio de usuario y el kernel en cada llamada, ni itera sobre todos ellos para encontrar eventos. En su lugar, utiliza una estructura de datos interna en el kernel (el 'epoll instance') a la que se añaden o eliminan descriptores de archivo, y el kernel notifica solo los descriptores que tienen eventos listos, lo que lo hace ideal para servidores con miles o millones de conexiones concurrentes.
epoll es la base de la mayoría de los servidores de alto rendimiento en Linux. Frameworks de red como Netty (Java), Tokio (Rust), y librerías de E/S asíncrona como libuv (usada por Node.js y Julia) lo emplean internamente para gestionar la concurrencia de E/S. Servidores web como Nginx, proxies como Envoy, bases de datos como Redis, y sistemas de mensajería como Kafka, todos dependen de epoll para manejar eficientemente un gran volumen de conexiones de clientes y operaciones de red sin bloquear hilos de ejecución, permitiendo arquitecturas 'event-driven' y 'non-blocking I/O'.
Para un Arquitecto de Sistemas, comprender epoll es crucial para diseñar y optimizar aplicaciones de red de alta concurrencia en entornos Linux. Su uso permite construir sistemas que pueden manejar millones de conexiones con un número limitado de hilos, reduciendo el consumo de memoria y el overhead de cambio de contexto (context switching). La elección de epoll frente a select/poll es un trade-off claro: aunque epoll es más complejo de programar directamente, su eficiencia y escalabilidad son incomparables para cargas de trabajo intensivas en E/S. Un arquitecto debe asegurarse de que las plataformas y frameworks subyacentes utilicen epoll (o su equivalente en otros OS como kqueue en BSD/macOS o IOCP en Windows) para evitar cuellos de botella de E/S y garantizar la resiliencia y el rendimiento del sistema bajo alta demanda.