Как (действительно) отключить 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?

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.


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

Вы делали пакетные операции или произвольный доступ? NCQ не влияет на пакетные операции, но улучшает произвольный доступ.
— Паеббельс

Извините, но вы не ответили на мой вопрос. Другой вопрос: на каком оборудовании вы использовали простую потребительскую системную плату, системную плату для рабочей станции / сервера или выделенный контроллер RAID. Многие реализации не поддерживают столько ожидающих запросов, сколько разработано NCQ / AHCI.
— Паеббельс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.