Як (дійсно) відключити NCQ в Linux


13

Я реалізував власний адаптер Serial-ATA Host-Bus-Adapter (HBA) у VHDL і запрограмував його на FPGA. FPGA - це мікросхема, яку можна запрограмувати на будь-якій цифровій схемі. Він також оснащений послідовними приймачами для генерації високошвидкісних сигналів для SATA або PCIe.

Цей контролер SATA підтримує лінійну швидкість SATA 6 Гбіт / с і використовує команди ATA-8 DMA-IN / OUT для передачі даних до 32 фрагментів МіБ до пристрою та з нього. Доведено, що конструкція працює з максимальною швидкістю (наприклад, Samsung SSD 840 Pro -> понад 550 МіБ / с).

Після декількох тестів на декількох пристроях SSD та HDD я придбав новий жорсткий диск Seagate 6 TB HDD ( ST6000AS0002 ). Цей жорсткий диск досягає швидкості читання до 190 Мбіт / с, але продуктивність запису лише від 30 до 40 Мбіт / с!

Тому я копав глибше і вимірював передані кадри (так, це можливо при дизайні FPGA). Наскільки я можу сказати, жорсткий диск Seagate готовий отримати перші 32 Мбіт передачі за одне ціле. Ця передача відбувається при максимальній швидкості лінії 580 МіБ / с. Після цього на жорсткому диску зберігається решта байтів понад 800 мс! Тоді жорсткий диск готовий прийняти наступні 32 МіБ і знову зупиняється протягом 800 мс. Загалом на передачу 1 Гб потрібно більше 30 секунд, що дорівнює приблизно 35 Мбіт / с.

Я припускаю, що на цьому жорсткому диску є кеш запису на 32 МіБ, який знаходиться між циклами прориву. Передача даних, що мають менше 32 МБ, не демонструє такої поведінки.

Мій контролер використовує команди DMA-IN і DMA-OUT для передачі даних. Я не використовую команди QUEUED-DMA-IN і QUEUED-DMA-OUT, які використовуються контролерами AHCI, здатними NCQ. Доповнення AHCI та NCQ на платформі FPGA дуже складна і не потрібна моєму додатку.

Я хотів би відтворити цей сценарій на моєму ПК з Linux, але драйвер AHCI для Linux має замовчуванням включений NCQ. Мені потрібно відключити NCQ, тому я знайшов цей веб-сайт, що описує, як відключити NCQ , але він не працює.

Linux PC все ще досягає швидкості запису в 190 Мбіт / с.

> dd if=/dev/zero of=/dev/sdb bs=32M count=32
1073741824 bytes (1.1 GB) copied, 5.46148 s, 197 MB/s

Я думаю, що в статті зверху є помилка: зменшення глибини черги NCQ до 1 не вимикає NCQ. Це просто дозволяє ОС використовувати лише одну чергу. Він все ще може використовувати команди QUEUED-DMA - ** для передачі. Мені потрібно реально відключити NCQ, щоб драйвер видав пристрою команди DMA-IN / OUT.

Тож ось мої запитання:

  1. Як я можу відключити NCQ?
  2. Якщо глибина черги NCQ = 1, чи драйвер AHCI Linux використовує команди QUEUED-DMA - ** або DMA - **?
  3. Як я можу перевірити, чи NCQ вимкнено, оскільки про зміну /sys/block/sdX/device/queue_depthне повідомляється в dmesg?

3
параметр ядра libata.force=noncq?
frostschutz

Дякую, це дуже допомогло, щоб повністю відключити NCQ. Я також вирішив питання щодо виконання записів.
Paebbels

1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Не знаю, що ви мали намір зробити з цим; але це буде eraseяк MBR, так і gazillions блоків. Робити це на диску з основною системою, що працює на ньому (і grubвстановленою на MBR, як у моєму випадку), було б досить небезпечно;) Думав, я напишу це тут як коментар, щоб запобігти експериментуванню з деякими менш досвідченими людьми твій "класний" рядок ...;)
синтаксис,

@syntaxerror Жорсткий диск підключений до плати FPGA. У такому середовищі складно написати апаратні процедури, які ідеально обробляють MBR та файлові системи. Тому я використовую жорсткий диск як сирий носій з обох сторін. На погляд FPGA - це велика лінійна пам'ять. У Linux я використовую / dev / sdg та програму C для читання та запису даних, що тривають.
Paebbels

@Paebbels На жаль, я не повинен був переглядати біт FPGA. Ну, це справді щось зовсім інше, ніж наші звичайні жорсткі диски, підключені до шин материнських плат настільних ПК або ноутбуків ;-) "У такому середовищі складно написати апаратні процедури, які ідеально обробляють MBR та файлові системи ." Правда. Ви не зможете обійтися без ЛПВЩ . І я можу собі уявити, що програмування такого не для слабкого серця ... навіть якщо приклад коду Вікіпедії говорить про те, що це повна прогулянка по парку ;-)
синтаксис, що відбувся

Відповіді:


11

Завдяки @frostschutz, я міг оцінити продуктивність запису в Linux без функції NCQ. Параметр завантаження ядра libata.force=noncqповністю відключив NCQ.

Що стосується моєї проблеми з записом Seagate 6TB, швидкість не змінилася. Linux все ще досягає 180 Мбіт / с.

Але тоді у мене виникла інша ідея:
драйвер Linux не використовує передачі 32 кубиків MiB. Буфер ядра набагато менший, особливо якщо увімкнено NCQ з 32 чергами (32 черги * 32 MiB => 1 GiB AHCI буфер).

Тож я перевірив свій контролер SATA з 256 перерахунками на KiB і вуаля, можливо, досягти 185 Мбіт / с.

Тому я думаю, що вбудована програма Seagate ST6000AS0002 не здатна обробляти великі передачі ATA. Стандарт ATA дозволяє використовувати до 65.536 логічних блоків, що дорівнює 32 МіБ.

SMR - магнітний запис

Іншою можливістю для поганої продуктивності запису може стати техніка магнітного запису , що використовується в цих архівних пристроях Seagate. Очевидно, що я викликав рідкісний ефект із моєю реалізацією FPGA.


1
На мій досвід, відключення NCQ дає великий приріст у роботі. Я спробував це на настільних системах, серверах, ви їх називаєте. Навіть використовуючи 100% «серверне» високоефективне обладнання, яке, на вашу думку, виграє від NCQ. Ні, це все гірше, ніж просто відключити його. IMHO NCQ - одна з найгірших речей, що трапляються з жорсткими дисками. Я ніколи не бачив, щоб це дало користь за будь-яких обставин, будь то виділена RAID-карта чи бортовий чіпсет.
CR.

Ви робили оперативні операції чи випадковий доступ? NCQ не впливає на оперативні дії, але покращує випадковий доступ.
Paebbels

Вибачте, але ви не відповіли на моє запитання. Інше питання - яким апаратним обладнанням ви користувались простою материнською платою споживача або материнською платою робочої станції / сервера або виділеним RAID-контролером. Багато реалізацій не підтримують стільки невирішених запитів, як розроблено NCQ / AHCI.
Паебельс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.