
コンピューティングにおいて、ネイティブコマンドキューイング(NCQ )は、 Serial ATAプロトコルの拡張機能であり、ハードディスクドライブが受信した読み書きコマンドの実行順序を内部的に最適化することを可能にします。これにより、不要なドライブヘッドの移動量を削減でき、複数の同時読み書き要求が発生するワークロード(多くの場合、サーバータイプのアプリケーションで発生します)において、パフォーマンスの向上(およびドライブの摩耗のわずかな減少)につながります。
ネイティブコマンドキューイングに先立ち、Parallel ATAではタグ付きコマンドキューイング(TCQ)が採用されていました。ATAがTCQを統合しようとした際、ATAホストバスアダプタがオペレーティングシステムとのやり取りにISAバスデバイスプロトコルを使用する必要があるという制約がありました。その結果、CPUオーバーヘッドが大きくなり、パフォーマンスの向上もわずかであったため、ATA TCQは市場で広く受け入れられませんでした。
NCQ は TCQ とは異なり、NCQ では各コマンドが等しく重要ですが、NCQ のホストバスアダプタはコマンドシーケンス中にCPU から与えられたDMAパラメータを使用して独自のファーストパーティ DMAエンジンもプログラムします。一方、TCQ はコマンドクエリ中に CPU を割り込み、ATA ホストバスアダプタのサードパーティ DMAエンジンをモジュレーションする必要があります。ドライブはパフォーマンス特性をより正確に把握しており、回転位置を考慮できるため、NCQ の実装の方が好ましいです。NCQ と TCQ の両方で、キューの最大長は 32 個の未処理コマンドです。[ 1 ] [ 2 ] ATA TCQ はめったに使用されないため、パラレル ATA (および一部のチップセットの IDE モード) は通常、ポートごとに 1 つの未処理コマンドのみをサポートします。
NCQを有効にするには、SATAホストバスアダプタとハードドライブ自体でNCQがサポートされ、有効になっている必要があります。ホストバスアダプタでNCQを有効にするには、適切なドライバをオペレーティングシステムにロードする必要があります。[ 3 ]
多くの新しいチップセットは、オペレーティングシステムがそれらを普遍的に制御して NCQ を有効にできる Advanced Host Controller Interface (AHCI) をサポートしています。 DragonFly BSD は、2009 年のバージョン 2.3 以降、NCQ とともに AHCI をサポートしています。 [ 4 ] [ 5 ] Linux カーネルはバージョン 2.6.19 以降、ネイティブでAHCI をサポートしており、 FreeBSD はバージョン 8.0 以降、AHCI を完全にサポートしています。Windows VistaとWindows 7もネイティブで AHCI をサポートしていますが、コントローラーのサポートが初期インストール時に存在しなかった場合は、レジストリ編集によって AHCI サポート (msahci サービス経由) を手動で有効にする必要があります。Windows 7の AHCI は、NCQ だけでなくSSDドライブ (対応するファームウェアを使用) でのTRIMサポートも有効にします。Windows XPなどの古いオペレーティングシステムでは、ホストバスアダプタにAHCIが搭載されている場合でも、ベンダー固有のドライバのインストール(RAIDやSCSIコントローラのインストールと同様)が必要になります。そのため、初期設定がより面倒になり、既存のインストール環境の変換も比較的困難になります。これは、ほとんどのコントローラがAHCIとSATA/IDE/レガシーモードの混在モードでポートを動作させることができないためです。
2004年に行われた第1世代NCQドライブ(Seagate 7200.7 NCQ)のテストでは、NCQによってIOMeterのパフォーマンスは向上するものの、デスクトップアプリケーションのパフォーマンスは低下することがわかった。[ 6 ] 2010年のあるレビューでは、一連のWindowsマルチタスクテストでNCQを有効にすると、平均で約9%の改善が見られた。[ 7 ]
NCQ はオペレーティングシステムのI/O スケジューラに悪影響を及ぼし、パフォーマンスを低下させる可能性があります。[ 8 ]これは、RAID-5を使用したLinuxで実際に確認されています。[ 9 ] NCQ には、ホストが I/O の期限(他のリクエストを優先して無視できる回数など)を指定するメカニズムはありません。理論的には、キューに入れられたリクエストは、ドライブが I/O プレッシャーの下で他の (おそらく新しい) リクエストを処理している間、任意の時間だけ遅延する可能性があります。 [ 8 ] NCQ ディスパッチ順序付けのためにドライブのファームウェア内で使用されるアルゴリズムは一般に公開されていないため、ハードウェア/ファームウェアのパフォーマンスに別のレベルの不確実性が生じます。2008 年頃の Google でのテストでは、NCQ が I/O を最大 1~2 秒遅延させる可能性があることが示されています。提案されている回避策は、低遅延アプリケーションをタイムリーに満たすために、オペレーティングシステムが NCQ キューを人為的に早く枯渇させることです。[ 10 ]
2007年頃のWD Raptorなど、一部のドライブのファームウェアでは、NCQが有効になっている場合、リードアヘッドが無効になり、シーケンシャルパフォーマンスが低下します。[ 11 ]
SATAソリッドステートドライブは、並列ワークロードのために複数のコマンドをキューに格納できることで、大きなメリットを得られます。PCIeベースのNVMe SSDでは、キューの深さがさらに拡張され、最大65,535個のキューと、それぞれ最大65,535個のコマンドをサポートできるようになりました。
NCQ のあまり知られていない機能の 1 つは、ATA TCQ の前身とは異なり、ホストがデータがディスクのプラッタに到達したときに通知を受け取るか、ディスクのバッファ (オンボード キャッシュ) に到達したときに通知を受け取るかを指定できることです。適切なハードウェア実装を前提とすると、この機能により、ディスクのオンボード キャッシュをfsyncなどのシステム コールと組み合わせて使用する場合、データの一貫性が保証されます。[ 12 ] SCSI から借用された関連する書き込みフラグは、 Force Unit Access (FUA)と呼ばれます。 [ 13 ] [ 14 ] [ 15 ]
NCQは、ドライブがホスト側で遅延に遭遇する(逆ではない)新しいソリッドステートドライブでも使用されています。たとえば、 IntelのX25-E Extremeソリッドステートドライブは、ホストシステムがCPUタスクの処理でビジー状態になっている間もドライブが処理するコマンドを確実に持つためにNCQを使用しています。[ 16 ]
NCQはまた、デバイスの内部構造がそのような処理を可能にする場合、SSDコントローラがコマンドを並行して(またはパイプラインなどを使用して部分的に並行して)実行することを可能にする。
NVM Express (NVMe) 規格も、SSD に最適化された形式でコマンド キューイングをサポートしています。[ 17 ] NVMe は、単一のコントローラとデバイスに対して複数のキューを許可し、各キューの深さをはるかに高くすることで、基盤となる SSD ハードウェアの動作により近いものとなっています。[ 18 ]