Cara (benar-benar) menonaktifkan NCQ di Linux

13

Saya menerapkan Serial-ATA Host-Bus-Adapter (HBA) saya di VHDL dan memprogramnya ke FPGA. FPGA adalah chip yang dapat diprogram dengan sirkuit digital apa pun. Ini juga dilengkapi dengan transceiver serial untuk menghasilkan sinyal kecepatan tinggi untuk SATA atau PCIe.

Pengontrol SATA ini mendukung laju garis SATA 6 Gb / s dan menggunakan perintah ATA-8 DMA-IN / OUT untuk mentransfer data hingga 32 keping MiB ke dan dari perangkat. Desainnya terbukti bekerja pada kecepatan maksimum (mis. Samsung SSD 840 Pro -> lebih dari 550 MiB / s).

Setelah beberapa pengujian dengan beberapa perangkat SSD dan HDD, saya membeli Seagate 6 TB Archive HDD ( ST6000AS0002 ) baru. HDD ini mencapai hingga 190 MiB / s kinerja baca, tetapi hanya 30 hingga 40 MiB / s kinerja tulis!

Jadi saya menggali lebih dalam dan mengukur frame yang ditransmisikan (ya itu mungkin dengan desain FPGA). Sejauh yang saya tahu, Seagate HDD siap untuk menerima 32 MiB transfer pertama dalam keadaan utuh. Transfer ini terjadi pada kecepatan garis maksimum 580 MiB / s. Setelah itu, HDD menghentikan byte yang tersisa selama lebih dari 800 ms! Kemudian HDD siap untuk menerima 32 MiB berikutnya dan berhenti lagi untuk 800 ms. Semua dalam semua transfer 1 GiB membutuhkan lebih dari 30 detik, yang sama dengan sekitar 35 MiB / s.

Saya berasumsi bahwa HDD ini memiliki cache tulis 32 MiB, yang memerah di antara siklus burst. Transfer data dengan kurang dari 32 MiB tidak menunjukkan perilaku ini.

Pengontrol saya menggunakan perintah DMA-IN dan DMA-OUT untuk mentransfer data. Saya tidak menggunakan perintah QUEUED-DMA-IN dan QUEUED-DMA-OUT, yang digunakan oleh NCQ yang mampu mengendalikan AHCI. Menerapkan AHCI dan NCQ pada platform FPGA sangat kompleks dan tidak diperlukan oleh lapisan aplikasi saya.

Saya ingin mereproduksi skenario ini pada PC Linux saya, tetapi driver AHCI Linux memiliki NCQ diaktifkan secara default. Saya perlu menonaktifkan NCQ, jadi saya menemukan situs web ini menjelaskan cara menonaktifkan NCQ , tetapi tidak berfungsi.

PC Linux masih mencapai kinerja penulisan 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

Saya pikir ada kesalahan dalam artikel dari atas: Mengurangi kedalaman antrian NCQ ke 1 tidak menonaktifkan NCQ. Itu hanya memungkinkan OS yang digunakan hanya satu antrian. Masih dapat menggunakan perintah QUEUED-DMA - ** untuk transfer. Saya harus benar-benar menonaktifkan NCQ sehingga driver mengeluarkan perintah DMA-IN / OUT ke perangkat.

Jadi inilah pertanyaanku:

  1. Bagaimana saya bisa menonaktifkan NCQ?
  2. Jika kedalaman antrian NCQ = 1, apakah driver AHCI Linux menggunakan perintah QUEUED-DMA - ** atau DMA - **?
  3. Bagaimana saya dapat memeriksa apakah NCQ dinonaktifkan, karena perubahan /sys/block/sdX/device/queue_depthtidak dilaporkan dmesg?
Paebbels
sumber
3
parameter kernel libata.force=noncq?
frostschutz
Terima kasih, ini banyak membantu, untuk menonaktifkan NCQ sepenuhnya. Saya juga memecahkan masalah kinerja penulisan.
Paebbels
1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Entah apa yang ingin Anda lakukan dengan itu; tetapi itu akan erasebaik MBR dan gazillions blok di luar. Melakukan ini pada drive dengan sistem utama berjalan di atasnya (dan grubdiinstal pada MBR, seperti dalam kasus saya) akan cukup berbahaya;) Saya pikir saya akan menulis ini di sini sebagai komentar, untuk mencegah beberapa orang yang kurang berpengalaman dari bereksperimen dengan baris "keren" Anda ...;)
syntaxerror
@syntaxerror HDD terhubung ke papan FPGA. Dalam lingkungan seperti itu, jauh dari rumit untuk menulis rutin perangkat keras yang secara sempurna menangani MBR dan akses sistem file. Jadi saya menggunakan HDD sebagai media mentah di kedua sisi. Dalam tampilan FPGA itu adalah memori linier besar. Di Linux saya menggunakan / dev / sdg dan program C untuk membaca dan menulis data yang berlanjut.
Paebbels
@ Paebbels Ups, saya seharusnya tidak mengabaikan bit FPGA. Nah, ini memang sesuatu yang sangat berbeda dengan HDD umum kita yang terhubung ke bus mainboard PC desktop atau notebook ;-) "Dalam lingkungan seperti itu, jauh dari rumit untuk menulis rutin perangkat keras yang secara sempurna menangani MBR dan akses sistem file" . Benar. Anda tidak akan dapat melakukannya tanpa HDL . Dan saya dapat membayangkan bahwa pemrograman hal seperti itu bukan untuk orang yang lemah hati ... meskipun contoh kode Wikipedia menunjukkan bahwa itu adalah jalan yang benar-benar berjalan di taman ;-)
syntaxerror

Jawaban:

11

Berkat @frostschutz, saya dapat mengukur kinerja penulisan di Linux tanpa fitur NCQ. Parameter boot kernel libata.force=noncqmenonaktifkan NCQ sepenuhnya.

Mengenai masalah kinerja penulisan Seagate 6TB saya, tidak ada perubahan dalam kecepatan. Linux masih mencapai 180 MiB / s.

Tapi kemudian saya punya ide lain:
Driver Linux tidak menggunakan transfer dari 32 MiB chunks. Buffer kernel jauh lebih kecil, terutama jika NCQ dengan 32 antrian diaktifkan (32 antrian * 32 MiB => 1 GiB AHCI buffer).

Jadi saya menguji pengontrol SATA saya dengan transfer 256 KiB dan voa, mungkin mencapai 185 MiB / s.

Jadi saya kira firmware Seagate ST6000AS0002 tidak mampu menangani transfer burst ATA besar. Standar ATA memungkinkan hingga 65,536 blok logis, yang sama dengan 32 MiB.

SMR - Shingled Magnetic Recording

Kemungkinan lain untuk kinerja penulisan yang buruk adalah teknik perekaman magnetik shingled , yang digunakan oleh Seagate di perangkat arsip ini. Jelas, saya memicu efek langka dengan implementasi FPGA saya.

Paebbels
sumber
1
Dalam pengalaman saya, menonaktifkan NCQ memberi dorongan besar dalam kinerja. Saya sudah mencoba ini pada sistem desktop, server, sebut saja. Bahkan menggunakan 100% "server" perangkat keras berkinerja tinggi yang Anda pikir akan mendapat manfaat dari NCQ. Tidak, itu semua terburuk daripada hanya menonaktifkannya. IMHO NCQ adalah salah satu hal terburuk yang terjadi pada hard drive. Saya belum pernah melihatnya memberikan manfaat dalam keadaan apa pun, baik itu kartu RAID khusus atau chipset on-board.
CR.
Sudahkah Anda melakukan operasi burst atau akses acak? NCQ tidak berdampak pada operasi burst tetapi meningkatkan akses acak.
Paebbels
Maaf, tetapi Anda belum menjawab pertanyaan saya. Pertanyaan lain adalah, perangkat keras apa yang Anda gunakan menggunakan mainboard konsumen sederhana atau workstation / server mainboard atau pengontrol RAID khusus. Banyak implementasi yang tidak mendukung sebanyak mungkin permintaan yang dirancang oleh NCQ / AHCI.
Paebbels