NVMe Revision 1.4: NVM Sets and its related features

# はじめに
　[先日の記事](https://qiita.com/ken-yossy/items/65310af8e53f8169388f)で、6/10にリリースされたNVM Express（以降NVMeと表記します）の最新仕様であるリビジョン1.4<sup>[1]</sup>について、プレスリリースの内容を基に、その概要を紹介しました。

　とはいえ、プレスリリースに記載されている内容（新機能など）以外にも、既存機能に対して加えられた変更点など、注目が必要な箇所がいくつかあります。

　そこで、以下のような順で、NVMeリビジョン1.4の新機能や注目（注意）が必要な変更点をまとめます。

1. NVM Setとその関連機能
2. 新コマンドと新機能（NVM Setとその関連機能を除く）
3. 既存機能に対する変更点のうち注意が必要なもの

　この記事では、NVMeリビジョン1.4での最大の変更点である**NVM Setとその関連機能**をまとめます。

　なお、先日開催されたFlash Memory Summit (FMS) 2019でのNVMeリビジョン1.4に関する講演資料が、[NVM ExpressのWebサイト](https://nvmexpress.org/)で公開されています<sup>※1</sup>。
　この記事で説明する"Endurance Group"に関する講演資料もあります<sup>[2]</sup>ので、ぜひ読んでみてください。

※1："Resources"→"Documents and Videos"→"Presentations"と辿ったページにある"FMS19_"から始まるタイトルのファイル名群。もしくは、"Events"→"Flash Memory Summit"と辿ったページのFMS 2019に関する記事の部分。

# サマリ
* NVM Setとは、ドライブが備える不揮発性記憶媒体（例：NANDフラッシュメモリ）を分割した各グループのこと
* NVM Setを基本単位とする機能は、Endurance GroupとRead Recovery LevelとPredictable Latency Modeの3つ
* NVM Setがその効果を最大限に発揮するのは、現状では、データセンターやエンタープライズ用途で使われる超大容量・超高密度ドライブであって、店頭で購入できるようなドライブではない

# NVM Set
## NVM Setとは

　[先日の記事](https://qiita.com/ken-yossy/items/65310af8e53f8169388f)において、NVM Setとは以下のようなものであると書きました。

> 　"NVM Set"とは、ドライブ内のメディア（不揮発性記憶媒体、要はNANDフラッシュメモリのこと）を論理的にもしくは物理的に分割したグループのようなものです。

　そして、NVM Set導入の目的は以下のようなことであると書きました。

> 　このNoisy Neighbors問題を根本から解決するためには、各テナント(VM)に対して、他テナント(VM)から**性能的に隔離(isolate)された環境**を提供する必要があります。
>
>　そして、NVM Setが実現を目指しているもののひとつは、まさにこの**隔離環境の提供**なのです。

　つまり、NVM Setとは、「**ドライブが備えるNANDフラッシュメモリをグループ化して、別のグループから（なるべく）性能的な影響を受けないようにするための仕組み**」、ということになります。

　NVM Setの具体的なイメージとしては、NVMe仕様書内の図がわかりやすいです。

![NVM Setイメージ図（NVMe仕様書より引用、"NS"はNamespaceのこと）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/fa526fae-4e28-f1ed-591e-7c290f003587.png)

図1：NVM Setイメージ図（NVMe仕様書より引用、"NS"はNamespaceのこと）

　図1のように、NVM Setは1個以上のNamespaceと特定のNamespaceに割り当てられていない記憶領域("Unallocated")から構成されます。ひとつのNamespaceが複数のNVM Set（に割り当てられた記憶領域）に跨ることはありません。

　このように、NVM Setとは、ドライブが備えるメディア（正確にはコントローラが管理するメディア）を分割した、各グループのことを指します。

　なお、NVMeのNamespaceには"Thin Provisioning"と呼ばれるSCSI由来の機能があります。Thin Provisioningが有効なNamespaceでは、記憶領域は実際にデータが書きこまれた時に割り当てられるため、NamespaceのLBA領域（空間）サイズとある時刻に割り当てられている記憶容量のサイズが等しいとは限りません。
　Thin Provisioningが有効なNamespaceでは、Namespaceに割り当てられている記憶容量のサイズは、その時点での有効データサイズになります。例えば、図1のNS A1のLBA領域サイズが1TBなのに、ある時刻にNS A1に割り当てられている総記憶容量が100GBしかない、という可能性もあります。

## NVM Setの構成方法

　では、NVM Setは物理的にどのように実現するのでしょうか？

　もちろんNVMe仕様書には具体的な実現方法は記載されていません。
　そこで、ここでは考えられる方法をいくつかまとめます。基本的な考え方は、「**並列アクセス可能な単位を基本単位として構成する**」ことです。

![ドライブ内でのNVM Setの構成単位例（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/5c0168d8-6d26-49e3-4adb-c30e0d813edd.png)
図2：ドライブ内でのNVM Setの構成方法例（イメージ）

　図2は、典型的なSSDのアーキテクチャをベースに、NVM Setを構成するいくつかの単位を例示したものです。

　図2では、「並列アクセス可能な単位」として、NANDフラッシュメモリチップそのもの、NANDフラッシュメモリチップ内のプレーン、チャネル、バンク、を示しています。

　最も簡素にNVM Setを構成する方法は、NANDフラッシュメモリチップを単位とする方法です。
　NANDフラッシュメモリチップ単位でNVM Setを構成する場合、SSDが備えるNANDフラッシュメモリのチップ数が、構成できるNVM Setの最大数になります。図2の場合、16が最大になります。

　次にわかりやすいのは、チャネル単位でしょうか。

　図2のアーキテクチャでは、横に並んだ4つのNANDフラッシュメモリチップがその入出力バスをまとめられて（共有して）SSDコントローラに接続されています。このSSDコントローラとNANDフラッシュメモリチップとの接続バスのことを**チャネル (Channel)**と呼ぶことが多いです。一般的に、このチャネル数が多いと同時並列で入出力できるデータサイズが多くなり、性能（特にバンド幅）が高くなります。

　このアーキテクチャであれば、チャネル単位でNVM Setを構成する方法が考えられます。あるNVM Setに1チャネル割り当てれば、そのチャネルに接続されたNANDフラッシュメモリすべてがそのNVM Setに属することになります。

　チャネル単位でNVM Setを構成する場合、SSDが備えるチャネル数が、構成できるNVM Setの最大数になるます。図2の場合、4が最大となります。

　図2の例において「横」のチャネルを単位としてNVM Setを構成できるのであれば、「縦」つまりチャネルと直交する方向のグループを単位にしてもよいと考えるのが普通です。この「縦」のグループは、「バンク (Bank)」や「バンド (Band)」と呼ばれます。

　なお、バンクはいくつかの粒度で定義することが可能です。図2の緑色の枠で囲ったように、NANDフラッシュメモリチップを単位にする方法もあれば、濃い青色の枠で囲ったように、NANDフラッシュメモリチップ内のプレーン (Plane)を単位にする方法もあります。
　さらに、バンク内のNANDフラッシュメモリチップ数やプレーン数によってもバリエーションが考えられます。

　ここではNVM Setを構成する単位として、具体的に4つの単位を示しました。もちろん、複数の単位を組み合わせることも（原理的には）可能ですし、ある単位を複数個割り当てる（例：あるNVM Setにチャネルを2つ割り当てる）ことも可能です。

## 構成方法のメリットとデメリット

　図2を使っていくつかの構成方法を説明しましたが、NVM Setの導入目的と照らし合わせることで、それぞれの構成方法のメリットとデメリットが見えてきます。

　NVM Setの導入目的は、「**性能的に隔離された環境**を提供する」ことでした。つまり、あるNVM Setの性能は、可能な限り他のNVM Setの影響を受けないことが望ましいことになります。

　ここで再度図2を見ながら、上記4つの構成方法のうち、NANDフラッシュメモリチップ単位、およびチャネル単位の2つの方法について、そのメリットとデメリットを考えます。

### NANDフラッシュメモリチップ単位

　NANDフラッシュメモリチップ単位でNVM Setを構成する方法のメリットは、管理が容易であることです。

　しかし、チャネルを他のチップと共有しているため、他のチップがデータ転送などでチャネルを占有している時はそれが完了するまで待たなければなりません。したがって、実現できる「性能の隔離」のレベルが低いことが、最大のデメリットです。

　また、NANDフラッシュメモリチップ単体では、Writeのバンド幅が低いこともデメリットです。

　というのも、現在のSSDは、複数のNANDフラッシュメモリチップを同時並列動作させることでバンド幅を稼いでいるからです。
　例えばWriteの場合、特にTLCやQLC方式でNANDフラッシュメモリを使っている場合、データの書き込み（プログラム）に数ミリ秒かかるため、SSDとしては複数のNANDフラッシュメモリの書き込み動作をオーバーラップさせ、その「数ミリ秒」の間にできるだけ多くのデータを書き込んでいます。例えば、2チップ同時に書き込み動作をさせることができれば、Writeバンド幅は倍になるからです。このため、バンド幅（性能）を上げるには、結局複数のNANDフラッシュメモリチップを割り当てる必要があります。

　さらに、昨今ではNANDフラッシュメモリチップのチップ単位の容量がどんどん大きくなっているため、SSD内のNANDフラッシュメモリチップ数が減少しています。「1TBのSSD」といえば、256Gb (= 32GB)のチップなら32個必要だったのが、最近の1Tb (=128GB)のチップならたった8個で実現できてしまいます。このため、NANDフラッシュメモリチップ単位では、構成できるNVM Setの最大数が減ってしまいます。

　このことから、NANDフラッシュメモリチップ単位でのNVM Setの構成を上手く機能させるためには、**SSDの容量を増やして搭載NANDフラッシュメモリチップ数を増やす**ことと、**他のNANDフラッシュメモリチップと入出力バス（チャネル）を共有しないようなアーキテクチャにする**こと、が必要だとわかります。

### チャネル単位

　チャネル単位でNVM Setを構成する方法のメリットは、NANDフラッシュメモリチップへの入出力バスを他のNVM Setと共有していないことです。このことにより、チャネルに接続されたNANDフラッシュメモリの性能を十分に引き出すことが可能になります。

　しかし、NANDフラッシュメモリチップの容量が増加してSSDが搭載するNANDフラッシュメモリチップ数が減少した結果、チャネル数そのものが減ったり、1チャネルに接続されるNANDフラッシュメモリチップ数が減ることでチャネル単位のバンド幅が低下し、チャネル単位でNVM Setを構成する方法のメリットが薄れてしまいます。

　チャネル単位でのNVM Setの構成を上手く機能させるためには、**1チャネルに接続されるNANDフラッシュメモリチップ数を増やす**ことが重要だとわかります。結局、SSDの容量を増やすことが必要になります。

## NVM Setを有効に機能させるための要件

　2つの構成方法についてそのメリットとデメリットを説明しました。そのデメリットから逆に考えると、NVM Setを有効に機能させるための要件は以下の2点となります。

1. 搭載NANDフラッシュメモリチップ数を増やす（＝容量を増やす）
2. 他のNANDフラッシュメモリチップと入出力バス（例：チャネル）を共有しないようなアーキテクチャにする

　私たちが店頭などで購入できるSSDのチャネル数は高々8で、容量も数TBまでのものが多いです。エンタープライズやデータセンター向けSSDでは、チャネル数が8を超えたり（16以上など）容量が16TBを超えるようなSSDも存在しますが、それでも、図2のアーキテクチャでは、ひとつのドライブ内に作成し同時に存在でき、かつ十分な性能を持ち得るNVM Setの数は高々10個程度となります。

　つまり、このNVM Setという機能は、図2で示したようなこれまで一般的だったアーキテクチャとは**異なる**アーキテクチャのSSDにおいて、最大限その効果を発揮する（目的を達成する）と考えます。
　そのような劇的な変化が起きるのは、まずは、このNVM Setの仕様策定の原点となった課題を抱えているエンタープライズ・データセンター向けSSDだと思われます。

　その変化が起きた暁には、最早"Solid State Drive"とは別の名前で呼ぶほうが適切な「モノ」になっているのかもしれません。例えば以下のようなスター型の構成とか...コントローラとNANDフラッシュメモリチップの接続のための配線が大変なことになりますが。

![図2とは異なるSSDのアーキテクチャ例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/9d538e20-f248-1ba2-d25e-e6008302232f.png)
図3：図2とは異なるSSDのアーキテクチャ例

# NVM Setの関連機能

　ここからはNVM Setを単位とする機能の説明に移ります。

## Endurance Group

　一つ目は"Endurance Group"です。Endurance Groupとは、その名の通り、「寿命の管理単位」です。こちらもNVMe仕様書内の図がとてもわかりやすいので、そちらを引用します。

![Endurance Groupイメージ図（NVMe仕様書より引用）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/3db137aa-9788-0494-4e9f-7a302fe14015.png)
図4：Endurance Groupイメージ図（NVMe仕様書より引用）

　この図4の通り、Endurance Groupは1つ以上のNVM Setから構成されます。NVMe仕様的には、「NVM SetはいずれかのEndurance Groupに属さなければならない」と規定されています。そして、各NVM Setに割り当てられた記憶容量はこのEndurance Group単位でその信頼性が管理されることになります。

　これが何を意味するかというと、例えば「**図4のEndurance Group Yに割り当てられたNANDフラッシュメモリの疲弊が進行していても、Endurance Group Zに割り当てられたNANDフラッシュメモリはフレッシュ状態と変わらない**」ということが起こり得て、かつ「**Endurance Group YとEndurance Group Zの間で、未割り当て領域("Unallocated")の融通ができない**」ということになります。
　端的に言えば、「**ウェアレベリングの範囲がEndurance Group内で閉じる**」ということです。

　この挙動はNVM Setの導入目的とNANDフラッシュメモリの特性を考えると自明です。

　NANDフラッシュメモリは、疲弊が進行すると、様々な要因で様々な性能が低下します。もし図4のEndurance Group YとEndurance Group Zとで未割り当て領域を融通した場合、どちらかのGroupで被った疲弊がもう片方のGroupに持ち込まれることになり、「性能を隔離する」というNVM Setの導入目的が果たせません。

　例えば、Endurance Group YのNVM Setに集中的なアクセスが行われて、Endurance Group Yに割り当てられたNANDフラッシュメモリが強く疲弊した時に、もしEndurance Group ZのNVM Setに割り当てられていたNANDフラッシュメモリと交替させてしまうと、Endurance Group Z側でその疲弊したNANDフラッシュメモリを使用した時に性能が低下してしまうことになります。

　これまでのSSDのアーキテクチャ・アルゴリズムでは、一部のNANDフラッシュメモリの疲弊が極端に進行しないようにドライブが備えるNANDフラッシュメモリ全体で制御（ウェアレベリング）する方法が一般的です。そのような方法を採用している主な要因は、NANDフラッシュメモリそのものの信頼性低下に加えて、ウェアレベリングに使用できるNANDフラッシュメモリの容量が少ないことです。

　この「ウェアレベリングに使用できるNANDフラッシュメモリの容量」のことは、よく"Over Provisioning"と呼ばれます。日本語では「余裕容量」などと訳されます。512GiBのNANDフラッシュメモリを搭載したSSDが「512GBのSSD」として売られている場合、512GiBつまり512×2<sup>30</sup>バイトと512GBつまり512×10<sup>9</sup>バイトの差がおおよそのOver Provisioningになります（実際にはこの容量丸々がウェアレベリングのみに使えるわけではありません）。

　同じ種類のNANDフラッシュメモリを使用し、同じワークロードの下で、より効率良くウェアレベリングを行うには、このOver Provisioningを多くすることが必要です。

　このことから、Endurance Groupを有効に機能させるには、NVM Setを有効に機能させるための要件にもあった、「搭載NANDフラッシュメモリチップ数を増やす（＝容量を増やす）」ということが必要になります。

## Read Recovery Level

　二つ目は"Read Recovery Level"と呼ばれる機能です。

　この機能は、データRead時のリカバリ処理について16段階の「レベル」を導入する機能です。ホストがSSDに対して、Readコマンド処理時にどのレベルを適用するのかを、NVM Set単位で設定します。レベルの値が大きいほどリカバリ処理量が少なく、言い換えれば「誤り訂正を早めに諦める」ということになります。

　ここでもNVMe仕様書の図を引用します。

![Read Recover Level説明図（NVMe仕様書より引用）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/ceadceda-858c-c3ea-c86b-35dcfbeb329d.png)
図5：Read Recover Level説明図（NVMe仕様書より引用）

　図5を含め、NVMe仕様書には陽には記載されていませんが、この「レベル」がRead時のレイテンシの長短を示していることは明白です。つまり、最もリカバリの少ない(Minimum Recovery)レベル15が"Fast Fail"と記載されているのは、最もレイテンシが短いことを期待している、と考えられます。

　このRead Recovery Levelは、NVM Set単位で設定できます。したがって、あるNVM Setの中に作成されたNamespaceは、そのNVM SetのRead Recovery Level設定を継承します。

　ところで、NVMeには、このRead Recovery Levelと似た機能として"Limited Retry"という機能があります。

　Limited Retryも、Read Recovery Levelと同様、処理時のリカバリ処理の努力度合いをホストが指定する機能です。Read Recovery LevelがReadコマンド限定であるのに対して、Limited RetryはWriteコマンドなどでも設定が可能であることが異なります。Read Recovery levelとLimited Retryの対応関係については実装依存と記載されています。

## Predictable Latency Mode

　NVM Set関連機能の最後が、Predictable Latency Modeです。

　NVM Setは、その仕様化議論が始まった当初から、この機能(Predictable Latency Mode)を導入（仕様化）するための機能として議論されていました（提案当初は"Read Determinism"とか"I/O Determinism"などの名称で呼ばれていました）。

　ここでは、このPredictable Latency Modeについて説明します。

### 基本的な考え方

　この機能の基本的な考え方は、NVM Setを単位として、**NVM Setへのアクセス性能が決定的である状態と非決定的である状態を定義してその2つの状態間を遷移させること**、です。
　ここでもNVMe仕様書に記載の図を引用します。

![Predictable Latency Modeイメージ図（NVMe仕様書から引用）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/ad3860a1-1a3e-ded4-5a8a-68ec793e6f12.png)
図6：Predictable Latency Modeイメージ図（NVMe仕様書から引用）

　図6は横軸が時間経過を示していて、右に進むと時刻が進みます。
　図6中の"DTWIN"の期間が「アクセス性能が決定的である状態」で、"NDWIN"の期間が「アクセス性能が非決定的である状態」を示します。

　ホスト側は、例えば、あるNVM Setへのアクセス性能を保証したい（＝決定的にしたい）時間帯にはそのNVM SetがDTWINにあるように制御し、それ以外の時間帯にはそのNVM SetがNDWINにあるように制御する、ということが考えられます。
　データセンターやエンタープライズ環境では、多数のドライブを使用してサービスを運用していますので、提供するサービスに合わせてそれらのドライブ群をスケジューリングすることで、各ドライブをある時刻にDTWINとNDWINのどちらの状態にするか、ということを決めることができると考えます。

　一方ドライブ側は、例えば、DTWINの期間にはGarbage Collection (GC)の停止や誤り訂正処理の一定時間での打ち切りなどを有効にしてアクセス性能が決定的になるようにする、などが考えられます。

　このように、Predictable Latency Modeという機能は、NVM Setへのアクセス性能が決定的である状態を設けることで、システム全体のQuality of Service (QoS)を実現するための、ドライブ側の手段を提供するものです。

### 課題

　ドライブがDTWINの期間に行うことの例として「Garbage Collection (GC)の停止」や「誤り訂正処理の一定時間での打ち切り」を挙げましたが、仕様書にはドライブ（コントローラ）による具体的な実現方法に関する記述はもちろんありません。

　また、ホストは「DTWIN状態に留まることができる最大時間」や「DTWIN状態で処理可能な典型的(typical)なRead/Writeコマンド数」といったNVM Set（コントローラ）の設定値を取得することはできますが、これらの値からドライブの実力（＝実際の性能、能力）が判断（計算）できるとは思えません。

　したがって、ホストは計測など何らかの方法によって、自力で、ドライブの能力を確認しなければならない、ということになります。「ホストが自分のワークロードで性能を確かめる」という意味では正しい姿なのですが。

　加えて、この機能を使いこなすには、`Set Features`コマンドや`Get Log Page`コマンドなどを駆使して各種設定項目を適切に設定する必要があります。設定が適切でないと、ドライブ内の管理が破綻し、アクセス性能の保証ができなくなります。

　このPredictable Latency ModeをはじめとしたNVM Setとその関連機能は、これまでの単なるブロックデバイスとしてのSSDの使い方から大きく一歩踏み出した使い方を実現するための機能です。このため、機能を十分に使いこなすにはドライブの特徴をよく理解したホスト側ソフトウェア（OSやデバイスドライバ含む）が必須です。

　このことも、現状では、これらの機能はデータセンターやエンタープライズ用途で使われる超大容量・超高密度ドライブから使われることになるであろうと考える理由です。

# まとめ
　この記事では、2019年6月10日に発行されたNVMeの最新仕様であるリビジョン1.4について、その最大の変更点（新機能）であるNVM Setとその関連機能の概要を説明しました。

　記事の中でも触れたように、このNVM Setとその関連機能は、現時点ではエンタープライズやデータセンター環境での活用を前提にしたものであって、クライアント環境からは縁遠いものだと思います。

　とはいえ、一部のクライアント環境において、今後それらエンタープライズやデータセンター環境と同等の機能を求められるようになる可能性は大いにあります。その時に、これらの機能がクライアント環境において役に立つのかもしれません。

# リファレンス
[1] NVM Express, _"NVM Express<sup>TM</sup> Base Specification"_, Revision 1.4, June 10, 2019
[2] P. Suhler and M. Carlson, [_"Endurance Group Management: Host control of SSD media organization"_](https://nvmexpress.org/wp-content/uploads/FMS19_Endurance-Group-Management.pptx)[PPT], Flash Memory Summit (FMS) 2019, August 6, 2019
 
# ライセンス
<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>の下に提供されています。