Grazie a @frostschutz, ho potuto misurare le prestazioni di scrittura in Linux senza la funzione NCQ. Il parametro di avvio del kernel libata.force=noncq
disabilitato completamente NCQ.
Per quanto riguarda il mio problema di prestazioni di scrittura da 6 TB di Seagate, non ci sono stati cambiamenti nella velocità. Linux raggiunge ancora 180 MiB/s.
Ma poi ho avuto un'altra idea:
Il driver Linux non utilizza trasferimenti di blocchi da 32 MiB. Il buffer del kernel è molto più piccolo, specialmente se NCQ con 32 code è abilitato (32 code * 32 MiB => 1 GiB di buffer AHCI).
Quindi ho testato il mio controller SATA con trasferimenti da 256 KiB e voilà, è possibile raggiungere i 185 MiB/s.
Quindi immagino che il firmware Seagate ST6000AS0002 non sia in grado di gestire grandi trasferimenti burst ATA. Lo standard ATA consente fino a 65.536 blocchi logici, pari a 32 MiB.
SMR - Registrazione magnetica scandolata
Un'altra possibilità per le cattive prestazioni di scrittura potrebbe essere la tecnica di registrazione magnetica a scandole, utilizzata da Seagate in questi dispositivi di archiviazione. Ovviamente, ho attivato un raro effetto con la mia implementazione FPGA.
Impostando la profondità della coda su 1 (/sys/block/sd*/device/queue_depth
) disabilita NCQ, non è necessario utilizzare il parametro del kernel libata.force=noncq
(che può essere impostato solo all'avvio).
commit 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.