Я реализовал свой собственный 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.
Итак, вот мои вопросы:
- Как я могу отключить NCQ?
- Если глубина очереди NCQ = 1, использует ли драйвер Linux AHCI команды 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
?