Gracias a @frostschutz, pude medir el rendimiento de escritura en Linux sin la función NCQ. El parámetro de arranque del núcleo libata.force=noncq
deshabilitó NCQ por completo.
Con respecto a mi problema de rendimiento de escritura de Seagate 6TB, no hubo cambios en la velocidad. Linux aún alcanza los 180 MiB/s.
Pero luego tuve otra idea:
El controlador de Linux no utiliza transferencias de fragmentos de 32 MiB. El búfer del kernel es mucho más pequeño, especialmente si está habilitado NCQ con 32 colas (32 colas * 32 MiB => 1 GiB AHCI de búfer).
Así que probé mi controlador SATA con transferencias de 256 KiB y voilà, es posible llegar a 185 MiB/s.
Así que supongo que el firmware Seagate ST6000AS0002 no es capaz de manejar grandes transferencias de ráfagas ATA. El estándar ATA permite hasta 65.536 bloques lógicos, lo que equivale a 32 MiB.
SMR - Grabación magnética con tejas
Otra posibilidad para el mal rendimiento de escritura podría ser la técnica de grabación magnética shingled, que utiliza Seagate en estos dispositivos de archivo. Obviamente, desencadené un efecto raro con mi implementación de FPGA.
Establecer la profundidad de la cola en 1 (/sys/block/sd*/device/queue_depth
) deshabilita NCQ, no es necesario usar el parámetro del kernel libata.force=noncq
(que solo se puede configurar en el arranque).
confirmar 360f654e7cda850034f3f6252a7a7cff3fa77356
Date: Sat Sep 30 19:45:00 2006 +0900
[PATCH] libata: turn off NCQ if queue depth is adjusted to 1
Turn off NCQ if queue depth is adjusted to 1.