SATAとNVMeの通信エラー耐性

SATAとNVMeの通信エラー耐性

この記事で紹介している製品

おことわり

 この記事は、2022年11月にQiitaに投稿した記事を加筆修正したものです。

 また、この記事のオリジナルは日本語で書かれています。記事が日本語以外の言語で表示されている場合、それは機械翻訳の結果です。当社は機械翻訳の精度に責任を負いません。

はじめに

 最近はSATA接続でも一部物理層にPCIeを使うことが多くなりました。マザーボードの仕様や取扱説明書に「SATA XXスロットとPCIe YYスロットは帯域を共有しています」とか「SATA XXスロット使用時はM.2 YYスロットは使用できません」などの制約事項を見つけることがあると思います。これは物理層を共有している箇所があるためです。

 ただ、この「物理層を共有している」というのは「道路を共有している」ということであり、「その道路を使用してコマンドやデータをプロセッサやメモリとドライブの間で転送する手順」とは別の話です。

 実は、この「コマンドやデータをプロセッサやメモリとドライブの間で転送する手順」はSATA接続とNVMe接続では大きく異なり、この違いが通信エラーへの耐性においてSATA接続とNVMe接続の間に大きな差をもたらしています。

 そこで今回の記事では、SSDの接続方法として代表的なSATA接続とNVMe接続について「どちらが通信エラーに強いか」を説明します。なお、説明を簡単にするためこの記事では物理層をPCI Express (PCIe)とします。

まとめ

  • SATA接続はSATAホストコントローラが介在するので突然の通信エラーに耐性あり
  • NVMe接続はエンドツーエンドのメモリアクセスプロトコルなので突然の通信エラーに比較的弱い
  • SSDの接続方法選択時は、ノイズなどの運用環境や、エラー対策の有無や可否について考慮が必要

接続形態からみたSATAとNVMeの違い

 SATA接続したドライブとの通信は通常プロセッサとドライブの間で直接行われることはなく、SATAホストコントローラを介します(図1)。SATAホストコントローラは「郵便局」のイメージです。

 プロセッサからSATAホストコントローラへのアクセスはPCIeバスを介して、SATAホストコントローラとSATAドライブの間の通信はSATAバスを介して行われます。

図1:SATA接続されたドライブとの通信イメージ

 プロセッサは、SATA接続されたドライブにアクセスする際にはこの「郵便局」にコマンドやデータの格納先メモリアドレスを添えて依頼します。「郵便局」であるSATAホストコントローラは、プロセッサからの依頼を受けるとその依頼をドライブに届けます。SATAホストコントローラはデータ転送もプロセッサの代わりに実行します。

 一方NVMe接続されたドライブとの間の通信では、プロセッサがドライブに直接アクセスする(正確には、ドライブのレジスタがマップされたアドレスにアクセスする)ことがあります(図2)。

図2:NVMe接続されたドライブとの通信イメージ

 NVMeでは、システムメモリ上にコマンドキューを用意してそのキューにコマンドを積みます。コマンドを積んだ後は「新しくコマンドを追加した」ことをドライブに伝えるため「ドアベルレジスタ」にアクセスします。呼び鈴を鳴らすイメージです。

 キュー本体はDRAM上に配置できますが、この「呼び鈴」へのアクセスはドライブへのアクセスになります。

 SATA接続ではSATAホストコントローラへのアクセス(レジスタアクセスなので時間がかかる)が多くなるのに対してNVMe接続ではコマンドキューはDRAM上にありレジスタアクセスはドアベルアクセス時のみであること、また1回のドアベルアクセスで複数コマンドをまとめてドライブに伝えられること、などがNVMe接続のほうがSATA接続よりも効率が良い(より高速化可能)とされる理由のひとつです。

通信エラーでドライブにアクセスできなくなると……

 SATAドライブでは、図1のSATAホストコントローラとSATAドライブの間をケーブル接続することが多いです。エンタープライズやデータセンターなどではSATAドライブをコネクタに直接接続しますが、これは体積に対する容量密度向上目的でありケーブル接続と比較した通信エラー対策ではありません。

 一方NVMeドライブは、基板むき出しの形状(M.2など)でもケース入り(U.2など)でもコネクタに直接接続されることがほとんどです。NVMeドライブをケーブル接続することはかなり稀です。これは、NVMeドライブの場合は通信エラーでドライブにアクセスできなくなることが致命的だからです。

 故意にドライブが外されることやドライブ本体の故障などを除くと、システムにおいて突然ドライブにアクセスできなくなる(見えなくなる)要因には、通信ラインにノイズが乗る、コネクタの接続が緩む、などが考えられます。

 このようなドライブに近い通信路でのエラー発生時、プロセッサから見てSATA接続とNVMe接続ではどのように異なるのかを説明します。

SATA接続の場合

 何らかの原因で図3のように通信路にエラーが起きてSATAドライブへのアクセスを喪失したと仮定します。図3では通信路のエラーでSATAドライブにアクセスできないことを通行止めで示しています。

 もしエラーが起きた通信路にプロセッサが直接アクセスすると、プロセッサがその応答を永遠に待ち続けてしまうなどのハングアップに陥ることがあり、致命的なエラーが発生する可能性があります。

 しかしSATA接続の場合、プロセッサはドライブではなくSATAホストコントローラにアクセスするためエラーが起きた通信路に直接アクセスすることはなく、そのようなエラーは発生しません。 

図3:通信路障害でドライブにアクセスできないときのイメージ(SATA接続)

 SATAドライブにコマンドを届けるなどしているのはSATAホストコントローラですので、図3の「通行止め」の影響を受けるのは「郵便局」であるSATAホストコントローラです。プロセッサはSATAドライブへのアクセスは全てSATAホストコントローラを介して行うため、プロセッサがこの「通行止め」を直接観測することはありません。

NVMe接続の場合

 一方NVMe接続の場合、何らかの原因で通信路にエラーが発生してドライブへのアクセスを喪失した場合、プロセッサがそのエラーが発生した通信路にアクセスしてしまう可能性があります。

 これは、NVMe接続の場合はプロセッサがレジスタアクセスでドライブに新規コマンドの存在を伝える(完了したコマンドの情報の取得も行う)からです(図4)。

 もしプロセッサがエラーの発生した通信路にアクセスしてシステム全体がハングアップしてしまうと、最悪の場合システム全体を再起動させなければ復旧できない可能性もあります。

図4:通信路障害でドライブにアクセスできないときのイメージ(NVMe接続)

 NVMeの仕様は、NVMeに準拠したドライブが様々な物理層上で使用されることを想定しています。現に、最初に開発され現在最も一般的なPCIe使用製品に加え、エンタープライズやデータセンター向けではイーサネットを物理層に使用する製品も開発されています。

 その一方で、PCIeのように基本的に基板上での配線とコネクタでシステムに接続されて信号品質が担保される前提の環境では、通信路でのエラーへの耐性が比較的弱くなります。加えて、NVMeではエラー発生時の復帰手順について明確な規定がありません。例えば「誰が未完了のコマンドの再実行をする(先導する)か」などの規定がありません。これはNVMeが物理層の堅牢さなどに依存しているとも言えます。

 このため、NVMe接続のドライブを使用する場合は、システムとドライブの通信や接続にノイズなどが悪影響を及ぼさないようにする必要があります。ケーブル接続やPCIeのエクステンダ経由の接続は避けるべきです。

 ちなみに、ホットプラグやホットリムーブの可否とこの通信エラー発生時の話はまた別です。「ホットプラグやホットリムーブに対応していれば通信エラーに対しても大丈夫だよね」というのは間違いです。

おわりに

 今回の記事では、SSDの接続方法として現在主流のSATA接続とNVMe接続について「通信路上のエラーによるドライブアクセス不能時のプロセッサへの影響」を説明しました。

 SATAとNVMeそれぞれには規格策定の背景があり設計思想や前提などが異なります。具体的に言えば、SATAはケーブル通信、PCIeは基板間通信を前提としていることが挙げられます。この結果、SATA接続ではSATAコントローラを介したアクセスとなり、NVMe接続ではエンドツーエンドのメモリアクセスとなりました。

 このため特にNVMe SSDをPCIe接続で使用する場合、使用するシステムにおいて、熱対策だけでなく通信エラー対策が重要になります。

他社商標について

 記事中には登録商標マークを明記しておりませんが、記事に掲載されている会社名および製品名等は一般に各社の商標または登録商標です。

記事内容について

 この記事の内容は、発表当時の情報です。予告なく変更されることがありますので、あらかじめご了承ください。