Введение

В вычислительной технике, Native Command Queuing (NCQ) — это расширение протокола Serial ATA, позволяющее жестким дискам оптимизировать порядок выполнения полученных команд чтения и записи внутри устройства. Это может снизить количество ненужных перемещений головок чтения/записи, что приводит к увеличению производительности (и незначительному снижению износа диска) при рабочих нагрузках с большим количеством одновременных запросов на чтение и запись, что наиболее часто встречается в серверных приложениях.

История

Native Command Queuing (NCQ) предшествовала версия Tagged Command Queuing (TCQ) в Parallel ATA. Попытка ATA интегрировать TCQ была ограничена требованием, чтобы адаптеры шины хоста ATA использовали протоколы устройств шины ISA для взаимодействия с операционной системой. Результирующая высокая нагрузка на процессор и незначительный прирост производительности способствовали отсутствию признания ATA TCQ на рынке. NCQ отличается от TCQ тем, что в NCQ каждая команда имеет одинаковый приоритет, однако адаптер шины хоста NCQ также программирует собственный DMA-движок первого уровня с параметрами DMA, заданными процессором, в процессе выполнения последовательности команд, в то время как TCQ прерывает процессор при запросе команд и требует от него управления DMA-движком третьего уровня адаптера шины хоста ATA. Реализация NCQ предпочтительнее, поскольку накопитель обладает более точными знаниями о своих характеристиках производительности и может учитывать свое текущее положение. И NCQ, и TCQ имеют максимальную длину очереди в 32 ожидающих команды. Поскольку ATA TCQ используется редко, Parallel ATA (и режим IDE некоторых чипсетов) обычно поддерживает только одну ожидающую команду на порт. Для включения NCQ он должен поддерживаться и быть активированным как в адаптере шины хоста SATA, так и в самом жестком диске. Соответствующий драйвер должен быть загружен в операционную систему для включения NCQ на адаптере шины хоста. Многие новые чипсеты поддерживают Advanced Host Controller Interface (AHCI), что позволяет операционным системам универсально управлять ими и включать NCQ. DragonFly BSD поддерживает AHCI с NCQ начиная с версии 2.3 в 2009 году. Ядра Linux поддерживают AHCI нативно с версии 2.6.19, а FreeBSD полностью поддерживает AHCI с версии 8.0. Windows Vista и Windows 7 также поддерживают AHCI, но их поддержка AHCI (через службу msahci) должна быть включена вручную через редактирование реестра, если поддержка контроллера отсутствовала во время первоначальной установки. AHCI в Windows 7 обеспечивает поддержку не только NCQ, но и TRIM для SSD-накопителей (с соответствующей прошивкой). Более старые операционные системы, такие как Windows XP, требуют установки драйвера, специфичного для производителя (аналогично установке контроллера RAID или SCSI), даже если AHCI присутствует на адаптере шины хоста, что делает первоначальную настройку более сложной, а преобразование существующих установок относительно трудным, поскольку большинство контроллеров не могут работать со своими портами в смешанном режиме AHCI–SATA/IDE/legacy.

Выступление

Испытание 2004 года с накопителем первого поколения, поддерживающим NCQ (Seagate 7200.7 NCQ), показало, что, хотя NCQ и повышает производительность в IOMeter, производительность обычных приложений снижается. Один из обзоров 2010 года выявил улучшение в среднем на 9% при включенном NCQ в серии тестов многозадачности Windows. NCQ может негативно взаимодействовать с планировщиком ввода-вывода операционной системы, что приводит к снижению производительности; это наблюдалось на практике в Linux с RAID 5. В NCQ отсутствует механизм, позволяющий хосту задавать какие-либо ограничения по времени выполнения операций ввода-вывода, например, максимальное количество игнорирований запроса в пользу других. Теоретически, запрос, находящийся в очереди, может быть задержан накопителем на неопределённое время, пока он обрабатывает другие (возможно, новые) запросы при высокой нагрузке ввода-вывода. В прошивке некоторых накопителей, например WD Raptor образца 2007 года, функция предварительного чтения отключается при включении NCQ, что приводит к снижению скорости последовательного доступа. Твердотельные накопители SATA значительно выигрывают от возможности постановки в очередь множества команд для параллельных рабочих нагрузок. Для SSD NVMe, использующих интерфейс PCIe, глубина очереди была увеличена до 65 535 очередей, каждая из которых может содержать до 65 535 команд.

Безопасность (FUA)

Одна из менее известных особенностей NCQ заключается в том, что, в отличие от предшественника ATA TCQ, она позволяет хосту указать, хочет ли он получать уведомление о том, что данные достигли магнитных пластин диска, или о том, что они достигли буфера диска (встроенного кэша). При правильной аппаратной реализации эта функция позволяет гарантировать целостность данных при использовании встроенного кэша диска в сочетании с системными вызовами, такими как fsync. Соответствующий флаг записи, также заимствованный из SCSI, называется Force Unit Access (FUA).

Диски твердотельного состояния

NCQ также используется в современных твердотельных накопителях, где задержка возникает на стороне хоста, а не накопителя. Например, твердотельный накопитель Intel X25 E Extreme использует NCQ, чтобы обеспечить наличие команд для обработки, пока хост-система занята выполнением задач процессора. NCQ также позволяет контроллеру SSD выполнять команды параллельно (или частично параллельно, например, с использованием конвейеров), если внутренняя организация устройства позволяет такую обработку. Стандарт NVM Express (NVMe) также поддерживает командную очередь, оптимизированную для SSD. NVMe позволяет использовать несколько очередей для одного контроллера и устройства, обеспечивая при этом значительно большую глубину каждой очереди, что лучше соответствует принципам работы аппаратной части SSD.