En informática , Native Command Queuing ( NCQ ) es una extensión del protocolo Serial ATA que permite que las unidades de disco duro optimicen internamente el orden en el que se ejecutan los comandos de lectura y escritura recibidos. Esto puede reducir la cantidad de movimiento innecesario del cabezal de la unidad, lo que da como resultado un mayor rendimiento (y un desgaste ligeramente menor de la unidad) para cargas de trabajo en las que son excepcionales múltiples solicitudes de lectura/escritura simultáneas, que ocurren con mayor frecuencia en aplicaciones de tipo servidor .
La cola de comandos nativa fue precedida por la versión de Parallel ATA de la cola de comandos etiquetada (TCQ). El intento de ATA de integrar TCQ se vio limitado por el requisito de que los adaptadores de bus host ATA utilizaran protocolos de dispositivos de bus ISA para interactuar con el sistema operativo. La alta sobrecarga de CPU resultante y la insignificante ganancia de rendimiento contribuyeron a la falta de aceptación en el mercado de ATA TCQ.
NCQ se diferencia de TCQ en que, con NCQ, cada comando tiene la misma importancia, pero el adaptador de bus host de NCQ también programa su propio motor DMA de primera parte con parámetros DMA proporcionados por la CPU durante su secuencia de comandos, mientras que TCQ interrumpe a la CPU durante las consultas de comandos y le exige que module el motor DMA de terceros del adaptador de bus host ATA . La implementación de NCQ es preferible porque la unidad tiene un conocimiento más preciso de sus características de rendimiento y puede dar cuenta de su posición rotacional. Tanto NCQ como TCQ tienen una longitud máxima de cola de 32 comandos pendientes. [1] [2] Debido a que el TCQ ATA rara vez se usa, ATA paralela (y el modo IDE de algunos chipsets) normalmente solo admiten un comando pendiente por puerto.
Para que NCQ esté habilitado, debe ser compatible y estar habilitado en el adaptador de bus host SATA y en el disco duro mismo. Se debe cargar el controlador adecuado en el sistema operativo para habilitar NCQ en el adaptador de bus host. [3]
Muchos chipsets más nuevos admiten la Interfaz avanzada de controlador de host (AHCI), que permite a los sistemas operativos controlarlos universalmente y habilitar NCQ. DragonFly BSD ha admitido AHCI con NCQ desde la versión 2.3 en 2009. [4] [5] Los núcleos de Linux admiten AHCI de forma nativa desde la versión 2.6.19, y FreeBSD admite AHCI por completo desde la versión 8.0. Windows Vista y Windows 7 también admiten AHCI de forma nativa, pero su compatibilidad con AHCI (a través del servicio msahci) debe habilitarse manualmente mediante la edición del registro si la compatibilidad con el controlador no estaba presente durante su instalación inicial. AHCI de Windows 7 no solo habilita NCQ sino también compatibilidad con TRIM en unidades SSD (con su firmware de soporte). Los sistemas operativos más antiguos, como Windows XP, requieren la instalación de un controlador específico del proveedor (similar a la instalación de un controlador RAID o SCSI ) incluso si AHCI está presente en el adaptador de bus host, lo que hace que la configuración inicial sea más tediosa y las conversiones de instalaciones existentes relativamente difíciles, ya que la mayoría de los controladores no pueden operar sus puertos en modo mixto AHCI–SATA/IDE/heredado.
Una prueba de 2004 con la unidad NCQ de primera generación (Seagate 7200.7 NCQ) descubrió que, si bien NCQ aumentó el rendimiento de IOMeter, el rendimiento de las aplicaciones de escritorio disminuyó. [6] Una revisión de 2010 encontró mejoras del orden del 9 % (en promedio) con NCQ habilitado en una serie de pruebas multitarea de Windows. [7]
NCQ puede interferir negativamente con el programador de E/S del sistema operativo , disminuyendo el rendimiento; [8] esto se ha observado en la práctica en Linux con RAID-5 . [9] No hay ningún mecanismo en NCQ para que el host especifique ningún tipo de plazos para una E/S, como cuántas veces se puede ignorar una solicitud en favor de otras. En teoría, una solicitud en cola puede ser retrasada por la unidad una cantidad arbitraria de tiempo mientras atiende otras solicitudes (posiblemente nuevas) bajo presión de E/S. [8] Dado que los algoritmos utilizados dentro del firmware de las unidades para ordenar el envío de NCQ generalmente no se conocen públicamente, esto introduce otro nivel de incertidumbre para el rendimiento del hardware/firmware. Las pruebas en Google alrededor de 2008 han demostrado que NCQ puede retrasar una E/S hasta 1 o 2 segundos. Una solución alternativa propuesta es que el sistema operativo deje de recibir artificialmente a la cola NCQ antes para satisfacer las aplicaciones de baja latencia de manera oportuna. [10]
En el firmware de algunas unidades, como el WD Raptor de 2007, la lectura anticipada está deshabilitada cuando NCQ está habilitado, lo que da como resultado un rendimiento secuencial más lento. [11]
Las unidades de estado sólido SATA se benefician significativamente de la capacidad de poner en cola varios comandos para cargas de trabajo paralelas. En el caso de las unidades SSD NVMe basadas en PCIe , la profundidad de la cola se incrementó incluso para admitir un máximo de 65 535 colas con hasta 65 535 comandos cada una.
Una característica menos conocida de NCQ es que, a diferencia de su predecesor ATA TCQ, permite al host especificar si desea recibir una notificación cuando los datos llegan a los platos del disco o cuando llegan al búfer del disco (caché integrado). Suponiendo una correcta implementación del hardware, esta característica permite garantizar la consistencia de los datos cuando se utiliza el caché integrado del disco junto con llamadas del sistema como fsync . [12] El indicador de escritura asociado, que también se tomó prestado de SCSI, se llama Force Unit Access (FUA). [13] [14] [15]
NCQ también se utiliza en unidades de estado sólido más nuevas , en las que la unidad encuentra latencia en el host, en lugar de lo contrario. Por ejemplo, la unidad de estado sólido X25-E Extreme de Intel utiliza NCQ para garantizar que la unidad tenga comandos para procesar mientras el sistema host está ocupado procesando tareas de la CPU. [16]
NCQ también permite que el controlador SSD complete comandos de manera simultánea (o parcialmente simultánea, por ejemplo, utilizando canalizaciones) cuando la organización interna del dispositivo permite dicho procesamiento.
El estándar NVM Express (NVMe) también admite colas de comandos, en una forma optimizada para SSD. [17] NVMe permite múltiples colas para un solo controlador y dispositivo, lo que permite al mismo tiempo profundidades mucho mayores para cada cola, lo que coincide más estrechamente con el funcionamiento del hardware SSD subyacente. [18]