Come disabilitare (realmente) NCQ in Linux


13

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:

  1. Come posso disabilitare NCQ?
  2. Se la profondità della coda NCQ = 1, il driver AHCI di Linux utilizza i comandi QUEUED-DMA - ** o DMA - **?
  3. Come posso verificare se NCQ è disabilitato, perché la modifica /sys/block/sdX/device/queue_depthnon è segnalata in dmesg?

3
parametro del kernel libata.force=noncq?
frostschutz,

Grazie, questo mi ha aiutato molto a disabilitare completamente NCQ. Ho anche risolto il problema delle prestazioni di scrittura.
Paebbels,

1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Non so cosa intendevi fare con quello; ma sarà erasesia l' MBR che i milioni di blocchi oltre. Farlo su un'unità con il sistema principale in esecuzione (e grubinstallato 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 ...;)
syntaxerror

@syntaxerror L'HDD è collegato a una scheda FPGA. In un tale ambiente è troppo complesso scrivere routine hardware che gestiscono perfettamente MBR e accessi al file system. Quindi sto usando l'HDD come supporto non elaborato su entrambi i lati. Nella vista FPGA è una grande memoria lineare. In Linux sto usando / dev / sdg e un programma C per leggere e scrivere i dati continui.
Paebbels,

@Paebbels Oops, non avrei dovuto trascurare il bit FPGA. Bene, questo è davvero qualcosa di completamente diverso dai nostri comuni HDD collegati a bus di schede madri di PC desktop o notebook ;-) "In un tale ambiente è fin troppo complesso scrivere routine hardware che gestiscono perfettamente MBR e accessi al file system" . Vero. Non potrai fare a meno di un HDL . E posso immaginare che programmare una cosa del genere non sia per i deboli di cuore ... anche se l'esempio del codice di Wikipedia suggerisce che è una passeggiata totale nel parco ;-)
syntaxerror

Risposte:


11

Grazie a @frostschutz, ho potuto misurare le prestazioni di scrittura in Linux senza funzionalità NCQ. Il parametro di avvio del kernel ha libata.force=noncqdisabilitato completamente NCQ.

Per quanto riguarda il mio problema di prestazioni di scrittura da 6 TB Seagate, non vi è stato alcun cambiamento nella velocità. Linux raggiunge ancora 180 MiB / s.

Ma poi ho avuto un'altra idea:
il driver Linux non utilizza trasferimenti di 32 blocchi MiB. Il buffer del kernel è molto più piccolo, specialmente se è abilitato NCQ con 32 code (32 code * 32 MiB => 1 GiB buffer AHCI).

Quindi ho testato il mio controller SATA con 256 KiB trasferimenti e voilà, è possibile raggiungere 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, che equivalgono a 32 MiB.

SMR - Registrazione magnetica a strati

Un'altra possibilità per le cattive prestazioni di scrittura potrebbe essere la tecnica di registrazione magnetica a strati , utilizzata da Seagate in questi dispositivi di archiviazione. Ovviamente, ho attivato un effetto raro con la mia implementazione FPGA.


1
Nella mia esperienza, la disabilitazione di NCQ offre un notevole incremento delle prestazioni. Ho provato questo su sistemi desktop, server, lo chiami. Anche usando l'hardware ad alte prestazioni "server" al 100% che si potrebbe pensare di trarre vantaggio da NCQ. No, è tutto peggio che disabilitarlo. IMHO NCQ è una delle cose peggiori che accadono ai dischi rigidi. Non ho mai visto una volta fornire un vantaggio in nessuna circostanza, che si tratti di una scheda RAID dedicata o di un chipset integrato.
CR.

Hai fatto operazioni a raffica o accesso casuale? NCQ non ha alcun impatto sulle operazioni di scoppio ma migliora l'accesso casuale.
Paebbels

Scusa, ma non hai risposto alla mia domanda. Un'altra domanda è: quale hardware hai utilizzato una semplice scheda madre consumer o una scheda madre workstation / server o controller RAID dedicato. Molte implementazioni non supportano tutte le richieste in sospeso progettate da NCQ / AHCI.
Paebbels,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.