SSDのS.M.A.R.T.を調べてみた(3/3)：NVMe SSDの場合

# はじめに
　[前々回](https://qiita.com/ken-yossy/items/ecb827f7a60b3e27588e)から、SSDの健康状態把握を目的とした情報の収集および取得機能である"Self-Monitoring, Analysis and Reporting Technology (S.M.A.R.T.)"について、全3回予定でまとめています。

1. SSDにおけるS.M.A.R.T.の概要 ← [前々回](https://qiita.com/ken-yossy/items/ecb827f7a60b3e27588e)
2. SATA (ATA Command Set; ACS)におけるS.M.A.R.T. ← [前回](https://qiita.com/ken-yossy/items/7a89e7bc65835f70686e)
3. NVMeにおけるS.M.A.R.T. ← 今回

　最後となる今回（第3回）は、NVMe SSDのS.M.A.R.T.機能についてまとめます。

　なお、ここでの説明はNVMeリビジョン1.3d<sup>[1]</sup>に基づくものになります。リビジョンが異なると仕様が異なる可能性がありますので、最新仕様もしくは使用する製品が準拠するリビジョンの仕様を確認することが必要です。

# 今回のサマリ
* NVMeのS.M.A.R.T.機能は、自己診断機能、監視機能、ホストへの報告機能、そして属性、の全機能を備えている
* NVMeのS.M.A.R.T.属性は、**種類と内容が仕様で定義されているが、「（NANDフラッシュメモリの）Program / Erase回数」のような属性はない**
    * SATA (ACS)のS.M.A.R.T.属性のような"ID"は割り振られていない
* NVMeは、SATA (ACS)と異なり、一部のS.M.A.R.T.属性について閾値超過や不足、および状態変化が発生した時にドライブから通知を受けるように設定可能

# NVMe SSDにおけるS.M.A.R.T.機能とは
　NVMeが備えるS.M.A.R.T.機能も、機能の全体像は前回と前々回にご説明したものと同じです（図1）。

![SSDにおけるS.M.A.R.T.の位置づけと構成機能（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/026dee4c-5e07-ebc8-2d56-7acc2ad92124.png "SSDにおけるS.M.A.R.T.の位置づけと構成機能（イメージ）")
図1：SSDにおけるS.M.A.R.T.の位置づけと構成機能（イメージ）

　つまり、NVMeのS.M.A.R.T.機能も、ドライブの自己診断機能、属性、属性値に対する監視機能、そしてホストへの報告機能から構成されています。

　以下、NVMeにおける各機能について説明します。

# 主要コマンド
　NVMeでは、表1に示したコマンドが定義されています。

表1：NVMeリビジョン1.3dで定義されているS.M.A.R.T.関連コマンド

| コマンド名 | 対応するS.M.A.R.T.機能 | 内容 |
|----------:|:----------------------|:------|
| Get Log Page | ホストへの報告機能 | S.M.A.R.T.属性およびエラー等のイベントログをドライブから取得する |
| Asynchronous Event Request | ホストへの報告機能 | S.M.A.R.T.属性の値が予め設定した閾値を超えたときにホストに通知するよう、ドライブに要求する |
| Device Self-test | 自己診断機能 | ドライブの自己診断機能の実行や停止を指示する |
| Set Features | 監視機能 | S.M.A.R.T.属性に関するホストへの通知の有効無効や通知する閾値をドライブに設定する |

　この表1に示した通り、各コマンドはそれぞれ図1に示したいずれかの機能に対応しています。

# 自己診断機能
　NVMeにおける自己診断機能は、`Device Self-test`コマンドで実行します。

　SATA SSDが準拠するACS同様、NVMeの`Device Self-test`コマンドにおいても時間の長短が異なる2つの自己診断機能のうちどちらかを指定して実行します。

表2：NVMe仕様における自己診断機能の選択方法（`Device Self-test`コマンドのCDW10）
![NVMe仕様における自己診断機能の選択方法（Device Self-testコマンドのCDW10）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/78a6d515-50d5-322f-1a0a-7f2c274a50b8.png "NVMe仕様における自己診断機能の選択方法（Device Self-testコマンドのCDW10）")

　表2中の"short device self-test"が短時間の自己診断機能に、"extended device self-test"が長時間の自己診断機能に相当します。

　例えばWestern DigitalのSSD Dashboardでは、図2のように、NVMe SSDの自己診断を実行するための機能を備えています（赤四角部分）。

　なお、図2の青四角部分に見えているのはNVMeにおけるS.M.A.R.T.属性の一部です。

![Western Digital SSD Dashboardにおける自己診断実行機能（NVMe SSDの例、赤四角部分）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/6da13af5-7a07-3960-1230-ad5204f39f2f.png "Western Digital SSD Dashboardにおける自己診断実行機能（NVMe SSDの例、赤四角部分）")
図2：Western Digital SSD Dashboardにおける自己診断実行機能（NVMe SSDの例、赤四角部分）

# 監視機能
　NVMeのS.M.A.R.T.機能でも、S.M.A.R.T.属性に対する監視が可能です。監視対象の属性は予め規定されていて、監視時の閾値は一部の属性に限りホストから設定可能です。

　表3は、S.M.A.R.T.属性を取得するための`Get Log Page`コマンドで取得可能な、監視対象属性の状態を示すデータの仕様です。

表3：NVMeにおける監視対象S.M.A.R.T.属性（`Get Log Page`コマンドで取得できる内容）
![NVMeにおける監視対象S.M.A.R.T.属性（Get Log Pageコマンドで取得できる内容）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/ec641d94-e591-f041-d9af-441f85b52cb7.png "NVMeにおける監視対象S.M.A.R.T.属性（Get Log Pageコマンドで取得できる内容）")

　表3の通り、このリビジョンのNVMe仕様では、5つのS.M.A.R.T.属性が監視対象となっています。

* 予備領域の容量
* 基準温度
* ドライブの信頼性
* ドライブへの書き込み可否
* 揮発性メモリのバックアップ装置の状態

　なお、これらとは別に、「温度上昇（下降）による電力モードの遷移」いわゆるサーマルスロットリング(Thermal Throttling)についてもS.M.A.R.T.属性が存在します。サーマルスロットリングに関する閾値温度は、ドライブが対応していればホストから設定することが可能ですが、閾値を超えたことや下回ったことそのものをホストに通知する機能は持たず、またホストからの操作によらずSSDが内部で動作を変更します。このため、ここではS.M.A.R.T.における監視対象属性には含めていません。

　以下、それぞれについて簡単に説明します。

　まず予備領域の容量は、表4のように、`Get Log Page`コマンドで取得できるS.M.A.R.T.属性の情報と一緒に、閾値の情報を取得可能です（"Available Spare Threshold"のこと）。

表4：予備領域の容量に関する閾値（`Get Log Page`コマンドで取得できる内容）
![予備領域の容量に関する閾値（Get Log Pageコマンドで取得できる内容）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/b552ba35-29ac-fe6a-1cd9-b97c33ab0d2e.png "予備領域の容量に関する閾値（Get Log Pageコマンドで取得できる内容）")

　"Available Spare"が現在の予備領域の容量（百分率）であり、この値が"Available Spare Threshold"を下回っていないかどうか監視されています。

　この予備領域の容量の閾値、つまり"Available Spare Threshold"の値をホストが直接変更する方法は定められていません。

　次に、温度の閾値は、`Set Features`コマンドで設定可能です。

　具体的には、表5のデータ構造を用いて設定したい情報を作成し、`Set Features`コマンドを用いてドライブに設定します。

表5：温度に関する閾値設定方法（`Set Features`コマンドのCDW11に設定する内容）
![温度に関する閾値設定方法（Set FeaturesコマンドのCDW11に設定する内容）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/d44f9a3c-25c0-1411-03d1-66a9d11d28b4.png "温度に関する閾値設定方法（Set FeaturesコマンドのCDW11に設定する内容）")

　例えば、Composite Temperatureが摂氏90度を超えているかどうかをドライブに監視させる場合、`THSEL`に`0`を、`TMPSEL`に`0`を設定し、`TMPTH`には`363`（絶対温度で指定するため273+90=363）を設定して、`Set Features`コマンドを発行します。

　同様に、Composite Temperatureが摂氏-5度を下回っているかどうかをドライブに監視させる場合、`THSEL`に`1`を、`TMPSEL`に`0`を設定し、`TMPTH`には`268`（絶対温度で指定するため273-5=268）を設定して、`Set Features`コマンドを発行します。

　残りの3つ、ドライブの信頼性、ドライブへの書き込み可否、揮発性メモリのバックアップ装置の状態については、状態変化の閾値はホストから設定できません。つまり、ドライブ独自の判断基準で判断され、状態変化が発生し、ホストに通知されます。

# ホストへの報告機能
　NVMeでは、S.M.A.R.T.属性の値と一部の属性について閾値超過や不足が発生しているかどうか、およびその他ドライブの健康状態に関する情報をホストが取得するための方法として、`Get Log Page`コマンドが用意されています。

　図2で示したようなツールにおけるS.M.A.R.T.属性表示は、`Get Log Page`コマンドを使用して取得した情報を表示しています。

　加えて`Get Log Page`コマンドでは、ドライブが観測したエラーのログも取得できます。

　これは、"Error Information"と呼ばれるログで、ホストから発行されたコマンドの処理時に発生したエラーであれば、エラーが発生した際のLBAといった情報も取得可能です。

　NVMeではまた、`Get Log Page`コマンドとは別に、予め`Asynchronous Event Request`コマンドを使用することで、一部の属性について閾値超過や不足、および状態変化が発生した時にドライブから通知を受けるように設定可能です。この機能はACSにはない機能です。

　`Asynchronous Event Request`コマンドを使用してホストから通知を受ける場合のホストとドライブの処理の様子は、図3のシーケンス図のようになります。

![Asynchronous Event Requestを使用して一部S.M.A.R.T.属性の閾値超過等の通知を受ける方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/9fbca48f-7135-02a2-9cb7-d3a30965056a.png "Asynchronous Event Requestを使用して一部S.M.A.R.T.属性の閾値超過等の通知を受ける方法")
図3：`Asynchronous Event Request`コマンドを使用して一部S.M.A.R.T.属性の閾値超過等の通知を受ける方法

　一部S.M.A.R.T.属性の閾値超過・不足や状態変化について、その事象発生時にドライブから通知を受けたい場合、ホストは予め`Asynchronous Event Request`コマンドをドライブに発行します（図3の(1)）。

　この`Asynchronous Event Request`コマンドは、すぐにはレスポンス（Completionのこと）が返ってこないことが特徴です。

　その後時間が経過し、一部S.M.A.R.T.属性の閾値超過・不足や状態変化が発生した場合（図3の(2)）、デバイスは、予めホストから送られていた`Asynchronous Event Request`コマンドに対するレスポンスという形式でホストに通知を行います（図3の(3)）。

　ホストは、受信した`Asynchronous Event Request`コマンドのレスポンスの内容を解析し、どのS.M.A.R.T.属性が閾値超過・不足を起こしたのか、もしくは状態に変化が起きたのかを判断します。

![Asynchronous Event Requestコマンドのレスポンス解釈方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/a22eb353-8300-6c68-1f53-07373a7b8c05.png "Asynchronous Event Requestコマンドのレスポンス解釈方法")
図4：`Asynchronous Event Request`コマンドのレスポンス解釈方法

　具体的には、まず`Asynchronous Event Request`コマンドのレスポンスの`Asynchronous Event Type`フィールドを見て、S.M.A.R.T.情報を示す値（図4の赤四角）かどうかをチェックします。そしてS.M.A.R.T.属性を示す値だった場合は、さらに`Asynchronous Event Information`フィールドを見て、発生した事象を突きとめます（図4の青四角）。

　その後ホストは、必要に応じて`Get Log Page`コマンドを発行してS.M.A.R.T.属性を取得します（図3の(4)および(5)）。

# S.M.A.R.T.属性
　NVMeリビジョン1.3dに定義されているS.M.A.R.T.属性は表6の通りです。各属性の種類は、ACSのS.M.A.R.T.属性を分類した際にも使用した分類を使用しています。なお、NVMeが定義したSMART属性には、ACSのS.M.A.R.T.属性のような"ID"は振られていません。

表6：NVMeリビジョン1.3dに定義されているS.M.A.R.T.属性一覧
![NVMeリビジョン1.3dに定義されているS.M.A.R.T.属性一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/708b1a62-f63e-b3ff-cebf-26279cdda49e.png "NVMeリビジョン 1.3dに定義されているS.M.A.R.T.属性一覧")

　「ホストがWriteした累積データ量」については、アクセスパターン（ワークロード）に関する情報が欠落しているため寿命計算には使用できないと判断し、「その他統計情報」に分類しています。

　ACSと同様に、NVMeについても表6のS.M.A.R.T.属性の数を種類別に集計すると、表7のようになります。

表7：NVMeのS.M.A.R.T.属性の種類別属性数
![NVMeのS.M.A.R.T.属性の種類別属性数](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/f17111d9-8cd4-98fa-98a6-e1b66e024171.png "NVMeのS.M.A.R.T.属性の種類別属性数")

　各社のSATA SSDにおけるS.M.A.R.T.属性の傾向と比較すると、NANDフラッシュメモリに関連する属性、特にNANDフラッシュメモリのエラーを直接示す属性がないことが特徴です。また、SATA SSDのS.M.A.R.T.属性に見られた、「（NANDフラッシュメモリの）Program / Erase回数」のような属性も存在しないことがわかります。

　唯一直接的に寿命を表している`Percentage Used`という属性について、NVMe仕様では、「メーカー独自の見積もり」であり「寿命を計測する方法はJESD218Aを参照すること」と記載しています。そのJESD218Aの改訂版であるJESD218B.01<sup>[2]</sup>には、SSDの寿命の見積もりについて以下のように記載されています。

> Using the appropriate workload (see JESD-219), the SSD manufacturer may determine the relationship between host writes and NAND cycles, the latter being the number of program/erase cycles applied to any NAND block, and use this relationship to estimate the SSD endurance rating. 
>
> If the SSD employs more than one type of NAND component with different cycling capabilities, then a separate relationship should be obtained for each type of NAND. If operating the SSD to the desired TBW is impractical because time required would be excessive, then the relationship between NAND cycles and host writes should be extrapolated. In performing the extrapolation, any nonlinearities in SSD operation, such as those resulting from a reduced cycling pool at extended cycles, should be accounted for.
>
> _"Annex E (informative): Estimation of SSD Endurance Rating"_より引用

　一つ目の段落では、「メーカーは適切なワークロードを用いてホストからの書き込み量とNANDのProgram / Erase回数の関係を定め、その関係をSSDの寿命の見積もりに使用できる」と記載しています。

　一方で二つ目の段落では、単純な外挿ではSSDの寿命見積もりが行えないことを示しています。これは、NANDフラッシュメモリの多値化や、いわゆるSLCキャッシュのようにTLCのNANDフラッシュメモリをSLCで使用する技術など、SSDでのNANDフラッシュメモリ制御の高度化による寿命計算の複雑化を踏まえた記述だと考えられます。

　以上のことから、NVMeのS.M.A.R.T.属性に、寿命や、NANDフラッシュメモリに関する事象（Eraseエラーなど）、加えてアクセスパターン（ワークロード）を含めた寿命計算用と考えられる属性、などが存在しないのは、上記JESD218B.01の記述も踏まえ、ユーザに混乱を招かずにより直感的で精度の高い寿命を提示できるようにした、と考えることもできます。

　実際、NVMeでの寿命に関するS.M.A.R.T.属性の数と、各社のSATA SSDでの寿命に関するS.M.A.R.T.属性の数（表7中の青）はほぼ同じです。

　なお、JESD218B.01の記述より、`Percentage Used`という属性の計算にはNANDフラッシュメモリのProgram / Erase回数が用いられていることは間違いないと考えられます。NANDフラッシュメモリのProgram / Erase回数には平均回数や最大回数など複数の指標が存在し、メーカーや寿命の計算方法によって値の組み込み方法は変化しますが、いずれにしても、`Percentage Used`とNANDフラッシュメモリのProgram / Erase回数の間には関係がある、と言えます。

　そして、もう一つの大きな違いは、温度に関する属性が各社のSATA SSDのS.M.A.R.T.属性の傾向と比較して非常に多いことです。これは、NVMe SSDが発熱に関して多大な関心を払っていることのあらわれと考えることができます。

　それらの属性のうち、サーマルスロットリングの発動時間に関する属性は、属性そのものに対する閾値はホストから設定できません、ドライブがHost Controlled Thermal Management (HCTM)に対応している場合に、サーマルスロットリングの発動に関する温度を、ホストからSet Featuresコマンドで設定可能です。

　NVMeのHCTMによるサーマルスロットリングは、例えば図5のようなイメージで制御されます。

![NVMeのサーマルスロットリング(HCTM)の制御例（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/a0ab932c-d5d3-1008-8728-4ae137995711.png "NVMeのサーマルスロットリング(HCTM)の制御例（イメージ）")
図5：NVMeのサーマルスロットリング(HCTM)の制御例（イメージ）

　NVMeのHCTMによるサーマルスロットリングでは、TMT1およびTMT2と呼ばれる温度を制御に用います。ドライブがHCTMに対応していれば、このTMT1とTMT2を、ホストは`Set Features`コマンドで設定可能です。

　このNVMe SSDのサーマルスロットリングに関する温度設定については、[別記事](https://qiita.com/ken-yossy/items/0b40dc87fc5ae6d6e53e)でも説明していますので、そちらもご覧ください。

# まとめ
　この記事では、SSDの健康状態把握を目的とした情報の収集および取得機能として幅広く用いられている"Self-Monitoring, Analysis and Reporting Technology (S.M.A.R.T.)"について、NVMe SSDが準拠するNVMeにて定義されている内容を説明しました。

　SATAが準拠するATA Command SetのSMART Feature SetとNVMeは、共にS.M.A.R.T.機能を備えているものの、細かい機能、特にS.M.A.R.T.属性の内容や傾向には大きな違いがあります。
　これまでSATA SSDを使用し、S.M.A.R.T.によってSSDの健康状態をモニタリングしていた場合、NVMeのS.M.A.R.T.属性には戸惑われるかもしれません。

　とはいえどちらもS.M.A.R.T.の本質には変化ありませんので、SATA SSDとNVMe SSDの間でのS.M.A.R.T.機能の違いをうまく捉えていただければと思います。

# References
[1] NVM Express, _"NVM Express Base Specification"_, Revision 1.3d, March, 2019
[2] JEDEC, _"Solid-State Drive (SSD) Requirements and Endurance Test Method"_, JESD218B.01, June 2016

# ライセンス表記
<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>の下に提供されています。