Tôi đã triển khai Bộ chuyển đổi Bus-ATA Host-Bus (HBA) của riêng mình trong VHDL và lập trình nó lên một đồ họa. Một FPGA là chip có thể được lập trình với bất kỳ mạch kỹ thuật số nào. Nó cũng được trang bị bộ thu phát nối tiếp để tạo tín hiệu tốc độ cao cho SATA hoặc PCIe.
Bộ điều khiển SATA này hỗ trợ tốc độ dòng của SATA 6 Gb / s và sử dụng các lệnh ATA-8 DMA-IN / OUT để truyền dữ liệu trong tối đa 32 khối MiB đến và từ thiết bị. Thiết kế được chứng minh là hoạt động ở tốc độ tối đa (ví dụ: Samsung SSD 840 Pro -> trên 550 MiB / s).
Sau một số thử nghiệm với một số thiết bị SSD và HDD, tôi đã mua một ổ lưu trữ mới Seagate 6 TB Archive ( ST6000AS0002 ). Ổ cứng này đạt hiệu suất đọc lên tới 190 MiB / s, nhưng hiệu suất ghi chỉ từ 30 đến 40 MiB / s!
Vì vậy, tôi đã đào sâu hơn và đo các khung truyền đi (vâng, điều đó là có thể với thiết kế đồ họa). Theo như tôi có thể nói, Seagate HDD đã sẵn sàng để nhận 32 MiB đầu tiên của một lần chuyển trong một mảnh. Việc chuyển này xảy ra ở tốc độ dòng tối đa là 580 MiB / s. Sau đó, ổ cứng lưu trữ các byte còn lại trong hơn 800 ms! Sau đó, ổ cứng đã sẵn sàng để nhận 32 MiB tiếp theo và lưu trữ lại trong 800 ms. Tất cả trong tất cả một lần chuyển 1 GiB cần hơn 30 giây, tương đương với khoảng 35 MiB / s.
Tôi giả sử rằng ổ cứng này có bộ đệm ghi 32 MiB, được xóa giữa các chu kỳ nổ. Truyền dữ liệu với ít hơn 32 MiB không hiển thị hành vi này.
Bộ điều khiển của tôi sử dụng lệnh DMA-IN và DMA-OUT để truyền dữ liệu. Tôi không sử dụng lệnh QUEUED-DMA-IN và QUEUED-DMA-OUT, được sử dụng bởi các bộ điều khiển AHCI có khả năng NCQ. Việc thực hiện AHCI và NCQ trên nền tảng FPGA là rất phức tạp và không cần thiết cho lớp ứng dụng của tôi.
Tôi muốn tái tạo kịch bản này trên PC Linux của tôi, nhưng trình điều khiển AHCI Linux có NCQ được bật theo mặc định. Tôi cần phải tắt NCQ, vì vậy tôi đã tìm thấy trang web này mô tả cách tắt NCQ , nhưng nó không hoạt động.
Máy tính Linux vẫn đạt hiệu suất ghi 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
Tôi nghĩ rằng có một lỗi trong bài viết ở trên: Giảm độ sâu hàng đợi NCQ xuống 1 không vô hiệu hóa NCQ. Nó chỉ cho phép HĐH chỉ sử dụng một hàng đợi. Nó vẫn có thể sử dụng các lệnh QUEUED-DMA - ** để chuyển. Tôi thực sự cần phải vô hiệu hóa NCQ để trình điều khiển phát lệnh DMA-IN / OUT cho thiết bị.
Vì vậy, đây là những câu hỏi của tôi:
- Làm thế nào tôi có thể vô hiệu hóa NCQ?
- Nếu độ sâu hàng đợi NCQ = 1, trình điều khiển AHCI của Linux có sử dụng các lệnh QUEUED-DMA - ** hoặc DMA - ** không?
- Làm cách nào để kiểm tra xem NCQ có bị vô hiệu hóa không, vì thay đổi
/sys/block/sdX/device/queue_depth
không được báo cáo trongdmesg
?
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
Không có ý định làm gì với điều đó; nhưng nó sẽ erase
cả MBR và ánh mắt của các khối vượt ra ngoài. Làm điều này trên một ổ đĩa với hệ thống chính chạy trên nó (và grub
được cài đặt trên MBR, như trong trường hợp của tôi) sẽ khá nguy hiểm;) Tôi nghĩ rằng tôi viết điều này ở đây như một bình luận, để ngăn chặn một số người ít kinh nghiệm thử nghiệm với dòng "mát mẻ" của bạn ...;)
libata.force=noncq
?