io_uring (anteriormente conocido como aioring ) es una interfaz de llamada al sistema del kernel de Linux para operaciones de E/S asincrónicas de dispositivos de almacenamiento que aborda problemas de rendimiento con interfaces similares proporcionadas por funciones como / o / etc. para operaciones en datos a los que se accede mediante descriptores de archivos . [1] [2] : 2 read()
write()
aio_read()
aio_write()
El desarrollo está en curso y Jens Axboe de Meta trabaja en él principalmente . [1]
Funciona creando dos buffers circulares , llamados "anillos de cola", para el almacenamiento de las solicitudes de E/S de envío y finalización, respectivamente. Para los dispositivos de almacenamiento, se denominan cola de envío (SQ) y cola de finalización (CQ). [3] Mantener estos buffers compartidos entre el núcleo y la aplicación ayuda a aumentar el rendimiento de E/S al eliminar la necesidad de emitir llamadas al sistema adicionales y costosas para copiar estos buffers entre los dos. [1] [3] [4] Según el documento de diseño de io_uring, el buffer SQ solo puede ser escrito por aplicaciones de consumo, y el buffer CQ solo puede ser escrito por el núcleo. [1] : 3
eBPF se puede combinar con io_uring. [5]
El núcleo Linux ha admitido la E/S asincrónica desde la versión 2.5, pero se consideraba difícil de usar e ineficiente. [6] Esta API más antigua solo admitía ciertos casos de uso específicos , [7] en particular, solo permite la operación asincrónica cuando se usa el indicador O_DIRECT y al acceder a archivos ya asignados. Esto evita utilizar la caché de páginas , al mismo tiempo que expone la aplicación a la semántica compleja de O_DIRECT. Linux AIO tampoco admite sockets, por lo que no se puede usar para multiplexar la E/S de red y disco. [8]
La interfaz del kernel io_uring se adoptó en la versión 5.1 del kernel de Linux para resolver las deficiencias de Linux AIO. [1] [4] [9] La biblioteca liburing proporciona una API para interactuar con la interfaz del kernel fácilmente desde el espacio de usuario . [1] : 12
Se ha observado que io_uring expone una superficie de ataque significativa y dificultades estructurales al integrarlo con el subsistema de seguridad de Linux . [10]
En junio de 2023, el equipo de seguridad de Google informó que el 60 % de los exploits enviados a su programa de recompensas por errores en 2022 eran exploits de las vulnerabilidades io_uring del kernel de Linux. Como resultado, io_uring
se deshabilitó para las aplicaciones en Android y se deshabilitó por completo en ChromeOS , así como en los servidores de Google. [11] En consecuencia, Docker también deshabilitó io_uring de su perfil seccomp predeterminado. [12]
Bloqueo durante io_submit en ext4, en operaciones almacenadas en búfer, acceso a la red, tuberías, etc. Algunas operaciones no están bien representadas por la interfaz AIO. Con operaciones completamente no compatibles como lecturas almacenadas en búfer, operaciones en un socket o tuberías, la operación completa se realizará durante la llamada al sistema io_submit, con la finalización disponible inmediatamente para acceso con io_getevents. El acceso AIO a un archivo en un sistema de archivos como ext4 es parcialmente compatible: si se requiere una lectura de metadatos para buscar el bloque de datos (es decir, si los metadatos aún no están en la memoria), entonces la llamada io_submit bloqueará la lectura de metadatos. Ciertos tipos de escrituras que amplían archivos no son compatibles en absoluto y se bloquean durante toda la duración de la operación.
El 60 % de los envíos explotaban el componente io_uring del kernel de Linux.