SATAとNVMe、通信エラーに強いのはどちら？

# はじめに
　最近は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バスを介して行われます。

![SATA接続されたドライブとの通信イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/3026b189-957e-f5b1-bf96-433b6261cb67.png "SATA接続されたドライブとの通信イメージ")
図1：SATA接続されたドライブとの通信イメージ

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

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

![NVMe接続されたドライブとの通信イメージ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/2df31367-af03-fd23-975a-645f9dc8f91c.png "NVMe接続されたドライブとの通信イメージ")
図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接続の場合
　SATA接続の場合、何らかの原因でSATAドライブからの応答がなくなりアクセス不能でも、SATAホストコントローラがいるおかげでプロセッサは被害が軽くすみます（図3）。軽いとは言えデータの読み書きが止まることには間違いありませんが……

　この図3では、通信路のエラーでSATAドライブにアクセスできないことを通行止めで示しています。

![通信路障害でドライブにアクセスできない時のイメージ（SATA接続）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/b39e4d08-185a-e541-3b33-12f7aad3b9a4.png "通信路障害でドライブにアクセスできない時のイメージ（SATA接続）")
図3：通信路障害でドライブにアクセスできない時のイメージ（SATA接続）

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

## NVMe接続の場合
　NVMe接続の場合、何らかの原因でドライブからの応答がなくなりアクセス不能になると、プロセッサがそのアクセスできないドライブにアクセスしようとする可能性があります。

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

![通信路障害でドライブにアクセスできない時のイメージ（NVMe接続）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/0606eb0e-3fc5-6a18-33d7-7218df3980e5.png "通信路障害でドライブにアクセスできない時のイメージ（NVMe接続）")
図4：通信路障害でドライブにアクセスできない時のイメージ（NVMe接続）

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

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

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

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

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

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

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

# ライセンス表記
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />この記事は<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンス</a>の下に提供されています。