Cách (thực sự) vô hiệu hóa NCQ trong Linux


13

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:

  1. Làm thế nào tôi có thể vô hiệu hóa NCQ?
  2. 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?
  3. 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_depthkhông được báo cáo trong dmesg?

3
tham số kernel libata.force=noncq?
frostschutz

Cảm ơn, điều này đã giúp rất nhiều, để vô hiệu hóa NCQ hoàn toàn. Tôi cũng giải quyết vấn đề hiệu suất viết.
Paebbels

1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Không có ý định làm gì với điều đó; nhưng nó sẽ erasecả 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 ...;)
cú pháp

@syntaxerror Ổ cứng được kết nối với bo mạch đồ họa. Trong một môi trường như vậy, thật phức tạp để viết các thói quen phần cứng xử lý hoàn hảo MBR và các hệ thống tệp. Vì vậy, tôi đang sử dụng ổ cứng như một phương tiện truyền thông thô ở cả hai bên. Trong khung nhìn FPGA, nó là một bộ nhớ tuyến tính lớn. Trong Linux, tôi đang sử dụng / dev / sdg và chương trình C để đọc và ghi dữ liệu tiếp tục.
Paebbels

@Paebbels Rất tiếc, tôi không nên bỏ qua bit FPGA. Chà, đây thực sự là một cái gì đó hoàn toàn khác với các ổ cứng thông thường của chúng tôi được kết nối với các bus của máy tính để bàn hoặc máy tính xách tay ;-) "Trong một môi trường như vậy, việc viết các thói quen phần cứng xử lý hoàn hảo MBRs và hệ thống tập tin" là rất phức tạp . Thật. Bạn sẽ không thể làm gì nếu không có HDL . Và tôi có thể tưởng tượng rằng việc lập trình những thứ như vậy không dành cho người yếu tim ... mặc dù ví dụ về mã Wikipedia cho thấy rằng đó là một cuộc dạo chơi hoàn toàn trong công viên ;-)
cú pháp

Câu trả lời:


11

Nhờ @frostschutz, tôi có thể đo hiệu suất ghi trong Linux mà không cần tính năng NCQ. Tham số khởi động kernel đã libata.force=noncqtắt NCQ hoàn toàn.

Về vấn đề hiệu suất ghi Seagate 6TB của tôi, không có thay đổi về tốc độ. Linux vẫn đạt 180 MiB / s.

Nhưng sau đó tôi có một ý tưởng khác:
Trình điều khiển Linux không sử dụng chuyển 32 khối MiB. Bộ đệm hạt nhân nhỏ hơn nhiều, đặc biệt nếu NCQ với 32 hàng đợi được bật (32 hàng đợi * 32 MiB => 1 bộ đệm AHCI GiB).

Vì vậy, tôi đã thử nghiệm bộ điều khiển SATA của mình với 256 lần chuyển KiB và voilà, có thể đạt tới 185 MiB / s.

Vì vậy, tôi đoán phần sụn Seagate ST6000AS0002 không có khả năng xử lý các vụ chuyển nhượng lớn ATA. Tiêu chuẩn ATA cho phép lên tới 65.536 khối logic, tương đương với 32 MiB.

SMR - Ghi âm từ tính

Một khả năng khác cho hiệu suất ghi xấu có thể là kỹ thuật ghi từ tính được sử dụng bởi Seagate trong các thiết bị lưu trữ này. Rõ ràng, tôi đã kích hoạt một hiệu ứng hiếm có với việc triển khai FPGA của tôi.


1
Theo kinh nghiệm của tôi, vô hiệu hóa NCQ giúp tăng hiệu suất lớn. Tôi đã thử điều này trên các hệ thống máy tính để bàn, máy chủ, bạn đặt tên cho nó. Ngay cả khi sử dụng 100% "máy chủ" phần cứng hiệu năng cao mà bạn nghĩ sẽ được hưởng lợi từ NCQ. Không, tất cả tồi tệ hơn là vô hiệu hóa nó. IMHO NCQ là một trong những điều tồi tệ nhất xảy ra với ổ cứng. Tôi chưa bao giờ thấy nó mang lại lợi ích trong bất kỳ trường hợp nào, có thể là thẻ RAID chuyên dụng hoặc chipset trên máy bay.
CR.

Bạn đã thực hiện các hoạt động bùng nổ hoặc truy cập ngẫu nhiên? NCQ không có tác động đến các hoạt động bùng nổ nhưng cải thiện truy cập ngẫu nhiên.
Paebbels

Xin lỗi, nhưng bạn đã không trả lời câu hỏi của tôi. Một câu hỏi khác là, phần cứng nào bạn đã sử dụng một bo mạch chủ tiêu dùng đơn giản hoặc một bo mạch chủ máy trạm / máy chủ hoặc bộ điều khiển RAID chuyên dụng. Nhiều triển khai không hỗ trợ nhiều yêu cầu nổi bật như được thiết kế bởi NCQ / AHCI.
Paebbels
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.