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:
- Bagaimana saya bisa menonaktifkan NCQ?
- Jika kedalaman antrian NCQ = 1, apakah driver AHCI Linux menggunakan perintah QUEUED-DMA - ** atau DMA - **?
- Bagaimana saya dapat memeriksa apakah NCQ dinonaktifkan, karena perubahan
/sys/block/sdX/device/queue_depth
tidak dilaporkandmesg
?
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
Entah apa yang ingin Anda lakukan dengan itu; tetapi itu akan erase
baik MBR dan gazillions blok di luar. Melakukan ini pada drive dengan sistem utama berjalan di atasnya (dan grub
diinstal 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 ...;)
libata.force=noncq
?