Как (действительно) отключить 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 Archive 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 все еще достигает 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, использует ли драйвер Linux AHCI команды QUEUED-DMA - ** или DMA - **?
  3. Как я могу проверить, если NCQ отключен, потому что изменение /sys/block/sdX/device/queue_depthне сообщается в dmesg?
Paebbels
источник
3
параметр ядра libata.force=noncq?
frostschutz
Спасибо, это очень помогло, чтобы полностью отключить NCQ. Я также решил проблему производительности записи.
Паеббельс
1
> dd if=/dev/zero of=/dev/sdb bs=32M count=32Не знаю, что вы намеревались сделать с этим; но это будет eraseи MBR, и gazillions блоков за его пределами. Делать это на диске с основной системой, работающей на нем (и grubустановленной на MBR, как в моем случае), было бы довольно опасно;) Я думал, что я напишу это здесь в качестве комментария, чтобы помешать некоторым менее опытным людям экспериментировать с твоя "крутая" строка ...;)
syntaxerror
@syntaxerror Жесткий диск подключен к плате FPGA. В такой среде очень сложно писать аппаратные подпрограммы, которые отлично справляются с MBR и обращениями к файловой системе. Поэтому я использую жесткий диск в качестве необработанного носителя с обеих сторон. В представлении FPGA это большая линейная память. В Linux я использую / dev / sdg и программу на C для чтения и записи данных о продолжении.
Паеббельс
@Paebbels Ой, я не должен был пропустить бит FPGA. Что ж, это действительно что-то совершенно иное, чем наши обычные жесткие диски, подключенные к шинам материнских плат настольных ПК или ноутбуков ;-) «В такой среде сложно писать аппаратные подпрограммы, которые отлично справляются с MBR и процессами доступа к файловой системе» . Правда. Вы не сможете обойтись без HDL . И я могу себе представить, что программирование таких вещей не для слабонервных ... хотя пример кода в Википедии предполагает, что это полная прогулка в парке ;-)
syntaxerror

Ответы:

11

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

Что касается моей проблемы с производительностью записи Seagate 6TB, скорости не было. Linux все еще достигает 180 МБ / с.

Но тогда у меня возникла другая идея:
драйвер Linux не использует передачи 32 блоков по MiB. Буфер ядра намного меньше, особенно если включен NCQ с 32 очередями (32 очереди * 32 МиБ => 1 ГБ AHCI-буфер).

Итак, я протестировал свой SATA-контроллер с 256-гигабайтными передачами и вуаля, возможно достичь 185 МБ / с.

Таким образом, я полагаю, что прошивка Seagate ST6000AS0002 не способна обрабатывать передачу больших пакетов ATA. Стандарт ATA допускает до 65,536 логических блоков, что равно 32 МБ.

SMR - магнитная запись

Другой возможностью плохой записи может быть технология магнитной записи , которая используется Seagate в этих архивных устройствах. Очевидно, я вызвал редкий эффект с моей реализацией FPGA.

Paebbels
источник
1
По моему опыту, отключение NCQ значительно повышает производительность. Я пробовал это на настольных системах, серверах, вы называете это. Даже используя 100% «серверное» высокопроизводительное оборудование, которое, как вы думаете, выиграет от NCQ. Нет, это все хуже, чем просто отключить его. IMHO NCQ - одна из худших вещей, которые могут случиться с жесткими дисками. Я никогда не видел, чтобы это давало преимущество при любых обстоятельствах, будь то выделенная карта RAID или встроенный чипсет.
кр.
Вы делали пакетные операции или произвольный доступ? NCQ не влияет на пакетные операции, но улучшает произвольный доступ.
Паеббельс
Извините, но вы не ответили на мой вопрос. Другой вопрос: на каком оборудовании вы использовали простую потребительскую системную плату, системную плату для рабочей станции / сервера или выделенный контроллер RAID. Многие реализации не поддерживают столько ожидающих запросов, сколько разработано NCQ / AHCI.
Паеббельс