Cómo saturar una NIC de 400 Gb/s leyendo NVMe con io_uring

Fuentes: Task Failed Successfully: Saturating NIC and Disk Bandwidth

Este artículo técnico describe un recorrido de optimización de rendimiento en un sistema de almacenamiento de alto rendimiento ejecutado sobre Linux. El montaje es deliberadamente simple: un único hilo emite lecturas aleatorias de 1 MiB en E/S directa sobre 8 unidades NVMe y envía los datos a un host remoto mediante RDMA WRITE, con el objetivo de saturar una NIC de 400 Gb/s (46,6 GiB/s teóricos).

En la configuración inicial, el rendimiento se estanca en torno a 22 GiB/s con solo 16 operaciones en vuelo, y el perfilado con perf revela que el 81,6 % del tiempo de CPU se consume en io_submit_sqes. El cuello de botella está en la preparación de la memoria de usuario para DMA: por cada lectura de 1 MiB respaldada por páginas de 4 KiB, el kernel recorre las tablas de páginas, fija unas 256 páginas, actualiza el estado de los folios y construye bio_vecs, lo que se traduce en 5 a 13 millones de páginas procesadas por segundo mediante GUP.

La solución consiste en registrar los búferes por adelantado con io_uring_register_buffers(3) y usar la operación READ_FIXED, que mueve todo ese trabajo de metadatos fuera del camino crítico por E/S. Con esta técnica, al pasar de 64 operaciones en vuelo el sistema alcanza 46,00 GiB/s, prácticamente la capacidad máxima de la NIC, frente a los 22,15 GiB/s del baseline, una mejora del 108 %. El texto también sitúa la experiencia dentro de un flujo de trabajo con agentes de IA para programación, donde el código se genera más rápido de lo que puede analizarse, lo que hace indispensable la verificación humana.