Cómo (realmente) deshabilitar NCQ en Linux

13

Implementé mi propio Serial-ATA Host-Bus-Adapter (HBA) en VHDL y lo programé en un FPGA. Un FPGA es un chip que se puede programar con cualquier circuito digital. También está equipado con transceptores en serie para generar señales de alta velocidad para SATA o PCIe.

Este controlador SATA admite velocidades de línea SATA de 6 Gb / sy utiliza comandos ATA-8 DMA-IN / OUT para transferir datos en hasta 32 fragmentos MiB desde y hacia el dispositivo. Se ha demostrado que el diseño funciona a la velocidad máxima (por ejemplo, Samsung SSD 840 Pro -> más de 550 MiB / s).

Después de algunas pruebas con varios dispositivos SSD y HDD, compré un nuevo Seagate 6 TB Archive HDD ( ST6000AS0002 ). Este HDD alcanza un rendimiento de lectura de hasta 190 MiB / s, ¡ pero solo un rendimiento de escritura de 30 a 40 MiB / s!

Entonces cavé más profundo y medí los cuadros transmitidos (sí, eso es posible con un diseño FPGA). Hasta donde puedo decir, el Seagate HDD está listo para recibir los primeros 32 MiB de una transferencia en una sola pieza. Esta transferencia ocurre a una velocidad máxima de línea de 580 MiB / s. ¡Después de eso, el HDD detiene los bytes restantes por más de 800 ms! Luego, el HDD está listo para recibir los siguientes 32 MiB y se detiene nuevamente durante 800 ms. En general, una transferencia de 1 GiB necesita más de 30 segundos, lo que equivale a alrededor de 35 MiB / s.

Supongo que este HDD tiene una memoria caché de escritura de 32 MiB, que se vacía entre los ciclos de ráfaga. Las transferencias de datos con menos de 32 MiB no muestran este comportamiento.

Mi controlador utiliza el comando DMA-IN y DMA-OUT para transferir datos. No estoy usando los comandos QUEUED-DMA-IN y QUEUED-DMA-OUT, que son utilizados por los controladores AHCI con capacidad NCQ. La implementación de AHCI y NCQ en una plataforma FPGA es muy compleja y mi capa de aplicación no la necesita.

Me gustaría reproducir este escenario en mi PC con Linux, pero el controlador Linux AHCI tiene NCQ habilitado de forma predeterminada. Necesito deshabilitar NCQ, así que encontré este sitio web que describe cómo deshabilitar NCQ , pero no funciona.

La PC con Linux aún alcanza 190 miB / s de rendimiento de escritura.

> dd if=/dev/zero of=/dev/sdb bs=32M count=32
1073741824 bytes (1.1 GB) copied, 5.46148 s, 197 MB/s

Creo que hay un error en el artículo anterior: reducir la profundidad de la cola NCQ a 1 no deshabilita NCQ. Simplemente le permite al sistema operativo usar una sola cola. Todavía puede usar los comandos QUEUED-DMA - ** para la transferencia. Necesito deshabilitar realmente NCQ para que el controlador emita comandos DMA-IN / OUT al dispositivo.

Asi que aqui están mis preguntas:

  1. ¿Cómo puedo desactivar NCQ?
  2. Si la profundidad de la cola de NCQ = 1, ¿el controlador AHCI de Linux usa los comandos QUEUED-DMA - ** o DMA - **?
  3. ¿Cómo puedo verificar si NCQ está desactivado porque /sys/block/sdX/device/queue_depthno se informan los cambios dmesg?
Paebbels
fuente
3
parámetro del kernel libata.force=noncq?
frostschutz
Gracias, esto ayudó mucho, para deshabilitar completamente NCQ. También resolví el problema de rendimiento de escritura.
Paebbels
1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32No sé qué pretendías hacer con eso; pero será erasetanto el MBR como millones de bloques más allá. Hacer esto en una unidad con el sistema principal en ejecución (e grubinstalado en MBR, como en mi caso) sería bastante peligroso;) Pensé en escribir esto aquí como un comentario, para evitar que algunas personas menos experimentadas experimenten con your "cool" line ...;)
syntaxerror
@syntaxerror El HDD está conectado a una placa FPGA. En dicho entorno, es muy complejo escribir rutinas de hardware que manejen perfectamente los MBR y los accesos al sistema de archivos. Así que estoy usando el HDD como un medio en bruto en ambos lados. En la vista FPGA es una gran memoria lineal. En Linux estoy usando / dev / sdg y un programa C para leer y escribir los datos continuos.
Paebbels
@Paebbels Vaya, no debería haber pasado por alto el bit FPGA. Bueno, esto es de hecho algo completamente diferente a nuestros HDD comunes conectados a buses de placas base de PC de escritorio o portátiles ;-) "En un entorno así, es demasiado complejo escribir rutinas de hardware que manejen perfectamente MBR y accesos al sistema de archivos" . Cierto. No podrás prescindir de un HDL . Y puedo imaginar que programar tal cosa no es para los débiles de corazón ... a pesar de que el ejemplo del código de Wikipedia sugiere que es una caminata completa en el parque ;-)
syntaxerror

Respuestas:

11

Gracias a @frostschutz, pude medir el rendimiento de escritura en Linux sin la función NCQ. El parámetro de arranque del kernel libata.force=noncqdeshabilitó completamente NCQ.

Con respecto a mi problema de rendimiento de escritura Seagate 6TB, no hubo cambios en la velocidad. Linux todavía alcanza 180 MiB / s.

Pero luego tuve otra idea:
el controlador de Linux no usa transferencias de 32 fragmentos MiB. El búfer del núcleo es mucho más pequeño, especialmente si NCQ con 32 colas está habilitado (32 colas * 32 MiB => 1 búfer GiB AHCI).

Así que probé mi controlador SATA con 256 transferencias KiB y voilà, es posible alcanzar 185 MiB / s.

Así que supongo que el firmware Seagate ST6000AS0002 no es capaz de manejar grandes transferencias de ráfaga ATA. El estándar ATA permite hasta 65.536 bloques lógicos, lo que equivale a 32 MiB.

SMR - Grabación magnética escalonada

Otra posibilidad para el mal rendimiento de escritura podría ser la técnica de grabación magnética escalonada , que Seagate utiliza en estos dispositivos de archivo. Obviamente, provoqué un efecto raro con mi implementación de FPGA.

Paebbels
fuente
1
En mi experiencia, deshabilitar NCQ da un gran impulso en el rendimiento. He intentado esto en sistemas de escritorio, servidores, lo que sea. Incluso utilizando un hardware de alto rendimiento al 100% "servidor" que usted pensaría que se beneficiaría de NCQ. No, es peor que simplemente deshabilitarlo. En mi humilde opinión, NCQ es una de las peores cosas que le suceden a los discos duros. Nunca he visto que proporcione un beneficio bajo ninguna circunstancia, ya sea una tarjeta RAID dedicada o un conjunto de chips incorporado.
CR.
¿Has hecho operaciones de ráfaga o acceso aleatorio? NCQ no tiene impacto en las operaciones de ráfaga, pero mejora el acceso aleatorio.
Paebbels
Lo siento, pero no has respondido mi pregunta. Otra pregunta es, ¿qué hardware ha utilizado una placa base de consumo simple o una placa base de estación de trabajo / servidor o un controlador RAID dedicado? Muchas implementaciones no admiten tantas solicitudes pendientes como lo diseñó NCQ / AHCI.
Paebbels