io_uring sin readahead: por qué la concurrencia importa más que el polling

Io_uring Without Readahead

Un PR para añadir readahead a Turso revela hallazgos sorprendentes sobre io_uring. Sin readahead, Turso emite una sola SQE a la vez, sin concurrencia, y el block layer no puede fusionar peticiones. Con readahead, 32 lecturas en vuelo permiten fusionar el 93% de las peticiones, reduciendo drásticamente las peticiones al dispositivo. El autor también descubre que el polling thread (sqpoll) consume el 65% de los ciclos de CPU, pero en una máquina con 4 vCPUs no compite con la query. Comparando con syscall, io_uring con O_DIRECT sufre más cache misses porque el DMA escribe directamente en el buffer del proceso, sin pasar por la caché de CPU. El artículo concluye con consejos sobre cuándo usar sqpoll y la importancia de batch submissions.

Con readahead activado, Turso emite 23.005 SQEs más y el dispositivo lee más bytes, pero recibe menos peticiones: el block layer fusiona el 93% de las peticiones.

Más de este día

2026-09-01