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?

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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.