Ho implementato il mio adattatore Serial-ATA Host-Bus-Adapter (HBA) in VHDL e programmato su un FPGA. Un FPGA è un chip che può essere programmato con qualsiasi circuito digitale. È inoltre dotato di ricetrasmettitori seriali per generare segnali ad alta velocità per SATA o PCIe.
Questo controller SATA supporta velocità di linea SATA 6 Gb / s e utilizza i comandi DMA-IN / OUT ATA-8 per trasferire i dati in un massimo di 32 blocchi MiB da e verso il dispositivo. Il design ha dimostrato di funzionare alla massima velocità (ad esempio Samsung SSD 840 Pro -> oltre 550 MiB / s).
Dopo alcuni test con diversi dispositivi SSD e HDD, ho acquistato un nuovo HDD per archivio Seagate da 6 TB ( ST6000AS0002 ). Questo HDD raggiunge fino a 190 MiB / s in lettura, ma solo da 30 a 40 MiB / s in scrittura!
Quindi ho approfondito e misurato i frame trasmessi (sì, è possibile con un design FPGA). Per quanto ne so, l'HDD Seagate è pronto a ricevere i primi 32 MiB di un trasferimento in un unico pezzo. Questo trasferimento avviene alla velocità massima della linea di 580 MiB / s. Successivamente, l'HDD blocca i byte rimanenti per oltre 800 ms! Quindi l'HDD è pronto per ricevere i successivi 32 MiB e si blocca di nuovo per 800 ms. Tutto sommato, un trasferimento di 1 GiB richiede oltre 30 secondi, il che equivale a circa 35 MiB / s.
Presumo che questo HDD abbia una cache di scrittura da 32 MiB, che viene scaricata tra i cicli di burst. I trasferimenti di dati con meno di 32 MiB non mostrano questo comportamento.
Il mio controller utilizza il comando DMA-IN e DMA-OUT per trasferire i dati. Non sto usando il comando QUEUED-DMA-IN e QUEUED-DMA-OUT, che sono utilizzati dai controller AHCI compatibili con NCQ. Il completamento di AHCI e NCQ su una piattaforma FPGA è molto complesso e non è necessario per il mio livello di applicazione.
Vorrei riprodurre questo scenario sul mio PC Linux, ma il driver Linux AHCI ha NCQ abilitato per impostazione predefinita. Devo disabilitare NCQ, quindi ho trovato questo sito Web che descrive come disabilitare NCQ , ma non funziona.
Il PC Linux raggiunge ancora 190 MiB / s di prestazioni di scrittura.
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
1073741824 bytes (1.1 GB) copied, 5.46148 s, 197 MB/s
Penso che ci sia un errore nell'articolo sopra: Ridurre la profondità della coda NCQ a 1 non disabilita NCQ. Permette solo al sistema operativo di utilizzare solo una coda. Può ancora utilizzare i comandi QUEUED-DMA - ** per il trasferimento. Devo disabilitare davvero NCQ in modo che il driver emetta comandi DMA-IN / OUT sul dispositivo.
Quindi, ecco le mie domande:
- Come posso disabilitare NCQ?
- Se la profondità della coda NCQ = 1, il driver AHCI di Linux utilizza i comandi QUEUED-DMA - ** o DMA - **?
- Come posso verificare se NCQ è disabilitato, perché la modifica
/sys/block/sdX/device/queue_depth
non è segnalata indmesg
?
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
Non so cosa intendevi fare con quello; ma sarà erase
sia l' MBR che i milioni di blocchi oltre. Farlo su un'unità con il sistema principale in esecuzione (e grub
installato su MBR, come nel mio caso) sarebbe abbastanza pericoloso;) Pensavo di scriverlo qui come commento, per impedire ad alcune persone meno esperte di sperimentare your "cool" line ...;)
libata.force=noncq
?