La lectura del software RAID en paralelo es más lenta de lo que "debería" ser, teniendo en cuenta otros puntos de referencia

La lectura del software RAID en paralelo es más lenta de lo que "debería" ser, teniendo en cuenta otros puntos de referencia

Nota: He visto algunas preguntas algo similares aquí, pero:

  1. ninguno de ellos se refiere a la lectura de muchos archivos en paralelo, y
  2. la mayoría tienen más de 10 años y se refieren a versiones de hardware y kernel que ya no son relevantes.

Fondo:

Tengo una máquina Linux (Ubuntu, kernel 5.15.0-82-generic) con dos CPU de 128 núcleos y 128 GB de RAM. Tiene una matriz RAID 5 de 10 SSD conectados a través de SATA, cada uno de ellos con capacidad de lectura de hasta 530 MB/s. Estos son efectivamente de solo lectura cuando están en uso (se usan principalmente durante el día y se agregan nuevos datos cada noche). Mi problema general es suministrar datos de los discos a docenas de núcleos en paralelo.

Procedimiento de evaluación comparativa

Estoy comparando lecturas ejecutando instancias de

dd if=/path/to/large/file of=/dev/null bs=1024 count=1048576

en paralelo con iostaty iotop. Entre ejecuciones, borro el caché ejecutando

sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"

Estoy seguro de que esto funciona correctamente porque si no lo hago, la lectura posterior de un archivo activo finaliza casi de inmediato y, una vez que lo hago, la lectura de ese archivo vuelve al mismo rendimiento que antes.

Resultados de referencia

Si leo un solo archivo a través de RAID de software, obtengo una velocidad de lectura de entre 500 y 700 MB/s, y al observar el resultado iostatveo que la forma en que se logra esto es leyendo desde cada una de las diez unidades en Básicamente exactamente la misma velocidad en paralelo.

Si leo directamente desde las unidades (es decir, si proporciono /dev/sda, /dev/sdb, etc. como if=argumentos para dd), entonces puedo leer desde cada una de ellas en paralelo a 530 MB/s cada una (es decir, leer 1 GB de las diez toma exactamente lo mismo). cantidad de tiempo como leer 1 GB de uno solo de ellos.)

Sin embargo, si intento leer varios archivos en paralelo a través de RAID de software, obtengo una degradación muy sustancial del rendimiento. Si leo diez archivos en paralelo a través de RAID de software, los archivos individuales alcanzan velocidades de lectura de entre 150 y 350 MB/s, y todo el proceso tarda alrededor de 4 veces más que copiar la misma cantidad de datos directamente desde las unidades.

Además, la lectura desde software parece tocar un límite absoluto con una velocidad de lectura total de alrededor de 2,7 GB/s, según informó iotop.

Creo que para alimentar todos los núcleos con suficientes datos de disco para que no se desperdicien, probablemente tendré que pasar a NVMe en lugar de SATA, pero primero quiero resolver este problema porque parece ser el software RAID o algo así. aguas arriba está poniendo un límite a la velocidad a la que puedo leer desde estos discos.

Preguntas:

  1. ¿Cómo puedo diagnosticar dónde está el cuello de botella?
  2. ¿Cómo puedo ver las opciones de configuración aquí y cuáles son mis otras opciones?
  3. ¿Existen limitaciones fundamentales de mi configuración que hacen imposible lo que intento hacer? Si es así, ¿existen configuraciones alternativas que pueda utilizar?

Cosas que ya he probado

  • Jugar con el tamaño del bloque de dd, haciéndolo más grande o más pequeño, no tiene ningún efecto.
  • Configurar la lectura anticipada de RAID y/o el tamaño de caché de banda no tiene ningún efecto
  • Actualizar el kernel a una versión ligeramente más nueva que probablemente quería perjudicar drásticamente los resultados de las pruebas comparativas, básicamente limitando el rendimiento total a 500 MB/s IIRC.

Apéndice:

Salida de muestra iostat -k 1durante una ejecución de referencia:https://pastebin.com/yuWwWbRU

Contenido de /proc/mdstat:

Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] 
md127 : active raid5 sdj1[10] sdh1[7] sdi1[8] sdf1[5] sdd1[3] sdc1[2] sdg1[6] sde1[4] sdb1[1] sda1[0]
      70325038080 blocks super 1.2 level 5, 4k chunk, algorithm 2 [10/10] [UUUUUUUUUU]
      bitmap: 0/59 pages [0KB], 65536KB chunk

unused devices: <none>

información relacionada