Análisis técnico del rendimiento de io_uring y readahead en Turso

Fuentes: Technical analysis of io_uring and readahead performance in Turso

Este artículo técnico analiza el impacto de la implementación de readahead (lectura anticipada) en la base de datos Turso, específicamente en su backend basado en io_uring con O_DIRECT. Al utilizar O_DIRECT, el kernel no realiza lectura anticipada automática, por lo que debe implementarse a nivel de aplicación para mantener el rendimiento. El estudio utiliza el benchmark TPC-H sobre una base de datos de 1.2 GiB para comparar dos escenarios: sin readahead (una sola operación en vuelo) y con readahead (ventana de 32 páginas).

Los resultados demuestran que la concurrencia es clave. Sin readahead, cada lectura espera a la anterior, impidiendo que la capa de bloques del kernel fusione peticiones adyacentes. Con readahead, aunque se envían más solicitudes (SQEs) y se leen más bytes, el dispositivo recibe significativamente menos peticiones físicas debido a la fusión de bloques (%rrqm del 91-93%). Esto reduce la latencia total.

El análisis también examina el costo computacional del modo sqpoll. Aunque acelera las operaciones, consume recursos de CPU que pueden competir con la aplicación si no hay núcleos libres. Además, se identifica una diferencia en los fallos de caché: O_DIRECT evita la copia de datos desde la página de caché al buffer del proceso, lo que impide que los datos queden 'calientes' en las cachés L1/L2/L3 de la CPU, resultando en más cache misses comparado con el backend syscall tradicional. La conclusión es que io_uring con O_DIRECT requiere readahead y batching para ser competitivo.