Wie Sie NCQ unter Linux (wirklich) deaktivieren

13

Ich habe meinen eigenen Serial-ATA Host-Bus-Adapter (HBA) in VHDL implementiert und auf ein FPGA programmiert. Ein FPGA ist ein Chip, der mit jeder digitalen Schaltung programmiert werden kann. Es ist auch mit seriellen Transceivern ausgestattet, um Hochgeschwindigkeitssignale für SATA oder PCIe zu erzeugen.

Dieser SATA-Controller unterstützt SATA-Übertragungsraten von 6 Gbit / s und verwendet ATA-8-DMA-IN / OUT-Befehle, um Daten in bis zu 32 MiB-Blöcken zum und vom Gerät zu übertragen. Das Design arbeitet nachweislich mit maximaler Geschwindigkeit (z. B. Samsung SSD 840 Pro -> über 550 MiB / s).

Nach einigen Tests mit mehreren SSD- und HDD-Geräten habe ich eine neue Seagate 6 TB Archive-Festplatte ( ST6000AS0002 ) gekauft. Diese Festplatte erreicht eine Leseleistung von bis zu 190 MiB / s, aber nur eine Schreibleistung von 30 bis 40 MiB / s!

Also habe ich tiefer gegraben und die übertragenen Frames gemessen (ja, das ist mit einem FPGA-Design möglich). Soweit ich das beurteilen kann, ist die Seagate-Festplatte bereit, die ersten 32 MiB einer Übertragung in einem Stück zu empfangen. Diese Übertragung erfolgt mit einer maximalen Liniengeschwindigkeit von 580 MiB / s. Danach blockiert die Festplatte die verbleibenden Bytes für mehr als 800 ms! Dann ist die Festplatte bereit, die nächsten 32 MiB zu empfangen und bleibt 800 ms lang stehen. Alles in allem dauert eine 1-GiB-Übertragung über 30 Sekunden, was ca. 35 MiB / s entspricht.

Ich gehe davon aus, dass diese Festplatte einen 32-MiB-Schreibcache hat, der zwischen den Burst-Zyklen gespült wird. Datenübertragungen mit weniger als 32 MiB zeigen dieses Verhalten nicht.

Mein Controller verwendet die Befehle DMA-IN und DMA-OUT, um Daten zu übertragen. Ich verwende nicht die Befehle QUEUED-DMA-IN und QUEUED-DMA-OUT, die von NCQ-fähigen AHCI-Controllern verwendet werden. Die Implementierung von AHCI und NCQ auf einer FPGA-Plattform ist sehr komplex und wird von meiner Anwendungsebene nicht benötigt.

Ich möchte dieses Szenario auf meinem Linux-PC reproduzieren, aber der Linux-AHCI-Treiber hat standardmäßig NCQ aktiviert. Ich muss NCQ deaktivieren, daher habe ich auf dieser Website erfahren, wie man NCQ deaktiviert , aber es funktioniert nicht.

Der Linux-PC erreicht immer noch eine Schreibgeschwindigkeit von 190 MiB / s.

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

Ich denke, es gibt einen Fehler in dem Artikel von oben: Das Reduzieren der NCQ-Warteschlangentiefe auf 1 deaktiviert NCQ nicht. Es erlaubt dem Betriebssystem nur, nur eine Warteschlange zu verwenden. Es kann weiterhin QUEUED-DMA - ** - Befehle für die Übertragung verwenden. Ich muss NCQ wirklich deaktivieren, damit der Treiber DMA-IN / OUT-Befehle an das Gerät ausgibt.

Also hier sind meine Fragen:

  1. Wie kann ich NCQ deaktivieren?
  2. Wenn die Tiefe der NCQ-Warteschlange = 1 ist, verwendet der AHCI-Treiber von Linux die Befehle QUEUED-DMA - ** oder DMA - **?
  3. Wie kann ich überprüfen, ob NCQ deaktiviert ist, da Änderungen /sys/block/sdX/device/queue_depthnicht in gemeldet werden dmesg?
Paebbels
quelle
3
Kernel-Parameter libata.force=noncq?
Frostschutz
Vielen Dank, das hat sehr geholfen, NCQ komplett zu deaktivieren. Ich habe auch das Problem mit der Schreibleistung gelöst.
Paebbels
1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Keine Ahnung, was Sie damit vorhatten; aber es wird erasesowohl den MBR als auch Millionen von Blöcken jenseits. Dies auf einem Laufwerk zu tun, auf dem das Hauptsystem läuft (und grubdas wie in meinem Fall auf MBR installiert ist), wäre ziemlich gefährlich. Ich dachte, ich schreibe dies hier als Kommentar, um zu verhindern, dass weniger erfahrene Leute damit experimentieren Ihre "coole" Linie ...;)
Syntaxfehler
@syntaxerror Die Festplatte ist an eine FPGA-Karte angeschlossen. In einer solchen Umgebung ist es viel zu komplex, Hardwareroutinen zu schreiben, die MBRs und Dateisystemzugriffe perfekt verarbeiten. Ich verwende die Festplatte also auf beiden Seiten als Rohmedium. In der FPGA-Ansicht handelt es sich um einen großen linearen Speicher. Unter Linux verwende ich / dev / sdg und ein C-Programm, um die Fortsetzungsdaten zu lesen und zu schreiben.
Paebbels
@Paebbels Hoppla, ich hätte das FPGA-Bit nicht übersehen sollen. Nun, das ist in der Tat etwas völlig anderes als unsere herkömmlichen Festplatten, die an Busse von Mainboards von Desktop-PCs oder Notebooks angeschlossen sind. "In einer solchen Umgebung ist es viel zu komplex, Hardwareroutinen zu schreiben, die MBRs und Dateisystemzugriffe perfekt verarbeiten . " Wahr. Ohne HDL geht es nicht . Und ich kann mir vorstellen, dass das Programmieren nichts für schwache Nerven ist ... obwohl das Wikipedia-Codebeispiel darauf hindeutet, dass es ein völliger Spaziergang im Park ist ;-)
Syntaxfehler

Antworten:

11

Dank @frostschutz konnte ich die Schreibleistung unter Linux ohne NCQ-Funktion messen. Der Kernel-Boot-Parameter hat libata.force=noncqNCQ vollständig deaktiviert.

Bei meinem Seagate 6TB-Schreibleistungsproblem wurde die Geschwindigkeit nicht geändert. Linux erreicht immer noch 180 MiB / s.

Aber dann hatte ich eine andere Idee:
Der Linux-Treiber verwendet keine Übertragungen von 32-MiB-Chunks. Der Kernel-Puffer ist viel kleiner, insbesondere wenn NCQ mit 32 Warteschlangen aktiviert ist (32 Warteschlangen * 32 MiB => 1 GiB AHCI-Puffer).

Also habe ich meinen SATA-Controller mit 256 KiB Transfers getestet und voilà, es ist möglich 185 MiB / s zu erreichen.

Ich vermute, die Firmware des Seagate ST6000AS0002 kann keine großen ATA-Burst-Übertragungen verarbeiten. Der ATA-Standard erlaubt bis zu 65.536 logische Blöcke, was 32 MiB entspricht.

SMR - Shingled Magnetic Recording

Eine andere Möglichkeit für die schlechte Schreibleistung könnte die Technik der geschuppten Magnetaufzeichnung sein , die von Seagate in diesen Archivgeräten verwendet wird. Offensichtlich habe ich mit meiner FPGA-Implementierung einen seltenen Effekt ausgelöst.

Paebbels
quelle
1
Nach meiner Erfahrung führt das Deaktivieren von NCQ zu einer erheblichen Leistungssteigerung. Ich habe dies auf Desktop-Systemen und Servern versucht, wie Sie es nennen. Selbst wenn Sie eine 100% ige "Server" -Hochleistungshardware verwenden, von der Sie denken, dass sie von NCQ profitieren würde. Nein, es ist alles das Schlimmste, als es nur zu deaktivieren. IMHO NCQ ist eines der schlimmsten Dinge, die Festplatten passieren. Ich habe noch nie gesehen, dass es unter keinen Umständen Vorteile bringt, sei es eine dedizierte RAID-Karte oder ein On-Board-Chipsatz.
CR.
Haben Sie Burst-Operationen oder Direktzugriff durchgeführt? NCQ hat keine Auswirkungen auf Burst-Operationen, verbessert jedoch den Direktzugriff.
Paebbels
Entschuldigung, aber Sie haben meine Frage nicht beantwortet. Eine andere Frage ist, welche Hardware Sie für ein einfaches Consumer-Mainboard oder ein Workstation / Server-Mainboard oder einen dedizierten RAID-Controller verwendet haben. Viele Implementierungen unterstützen nicht so viele ausstehende Anforderungen, wie von NCQ / AHCI entworfen.
Paebbels