Я реалізував власний адаптер 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.
Тож ось мої запитання:
- Як я можу відключити NCQ?
- Якщо глибина черги NCQ = 1, чи драйвер AHCI Linux використовує команди QUEUED-DMA - ** або DMA - **?
- Як я можу перевірити, чи NCQ вимкнено, оскільки про зміну
/sys/block/sdX/device/queue_depth
не повідомляється вdmesg
?
> dd if=/dev/zero of=/dev/sdb bs=32M count=32
Не знаю, що ви мали намір зробити з цим; але це буде erase
як MBR, так і gazillions блоків. Робити це на диску з основною системою, що працює на ньому (і grub
встановленою на MBR, як у моєму випадку), було б досить небезпечно;) Думав, я напишу це тут як коментар, щоб запобігти експериментуванню з деякими менш досвідченими людьми твій "класний" рядок ...;)
libata.force=noncq
?