Як (дійсно) відключити 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.