SCSIユーザも注目!? の
シリアルATA Native Command Queuing



 シリアルATAの利用範囲拡大を目指して策定中の次世代仕様「シリアルATA II」が発表されて1年を経過したが、今年9月にはシリアルATA IIの機能を強化する拡張仕様がいくつか追加されるなど、かなり積極的な様子がうかがえる。今回は、シリアルATA製品の開発に携わるベンダからのコメントを交えながら、シリアルATA IIで最も注目したい新機能「Native Command Queuing」の仕組みを解説していく。

●多くのPCでパフォーマンス向上を期待できるNative Command Queuing

 シリアルATA IIは、サーバやワークステーション、ネットワークストレージ向けの拡張機能を提供するシリアルATA 1.0の補助仕様である。シリアルATA IIに追加された機能には、データアクセスの効率を高めるNative Command Queuing、ストレージの筐体内部(温度、冷却ファンの回転速度)を監視する機能、ホットスワップ可能なバックプレーンへの対応(以上、フェーズ1でサポート)、そして現在の2倍にあたる3Gbpsの信号帯域幅(フェーズ2でサポート)などがある。

 また、今年9月に開催されたIntelの技術者向けカンファレンス「Intel Developer Forum (IDF)Fall 2003」では、シリアルATA II に追加される拡張仕様として、デジタル 1.1仕様、ポート・マルチプライヤ 1.0仕様、ポート・セレクタ 1.0仕様が発表された。これらの仕様の詳細については別の回で改めて取り上げたい。

 シリアルATA IIの機能は、サーバや外部ストレージで効果を発揮するものがほとんどだが、デスクトップPCやノートPCなど、いわゆる普通のPCの環境でも役立ちそうな機能にNative Command Queuingがある。Seagate Technology, Product Marketing ManagerのJoni Clark氏によれば、「Native Command Queuingの基礎となる機能は、すでにシリアルATA 1.0の中にも含まれていたが、これを完成の域にまで押し上げたのがシリアルATA IIである」という。

 Native Command Queuingを理解するには、まずHDDの動作の仕組みを把握しておく必要がある。HDDからデータを読み書きするときに最も時間がかかる操作は、ヘッドの移動時間やディスクの回転待ち時間といったHDD内部の機械的な動作だ。コマンド送受信、デコード、メモリアクセスなどの電気的な処理はたかだかマイクロ秒(μs)のオーダーだが、HDD内部の機械的な動作はミリ秒(ms)のオーダーと大きな開きがある。

 ヘッドの移動時間は、HDDが読み書きの指令を出してからディスク上の希望のトラックにヘッドを位置付けるまでの時間を指しており、一般にシーク時間として知られる。シーク時間は、トラック間の移動距離によって大きく左右されるため、通常は最内周から最外周のトラックまでのシーク時間を2で割った平均シーク時間が性能指標に用いられる。

 次に、そのトラック上にある希望のセクタにヘッドを位置付ける必要があるが、そのためにはディスクの回転によってそのセクタがヘッドの真上に到着するまで待たなければならない。ヘッドはトラック方向には動くが、セクタ方向には動かないからだ。この待ち時間を回転待ち時間と呼び、シーク時間と合計したものをアクセス時間という。直前のセクタ位置によってディスクを回転させる量は大きく異なるものの、回転待ち時間の最大値はディスクの回転速度によって一意に決定される。その最大値は、5,400rpmで11.1ms、7,200rpmで8.3ms、10,000rpmで6ms、15,000rpmで4msである。

●HDDの機械的動作によるオーバーヘッドを隠蔽するCommand Queuing

 こうした機械的動作によるオーバーヘッドの隠蔽に役立つのが、Command Queuingだ。Command Queuingは、コマンドの実行完了を待たずに複数のコマンドを連続して発行し、そのままキュー(待ち行列)に溜めていく。これにより、長い時間を要するHDDの機械的動作の完了をコマンドごとに待つことなく、次々とHDDにコマンドを送り込める。

Command Queuingの仕組みを説明する資料(出典:Knut Grimsrud and Amber Huffman - Intel Corp., Extensions to シリアルATA - Performance & Feature Enhancements, Intel Developer Forum Spring 2003, Feb. 19, 2003)。図にあるようなA、B、C、Dというブロックへのアクセスが発生したとき、Command Queuingとアウトオブオーダー実行がない場合には、A→B→C→Dという順番にアクセスするため、アクセス完了までにディスクを2回転半も回転させなければならない。一方、Command Queuingとアウトオブオーダー実行がある場合には、B→C→A→Dという順番に並べ替えてアクセスできるため、ディスクを1回転させるだけでアクセスを完了できる

 ただし、Command Queuingだけでは劇的な高速化につながらない。というのも、キューに格納されたコマンドを受信した順番(インオーダー)に実行しただけでは、HDDの機械的動作そのものを短縮することにつながらないからだ。ここで重要な役割を果たすのがアウトオブオーダー実行である。アウトオブオーダー実行は、キューに格納された複数のコマンドを効率の良い順番に並べ替えてから実行に移す。

 この“効率の良い順番”とは、できる限りヘッドの移動を短縮できるトラック間、回転待ち時間の少ないセクタ間を近づける順番、すなわちHDDの機械的動作を短縮できるような順番を指している。このような効率の良い順番を決める方法を一般にRotational Positioning Ordering(以下、RPO)と呼ぶ。

 早期のアルゴリズムは、トラック間の位置関係に着目してシーク時間を可能な限り短縮するものがほとんどだったが、トラック間の時間短縮だけにとらわれていると、セクタの位置関係によっては回転待ち時間を逆に増やしてしまうことがある。そこで、近年のアルゴリズムでは、セクタの位置関係や直近のヘッド位置に着目し、シーク時間と回転待ち時間を合計したアクセス時間を総合的に短縮できるようにコマンドを並べ替えていく。


●実用性に乏しかったパラレルATA時代のCommand Queuing

 今回の主題は、シリアルATA IIで新たに登場したNative Command Queuingだが、Command Queuingの機能そのものは、ATA/ATAPI-4の時代からすでに存在していた(現在ならばATA/ATAPI-6 Command Queuingと呼ぶべきか)。このATA/ATAPI-4 Command QueuingとNative Command Queuingの違いは、Native Command Queuingとともに説明した方が分かりやすいのであとで取り上げよう。

 さて、ATA/ATAPI-4 Command Queuingを早期に採用したベンダで特に有名なのが、ATAコントローラなどの開発を手がけるPromise Technologyだ。筆者も、数年ほど前からCommand Queuingの重要性を同社から何度にもわたり説明されてきた。Native Command Queuingの登場を控えた現在、パラレルATA時代から続くATA/ATAPI-4 Command Queuingの実装に関して、改めてPromise Technology, Marketing and Sales DepartmentのVincent Chen氏に質問したところ、次のような回答が返ってきた。

 「Promise Technologyは、ATA/ATAPI-4 Command Queuingを特にTagged Command Queuing(以下、TCQ)と呼び、主にHDDの高速化を推進する目的でいち早くATAコントローラに実装した。しかし当時、TCQをサポートするHDDベンダがIBMくらいしかなく、また弊社の検証によれば、当時のIBM製HDDはTCQによって期待したほど高速化されなかった。結果として、TCQの利点を強くアピールすることができなかった」。

 「しかし、同じくTCQをサポートした新しいWestern Digital製HDDでは、シリアルATA 1.0の環境において約33%も高速化されたことを確認した。また、今年9月に開催されたCOMPUTEX TAIPEI 2003では、弊社のブースでこの模様を実機環境で一般に披露している。従って、必ずしもTCQがHDDの高速化に寄与しないというわけではない。ただし、いずれはNative Command Queuingが主流となるだろう。弊社も、Native Command Queuingに対応したATAコントローラを開発中で、すでにエンジニアリングサンプルは完成している」。

●これからの本命となるNative Command Queuing

 Native Command Queuingは、SCSIが持つTagged Command Queuingの考え方を継承して設計された機能であり、Race-free Status Return Mechanism、Interrupt Aggregation、First Party DMA(FPDMA)という3つの機能によって支えられている。

通常のアクセス(Command Queuingなし)、ATA/ATAPI-4 Command Queuing、Native Command Queuing(シリアルATA IIまたはSCSI)の違いを示したもの(Promise Technologyの説明をもとに筆者が作成)。図は、4つのコマンドを連続的に実行する場合の流れを示したもので、ATA/ATAPI-4 Command Queuingは待ち状態(Wait)を削減できるものの、転送ごとの割り込みがそのまま残ってしまう。Native Command Queuingでは、Interruput Aggregationによって割り込みが1つに集約され、しかも割り込みの際にソフトウェアドライバの介入がほとんどなくなるため、オーバーヘッドが大幅に削減される。便宜上、図中のコマンドは1、2、3、4と順番に実行した例を掲載しているが、実際には効率の良い順番に並べ替えて実行されることになる

 Race-free Status Return Mechanismは、どんなコマンドが実行されているときでも、そしてどんなタイミングであっても、ドライブ(通常はHDD)からホストコントローラに対してステータスを自由に返せる仕組みのことだ。また、ステータスの応答に対して、ホストとのハンドシェークは一切発生しない。従って、ドライブは複数のコマンドの実行完了ステータスを連続的にホストコントローラに対して伝えられるようになる。

 一方、ATA/ATAPI-4 Command Queuingは、このRace-free Status Return Mechanismを持っていない。このため、ホストコントローラ側のドライバソフトウェア(ハードウェアで実装される場合もある)が、次のコマンドのステータスを受け入れられるようにServiceコマンドを発行しなければ、ドライブはもう一つのコマンドのステータスを返せない。従って、コマンド完了フェーズではアクセス遅延とCPUのオーバーヘッドが生じてしまう。

 Interrupt Aggregationは、複数のコマンドで発生する割り込みを1つにまとめることにより、割り込みの発生を抑える機能だ。ATAインタフェースのコマンド実行の流れは、基本的にコマンド発行(Command)、待機(Wait)、情報またはデータ転送(Transfer)、割り込み(Interrupt)である。ATA/ATAPI-4 Command Queuingでは、割り込みがコマンドごとに発生するが、多数のコマンドがキューに格納されるようなケースでは、これらのコマンドによる割り込みが大きなオーバーヘッドを生んでしまう。

 First Party DMAは、ホストコントローラ側のドライバソフトウェアの介入なしにドライブがデータ転送のためのDMA(Direct Memory Access)操作をセットアップできる機能だ。シリアルATAでは、ドライブがホストコントローラ側のDMAコンテキストを選ぶためのDMA Setup FISと呼ばれるFISを用意している。FISは、Frame Information Blockの略で、シリアルATAの基本的な転送単位となるフレームの構造を指す。

 DMA Setup FISには、DMAセットアップが行なわれるコマンドに対応付けられたタグ番号(0~31)、ホストコントローラへ送信されるデータ量(DMA Transfer Count)などの情報が格納される。ホストコントローラは、ドライブから受信したDMA Setup FISをもとにDMA転送の処理を行う。なお、シリアルATAでは、この機能を使用するためにRead FPDMA Queued、Write FPDMA Queuedというコマンドが新設された。これらのコマンドは、いずれも48bitアドレッシングのLBA(Logical Block Addressing)モードのみをサポートする。

 一方のATA/ATAPI-4 Command Queuingは、First Party DMAをサポートしていないため、データ転送を行う際にホストコントローラに対する割り込みが発生する。ホストコントローラ側のドライバソフトウェアは、この割り込みをトリガーとしていくつかの手順を実行し、ようやくDMA転送の準備が整う。DMA転送のセットアップに対して、ホストコントローラ側のドライバソフトウェアが何度も介入することになるため、ここで大きなオーバーヘッドが発生してしまう。

 このように、Race-free Status Return Mechanism、Interruput Aggregation、First Party DMAといった機能を持たないATA/ATAPI-4 Command Queuingは、せっかくキューイングを行なったとしても、それに対するオーバーヘッドがあまりにも大きいために、キューイングによるパフォーマンス向上が相殺されてしまうのだ。裏を返せば、シリアルATAから導入されたNative Command Queuingこそが、ATAインタフェースのための“完成されたCommand Queuing”ということになる。

●SCSI Command Queuingとの違いは何か?

 最後に、SCSI Command Queuing(以下、SCSI NCQ)とNative Command Queuing(以下、SATA NCQ)の違いを説明しよう。SCSI NCQとSATA NCQの基本的な仕組みはほぼ同じだが、「SATA NCQは、“シンプル”というATAインタフェースの哲学に基づき、できる限り簡素な仕様になっている(Maxtor, Technical Marketing EngineerのMark Jackson氏)」という。つまり、SATA NCQはSCSI NCQの軽量版という位置付けにある。

 まず、キューの深さは、SATA NCQ(ATA/ATAPI-4 Command Queuingも同様)が32個であるのに対し、SCSI NCQは255個とかなり多い。また、キューの個数もSATA NCQが1個であるのに対し、SCSI NCQは3個までサポートしている。さらに、Command Queingで取り扱うターゲットデータの位置情報として、SATA NCQはLBAのみを使用するが、SCSI NCQはLBAとRPS(rotational position sensing)情報の2つを使用できる。

 RPSは、最近のハイエンドSCSI HDDに多く搭載されている機能で、先述のRPOに深く関連するものだ。RPSを使用して時々刻々と変化するヘッドの位置(アクチュエータの角度)を監視することにより、高効率のアウトオブオーダー実行が実現される。「アクセス時間を最小化するには、RPSが威力を発揮する。RPSによってアウトオブオーダー実行を行なうのが、現時点で一番効率の良い手法だ(Seagate TechnologyのJoni Clark氏)」。

 このように、SCSI NCQの方が機能面ではずっと優れているが、現行のATA製品の価格レンジを維持しながら、Native Command Queuingを実装するのであれば、この程度の機能制限は致し方ないところだ。また、よほどヘビーなワークロードが発生しない限りは、SATA NCQでも十分実用になり、少なくともCommand Queuingがほとんど機能していない現行のATA製品と比べれば大幅なパフォーマンス向上を見込める。

 現在、Native Command QueuingをサポートするHDDは、「デモ用として先行的に実装した(Seagate TechnologyのJoni Clark氏)」といわれるSeagate TechnologyのBarracuda 7200.7くらいしかないが、2004年に入ればシリアルATAコントローラ、HDDともにNative Command Queuingに対応した製品が続々と登場するものと予想される。サクサク動作を専売特許としていたSCSI HDDだが、Native Command Queuing対応のATA HDDが発売されれば、ATAの世界でもサクサク体験が実現できそうだ。SCSIフリークの皆様も、今さらATAに乗り換えるとは思えないのだが(笑)、いちおう最新トレンドを押さえるという意味でSATA NCQにも注目していただきたい。

□関連記事
【2002年2月26日】次世代ストレージI/F規格「シリアルATA II」のワーキンググループ発足
http://pc.watch.impress.co.jp/docs/2002/0226/intel2.htm

バックナンバー

(2003年12月8日)

[Text by 伊勢雅英]


【PC Watchホームページ】


PC Watch編集部 pc-watch-info@impress.co.jp 個別にご回答することはいたしかねます。

Copyright (c) 2003 Impress Corporation All rights reserved.