Jak (naprawdę) wyłączyć NCQ w Linuksie

13

Zaimplementowałem własny adapter Serial-ATA Host-Bus-Adapter (HBA) w VHDL i zaprogramowałem go na FPGA. FPGA to układ, który można zaprogramować za pomocą dowolnego obwodu cyfrowego. Jest również wyposażony w szeregowe urządzenia nadawczo-odbiorcze do generowania sygnałów wysokiej prędkości dla SATA lub PCIe.

Ten kontroler SATA obsługuje prędkości linii SATA 6 Gb / s i wykorzystuje polecenia ATA-8 DMA-IN / OUT do przesyłania danych do 32 porcji MiB do i z urządzenia. Udowodniono, że konstrukcja działa z maksymalną prędkością (np. Samsung SSD 840 Pro -> ponad 550 MiB / s).

Po kilku testach z kilkoma urządzeniami SSD i HDD kupiłem nowy dysk twardy Seagate 6 TB Archive HDD ( ST6000AS0002 ). Ten dysk twardy osiąga prędkość odczytu do 190 MiB / s, ale tylko 30 do 40 MiB / s!

Więc kopałem głębiej i mierzyłem przesyłane klatki (tak, jest to możliwe przy konstrukcji FPGA). O ile mi wiadomo, dysk twardy Seagate jest gotowy do odbioru pierwszych 32 MB transferu w jednym kawałku. Transfer ten odbywa się przy maksymalnej prędkości linii wynoszącej 580 MiB / s. Następnie dysk twardy wstrzymuje pozostałe bajty na ponad 800 ms! Następnie dysk twardy jest gotowy na przyjęcie kolejnych 32 MiB i zatrzymuje się ponownie na 800 ms. W sumie transfer 1 GiB wymaga ponad 30 sekund, co odpowiada około 35 MiB / s.

Zakładam, że ten dysk twardy ma pamięć podręczną zapisu 32 MiB, która jest wprowadzana pomiędzy cyklami zdjęć seryjnych. Przesyłanie danych z mniej niż 32 MiB nie wykazuje tego zachowania.

Mój kontroler używa DMA-IN i DMA-OUT do przesyłania danych. Nie używam poleceń QUEUED-DMA-IN i QUEUED-DMA-OUT, które są używane przez kontrolery AHCI obsługujące NCQ. Wdrożenie AHCI i NCQ na platformie FPGA jest bardzo złożone i nie jest potrzebne mojej warstwie aplikacji.

Chciałbym odtworzyć ten scenariusz na moim komputerze z systemem Linux, ale sterownik Linux AHCI ma domyślnie włączone NCQ. Muszę wyłączyć NCQ, więc znalazłem tę stronę z opisem, jak wyłączyć NCQ , ale to nie działa.

Komputer z systemem Linux nadal osiąga wydajność zapisu 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

Myślę, że w powyższym artykule jest błąd: zmniejszenie głębokości kolejki NCQ do 1 nie wyłącza NCQ. Pozwala to systemowi operacyjnemu na użycie tylko jednej kolejki. Nadal może używać do przesyłania poleceń QUEUED-DMA - **. Naprawdę muszę wyłączyć NCQ, więc sterownik wydaje polecenia DMA-IN / OUT do urządzenia.

Oto moje pytania:

  1. Jak mogę wyłączyć NCQ?
  2. Jeśli głębokość kolejki NCQ = 1, czy sterownik AHCI systemu Linux używa poleceń QUEUED-DMA - ** lub DMA - **?
  3. Jak mogę sprawdzić, czy NCQ jest wyłączone, ponieważ zmiana /sys/block/sdX/device/queue_depthnie jest zgłaszana w dmesg?
Paebbels
źródło
3
parametr jądra libata.force=noncq?
frostschutz
Dzięki, bardzo pomogło to całkowicie wyłączyć NCQ. Rozwiązałem również problem z wydajnością zapisu.
Paebbels,
1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Nie wiem, co zamierzałeś z tym zrobić; ale będzie to erasezarówno MBR, jak i gazilliony bloków dalej. Robienie tego na dysku z uruchomionym na nim głównym systemem (i grubzainstalowanym na MBR, jak w moim przypadku) byłoby dość niebezpieczne;) Myślałem, że napiszę to tutaj jako komentarz, aby uniemożliwić niektórym mniej doświadczonym ludziom eksperymentowanie z twoja „fajna” linia ...;)
składniaerror
@syntaxerror Dysk twardy jest podłączony do karty FPGA. W takim środowisku pisanie procedur sprzętowych, które doskonale obsługują MBR i asysty systemu plików, jest zbyt skomplikowane. Tak więc używam HDD jako surowego nośnika po obu stronach. W widoku FPGA jest to duża pamięć liniowa. W Linuksie używam / dev / sdg i programu C do odczytu i zapisu danych ciągłych.
Paebbels,
@Paebbels Ups, nie powinienem przeoczyć bitu FPGA. Cóż, to rzeczywiście coś zupełnie innego niż nasze popularne dyski twarde podłączone do magistrali płyt głównych komputerów stacjonarnych lub notebooków ;-) „W takim środowisku pisanie procedur sprzętowych, które doskonale radzą sobie z MBR i dostępami do systemu plików, jest zbyt skomplikowane” . Prawdziwe. Nie będziesz w stanie obejść się bez HDL . I mogę sobie wyobrazić, że programowanie takich rzeczy nie jest dla osób o słabym sercu ... chociaż przykład kodu z Wikipedii sugeruje, że jest to całkowity spacer po parku ;-)
syntaxerror

Odpowiedzi:

11

Dzięki @frostschutz mogłem zmierzyć wydajność zapisu w systemie Linux bez funkcji NCQ. Parametr rozruchowy jądra libata.force=noncqcałkowicie wyłączył NCQ.

Jeśli chodzi o mój problem z wydajnością zapisu Seagate 6 TB, prędkość nie uległa zmianie. Linux wciąż osiąga 180 MiB / s.

Ale potem wpadłem na inny pomysł:
sterownik Linuksa nie wykorzystuje transferu 32 porcji MiB. Bufor jądra jest znacznie mniejszy, szczególnie jeśli włączone jest NCQ z 32 kolejkami (32 kolejki * 32 MiB => 1 GiB bufor AHCI).

Przetestowałem więc mój kontroler SATA z 256 transferami KiB i voilà, możliwe jest osiągnięcie 185 MiB / s.

Myślę, że oprogramowanie Seagate ST6000AS0002 nie jest w stanie obsłużyć dużych transferów serii ATA. Standard ATA dopuszcza do 65.536 bloków logicznych, co odpowiada 32 MiB.

SMR - Shingled Magnetic Recording

Inną możliwością złej wydajności zapisu może być gontowa technika zapisu magnetycznego , którą Seagate stosuje w tych urządzeniach archiwizujących. Oczywiście wywołałem rzadki efekt w mojej implementacji FPGA.

Paebbels
źródło
1
Z mojego doświadczenia wynika, że ​​wyłączenie NCQ daje duży wzrost wydajności. Próbowałem tego na komputerach stacjonarnych, serwerach, nazywacie to. Nawet przy użyciu w 100% „serwerowego” wysokowydajnego sprzętu, który Twoim zdaniem mógłby skorzystać z NCQ. Nie, wszystko jest najgorsze niż tylko wyłączenie. IMHO NCQ to jedna z najgorszych rzeczy, jakie mogą się przydarzyć dyskom twardym. Nigdy nie widziałem, aby przynosiło to korzyści w żadnych okolicznościach, czy to dedykowana karta RAID, czy wbudowany mikroukład.
CR.
Czy wykonałeś już operacje rozerwania lub dostępu losowego? NCQ nie ma wpływu na operacje serii, ale poprawia losowy dostęp.
Paebbels
Przepraszam, ale nie odpowiedziałeś na moje pytanie. Innym pytaniem jest, na jakim sprzęcie użyłeś prostej płyty głównej konsumenta, płyty głównej stacji roboczej / serwera lub dedykowanego kontrolera RAID. Wiele implementacji nie obsługuje tylu zaległych żądań, jakie zaprojektował NCQ / AHCI.
Paebbels,