¿Qué tan bien escalan las escrituras simultáneas con io_uring?

¿Qué tan bien escalan las escrituras simultáneas con io_uring?

Fondo:Estoy muy intrigado por las posibles ganancias de rendimiento de io_uring, pero no estoy lo suficientemente familiarizado con C, el kernel de Linux o el funcionamiento interno de los dispositivos de bloque para implementar puntos de referencia significativos. No estoy buscando números concretos, solo una descripción general de la arquitectura que informará mi investigación continua.


Imagine que tengo un programa que agrega repetidamente lotes de diez enteros de 4 bytes a un archivo y luego lo sincroniza. Quiero cambiar a un modelo en el que agrego cada número entero del lote a su propio archivo. Es decir: escribiré un único int de 4 bytes en cada uno de los 10 archivos y los sincronizaré todos.

Al usar IO sincrónica, el esquema original usa 2 llamadas al sistema (1 escritura + 1 sincronización), y el enfoque int por archivo usa la asombrosa cantidad de 20 (10 escrituras + 10 sincronizaciones). En términos de llamadas al sistema, el io_uringahorro sería enorme: puedo lograr el equivalente a 20 llamadas al sistema con un solo io_uringenvío. Lo que no me queda claro es cómodescansarde la maquinaria Linux writeescalará una vez que se haya producido el envío.

  • ¿La mayoría de los discos tienen cierta cantidad de soporte de hardware para escrituras paralelas? ¿O tal vez los SSD sí, pero los discos giratorios no?
  • ¿Las escrituras se canalizan (¿a través del bus?) al disco para que el núcleo no tenga que esperar una respuesta de ida y vuelta para cada una?
  • ¿El núcleo mismo termina poniendo en cola todas las llamadas al sistema solicitadas a través de io_uring?
  • ¿Hay otros obstáculos que no he considerado?

Bien podría ser que mi modelo mental esté equivocado. ¡Cualquier consejo es muy apreciado!

Respuesta1

¿La mayoría de los discos tienen cierta cantidad de soporte de hardware para escrituras paralelas? ¿O tal vez los SSD sí, pero los discos giratorios no?

Casi todos los discos funcionan independientemente de si son giratorios o de estado sólido (incluso los discos giratorios tienen cachés, por lo que para pequeñas cantidades de datos pueden parecer no demasiado lentos). Las memorias USB o tarjetas SD baratas lograrán una mala concurrencia, pero también habrá cierto nivel de paralelismo... En términos de comandos paralelos máximos para un solo dispositivo, SATA puede tener hasta 32, SCSI tiende a oscilar entre 10 y 100, NVMe puede llegar a los 1000 (creo que la especificación lo limita a un máximo de 65536, pero todavía no conozco ningún dispositivo que llegue tan alto).

¿Las escrituras se canalizan (¿a través del bus?) al disco para que el núcleo no tenga que esperar una respuesta de ida y vuelta para cada una?

Sí, se pueden enviar varias escrituras (o lecturas) en paralelo. Sin embargo, si esto sucede depende de muchas cosas (por ejemplo, el kernel puede agruparlos para mayor eficiencia, puede ser necesaria la sincronización, por lo que la cola debe vaciarse, etc.)

¿El núcleo mismo termina poniendo en cola todas las llamadas al sistema solicitadas a través de io_uring?

Tal vez. io_uringcompletará la E/S en línea si no se bloquea; de lo contrario, se pondrá en cola. DeIO eficiente con io_uring: "Más importante aún, para las operaciones que no se bloquearán, los datos se entregan en línea".

¿Hay otros obstáculos que no he considerado?

Sí. Tampoco está claro si está haciendo suficientes E/S por segundo para ver realmente el beneficio de algo como io_uring... Además, es probable que las sincronizaciones frecuentes limiten el paralelismo dependiendo de la frecuencia y de cómo se realizan. Si está realizando E/S almacenadas en búfer, el kernel está eliminando el paralelismo incluso en el modo síncrono porque está escribiendo en la RAM, entonces el kernel se desconecta de la RAM en paralelo siempre que sea posible. (Tenga en cuenta que los elementos anteriores no son una lista exhaustiva)

(Pregunta del título)

¿Qué tan bien escalan las escrituras simultáneas con io_uring?

Está bien, muy bien, dependiendo del kernel que esté utilizando y de cómo envíe la E/S. Vea las referencias y enlaces en esteresponda a "¿Realmente no hay E/S de bloque asíncrono en Linux?".

Referencias

información relacionada