NVMe仕様のS.M.A.R.T.属性(3/4)：「現在値」分類と「設定値」分類の属性値

# はじめに
　[前回の記事](https://qiita.com/ken-yossy/items/7a6c05a2c4464778fe17)では、最新NVMe基本仕様（リビジョン2.0b、以降単に「NVMe仕様」と記載）のSelf-Monitoring Analysis and Reporting Technology (S.M.A.R.T.)属性のうち、「警告」分類（※）のものについて説明しました。

　今回は「現在値」分類と「設定値」分類の属性について説明します。

　※注意：この分類は説明の便宜上私が作成したものです

# まとめ
* S.M.A.R.T.属性の「温度(Composite Temperature)」は**実測値とは限らないので注意！**
* 「使用率」と「予備領域量」は値の意味を理解して対策を準備することが重要

# NVMe仕様における「現在値」分類と「設定値」分類のS.M.A.R.T.属性
　NVMe仕様<sup>[1]</sup>に定義されたS.M.A.R.T.属性（正確には"SMART / Health Information"）のうち「現在値」分類と「設定値」分類のものは、以下の5つです。

_表：NVMe仕様における「現在値」分類と「設定値」分類のS.M.A.R.T.属性_
| 名称 | 分類 | 意味（概要） |
|----:|:----:|:--:|
| Composite Temperature | 現在値 | 代表温度（ケルビン） |
| Available Spare | 現在値 | 予備領域量(%) |
| Available Spare Threshold | 設定値 | 予備領域量警告閾値(%) |
| Percentage Used | 現在値 | 使用率(%) |
| Temperature Sensor 1～8 | 現在値 | 温度センサの値（ケルビン） |

　この表を見ると、温度と相対的な割合（百分率）のみであることがわかります。温度も割合も基準（＝設定値）と比較することで意味を持つものであり、この「現在値」および「設定値」というカテゴリに分類できるのも納得です。

# 各属性の内容
　それでは上記温度、予備領域量、そして使用率の3つについて説明します。

## 「SSDの温度」の定義と落とし穴
　"Composite Temperature"と8つの"Temperature Sensor"の値は、いずれも「SSDの温度」と読めそうな値ですが、**実は全く異なります**。

　8つの"Temperature Sensor"の値はSSDが備えるなんらかの温度センサの値とされているのに対し、**"Composite Temperature"は実際の温度（測定値）かどうかさえ実装依存の値**です。

　これはNVMe仕様に明記されています。

> **Composite Temperature:** Contains a value corresponding to a temperature in Kelvins that represents the current composite temperature of the controller and namespace(s) associated with that controller. The manner in which this value is computed is implementation specific and may not represent the actual temperature of any physical point in the NVM subsystem. The value of this field may be used to trigger an asynchronous event (refer to section 5.27.1.3).

_NVMe仕様"Figure 207: Get Log Page – SMART / Health Information Log"より抜粋_

　このように"may **not** represent the actual temperature of any physical point"（＝なんらかの物理的な場所の実温度を示しているとは限らない）と記載されているのです。

　たとえサーマルカメラの測定結果が以下の写真の通りでも、この時のComposite Temperatureの値が摂氏57.6度や摂氏46.6度を示すとは限りません。

![サーマルカメラで測定したM.2 NVMe SSDの温度](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/5c647d84-5f34-cedd-828d-180629b01313.jpeg "サーマルカメラで測定したM.2 NVMe SSDの温度")
_図：サーマルカメラで測定したM.2 NVMe SSDの温度_

　**このComposite Temperatureの定義がNVMe SSDの動作を把握する上で落とし穴になり得ます**。

　というのも、前回説明した温度異常を判断する「温度」や、NVMe仕様が規定する温度管理機能(Host Controlled Thermal Management: HCTM)は、このComposite Temperatureを基準としているからです。

　例えば以下のような事態が起こり得ます。

* 別途測定したSSDの温度がCritical Warningの「温度異常」発出設定温度より低いのに、「温度異常」が発出された
* 別途測定したSSDの温度がCritical Warningの「温度異常」発出設定温度を超えたのに、「温度異常」が発出されなかった
* 別途測定したSSDの温度がHCTMの設定温度より低いのに、HCTMによるサーマルスロットリングが発動した

　これらはすべて**Composite Temperatureとホストが考える「SSDの温度」の相違**が原因である可能性が高いです。

　このような事態を防ぐためには、NVMeのComposite Temperatureが「実測値ではない」ことに注意し、SSDの外部（例：ホスト）からSSDを制御する際にこの値のみに依存しない必要があります。

## 寿命使用率
　寿命使用率(Percentage Used)については、これまで何度か記事にしました（[この記事](https://qiita.com/ken-yossy/items/5454c1e02a0b890448d4)や[この記事](https://qiita.com/ken-yossy/items/1fc34bfce35b11fd58e5)など）。

　この寿命使用率は、この次の「予備領域量」と同じくその計算式（計算方法や計算に登場する要素の詳細）が実装依存であり、ユーザには「いつ増えるか」「何をしたら増えるか」が明確にはわかりません。言えることは単調増加する（減りはしない）ことのみですので、中長期的な変化（いわゆるトレンド）をチェックする程度で良いと考えます。

　最近は、保証期間を「●年（＝保証期間）または残寿命がゼロになるまで（どちらか短い方）」のように表現する製品もあります。「残寿命がゼロになるまで」の部分を「TBWに到達するまで」とする製品もあります。この「残寿命」が、100からPercentage Usedの値を引いたものである可能性もあります。

## 予備領域量
　予備領域量も、寿命使用率と同様、その計算式や「何が予備領域量に影響を与えるのか」が実装依存の項目です。

　Percentage Usedは100を超えることがNVMe仕様上許されており、実際に100を超えてもすぐにSSDが壊れる（読み書きできなくなる）ことはないと考えられます。

　一方でこの予備領域量がゼロという状態は、**何かエラーが起きるなどして予備領域が必要な時に対応できない**という意味で、継続利用はすぐにやめなければならない状態です。

　寿命使用率と異なり予備領域量に対してCritical Warning発出条件としての「閾値」が存在するのはこれが理由です。前回の記事でご紹介した通り、市販の製品ではこの閾値は10 (%)や5 (%)が多いようです。

　NVMe仕様はこの予備領域量閾値をユーザが設定する方法を定めていません。このことから、メーカーが定めた値を尊重し、予備領域量が閾値に到達したらすぐにドライブ交換などの対策を実施すべきです。だからこそCritical Warningの発出条件とされていると考えられます。

# まとめ
　今回の記事では、NVMe基本仕様の最新版（リビジョン2.0b）に定義されているS.M.A.R.T.属性のうち、「現在値」分類と「設定値」分類の属性について説明しました。

　「温度」はわかりやすい値かと思いきや正しく理解しないと仕様上の落とし穴に陥ることがありますので十分な注意が必要です。

　次回は、この連続記事の最後として「累積値」分類の属性について説明します。

# References
[1] NVM Express, _"NVM Express Base Specification,"_ Revision 2.0b, Jan. 2022
 
# ライセンス表記
<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>の下に提供されています。