NVMe仕様のS.M.A.R.T.属性(4/4)：「累積値」分類の属性値

# はじめに
　これまで3回の記事で、最新NVMe基本仕様（リビジョン2.0b、以降単に「NVMe仕様」と記載）のSelf-Monitoring Analysis and Reporting Technology (S.M.A.R.T.)属性について、その[概要](https://qiita.com/ken-yossy/items/3c5bc733d34450e452b6)を説明したうえで、[「警告」分類のもの](https://qiita.com/ken-yossy/items/7a6c05a2c4464778fe17)、そして[「現在値」分類および「設定値」分類のもの]()、について説明してきました。

　今回は最後として、「累積値」分類<sup>※</sup>の属性について説明します。

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

# まとめ
* 「コマンド数」や「データサイズ」などの属性値は「対象コマンド」や「値の単位」に注意
* 「エラー数」など異常系属性値の変化にはシステムとしての異常が潜んでいる可能性あり

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

_表：NVMe仕様における「累積値」分類のS.M.A.R.T.属性_
| 名称 | 分類 | 意味（概要） |
|----:|:----:|:--:|
| Data Units Read / Written | 累積値 | 読み出し・書き込みデータ量 |
| Host Read / Write Commands | 累積値 | 読み出し・書き込みコマンド数 |
| Controller Busy Time | 累積値 | コントローラ稼働時間 |
| Power Cycles | 累積値 | 電源投入回数 |
| Power On Hours | 累積値 | 電源投入時間 |
| Unsafe Shutdowns | 累積値 | 非正規電源断回数 |
| Media and Data Integrity Errors | 累積値 | メディアエラー回数 |
| Number of Error Information Log Entries | 累積値 | エラーログ数 |
| Warning Composite Temperature Time | 累積値 | 警告(Warning)温度超過時間 |
| Critical Composite Temperature Time | 累積値 | 警告(Critical)温度超過時間 |
| Thermal Management Temperature 1/2 Transition Count | 累積値 | 設定温度(TMT1/2)超過回数 |
| Total Time For Thermal Management Temperature 1/2 | 累積値 | 設定温度(TMT1/2)超過時間 |

　このように、累積の回数や時間そしてデータ量が記録されています。

# 各属性の内容
## ホストからのデータ読み書きに関する属性
　"Data Units Read / Written"と"Host Read / Write Commands"は、ドライブがホストから受領したコマンドの記録です。

　"Commands"は単純な累積コマンド数（単位は「個」）です。そして"Data Units"はそれらコマンドで読み書きされたデータの累積サイズを示します。ただし、**サイズのほうは数値が丸められていることに注意が必要**です。

　例えば、Data Units Readは以下のように定義されています。

> **Data Units Read:** Contains the number of 512 byte data units the host has read from the controller as part of processing a SMART Data Units Read Command; this value does not include metadata. This value is reported in thousands (i.e., a value of 1 corresponds to 1,000 units of 512 bytes read) and is rounded up (e.g., one indicates that the number of 512 byte data units read is from 1 to 1,000, three indicates that the number of 512 byte data units read is from 2,001 to 3,000).（以降略）
>
> _NVMe仕様"Figure 207: Get Log Page – SMART / Health Information Log"より_

　つまり、"Data Units"の「ユニット(unit)」つまり単位サイズはセクタサイズにかかわらず「512バイト」であり、かつ「1000ユニット未満を切り上げ(round up)た1000ユニット単位の値」がこの属性値である、ということです。

　NVMeでは1セクタのサイズは512バイトの整数倍ですので、前者（単位サイズが512バイトであること）では丸め誤差は生じません。しかし後者は「1ユニットでも1000ユニットでもこの属性値は"1"になる」ということですので、この属性値を使用する際には蓄積する（蓄積した）丸め誤差への配慮が必要となります。

　もう一つ注意すべきことは、**この属性値にカウントされるコマンドはReadコマンドやWriteコマンドだけではない**ということです。しかも、NVMe仕様のバージョンにも依存します。

表："Data Units Read / Written"と"Host Read / Write Commands"の対象コマンド
| | NVMe 1.4b<sup>[2]</sup> | NVMe 2.0b<sup>（注1）</sup> |
|:-:|:-:|:-:|
| Data Units Read対象コマンド | Compare, Read, Verify | Compare, Read, Verify<br>(SMART Data Units Read Command) |
| Host Read Commands対象コマンド | Compare, Read | Compare, Copy, Read<br>(SMART Host Read Command) |
| Data Units Write対象コマンド | Write | Copy, Write<br>(User Data Out Command) |
| Host Write Commands対象コマンド | Write | Copy, Write<br>(User Data Out Command) |

注1：NVMeリビジョン2.0からは「NVM Command Set仕様<sup>[3]</sup>」で定義されている

　仕様書を調べた際に「ReadコマンドとWriteコマンドだけじゃないの！？」と驚きましたが、このように定義されています。

　CompareやVerifyコマンドは、RAID構成時に（RAIDコントローラが）発行しそうなコマンドです。ホストがドライブに発行したコマンド数とドライブのこれら属性値の間に明らかな差がある場合は、上記のような「対象コマンド」の定義に着目すると手掛かりが見つかる可能性があります。

## ドライブ（コントローラ）の稼働履歴に関する属性
　以下の属性値は、全てドライブ（コントローラ）の稼働履歴を示すものです。

　いずれも時間や回数に関するものですね。

_表：NVMe仕様におけるドライブ（コントローラ）の稼働履歴に関する属性S.M.A.R.T.属性_
| 名称 | 分類 | 意味（概要） |
|----:|:----:|:--:|
| Controller Busy Time | 累積値 | コントローラ稼働時間 |
| Power Cycles | 累積値 | 電源投入回数 |
| Power On Hours | 累積値 | 電源投入時間 |
| Unsafe Shutdowns | 累積値 | 非正規電源断回数 |

　Controller Busy Timeは、発行されたコマンドをコントローラが処理していた通算時間が記録されています。単位は「分」です。

　一方、Power On Hoursは「電源オン」時間です。単位は名前の通り「時間」です。ただしコントローラが一部の低消費電力モードに遷移していた時間はこの値には含まれません。

　Power Cyclesは、実質、電源投入つまり電源をオンした回数です。「サイクル」という言葉は「電源断状態から電源投入状態への遷移」という流れを示していますが、わかりやすく言えば「電源をオンした回数」となります。

　そして最後のUnsafe Shutdownは、直訳すれば「安全ではない電源断（の回数）」となります。「何をすると『安全ではない』のか」というと、端的に言えば「ドライブ（コントローラ）の準備が完了していない内に電源を切ること」です。

　ここでは詳しくは説明しませんが、NVMe仕様ではホストがドライブの電源を切る際に行うべきドライブ（コントローラ）との間での手順を規定しています。その手順が守られた場合が「正規の電源断」であり「安全な電源断」です。逆に、その手順に則らない全ての電源断は「安全ではない電源断」となります。

　**これらの属性値の中で要注意なのはPower CycleとUnsafe Shutdownです。**

　これらの属性値に例えば「想定より多い」とか「急に増えだした」などの変化が起きた場合、システムの電源周りに何らかの異変が発生している可能性があります。なぜなら、ドライブの電源制御はシステムが行うものであり、それが例えば「安全ではない電源断」を繰り返しているのであればシステムに電源系を含めて何らかの不具合が発生している可能性が高いからです。

## エラー発生に関する属性
　エラーに関する属性は、Media and Data Integrity ErrorsとNumber of Error Information Log Entriesの2つです。

　後者のNumber of Error Information Log Entriesはその名前の通り、エラー情報(Error Information)の保持数を示します。そのエラー情報は、S.M.A.R.T.属性値と同じく`Get Log Page`コマンドで取得可能です。

　このエラー情報にはとても重要な注意事項があります。それはNVMe仕様中の次の一文です。

> The controller should clear this log page by removing all entries on power cycle and Controller Level Reset.
>
> _NVMe仕様5.16.1.2 Error Information (Log Identifier 01h)より_

　ユーザ視点で言えば「電源切ると（エラー情報は）全て削除される」と書いてあります。これはつまり「**Number of Error Information Log Entriesが非ゼロであれば電源を切らずにエラー情報を吸い出さなければならない**」ことを意味します。電源を落としてしまうとゼロに戻ります。このため、このエラー情報数は常時監視して非ゼロであることを発見したらすぐにエラー情報を吸い出すようにすべきです。

　もう一つのMedia and Data Integrity Errorsは、ドライブ内で発生したデータエラーの数（発生数）を示します。この属性値が増える対象のエラー（種類）は製品に依存しますので、メーカーにこの属性値が増える事象を確認したほうが良いです。

　これらの属性値が非ゼロであることは「（少なくとも）ドライブに何らかの異常が発生していてそれにドライブが気づいている」状態であることを意味します。「サイレントエラー」などと呼ばれる「気づかずに進行する（発生する）エラー」と比較すると「気づいているだけマシ」と言える状態ですので、できるだけ早期にドライブの使用を中止するように対応すべきです。

## 温度に関する属性
　温度に関する属性には、2種類6つの属性が定義されています。

### Warning / Critical Composite Temperature Time
　この値は、Composite Temperatureという温度（これもS.M.A.R.T.属性のひとつ）が、それぞれ"Warning Composite Temperature (WCTEMP)"と"Critical Composite Temperature (CCTEMP)"と呼ばれるドライブ固有の設定値以上を記録した累積時間を指します。単位は両属性とも「分(minute)」です。

　WCTEMPとCCTEMPは`Identify`コマンドで取得可能なユーザには変更できない値です。つまり、**WCTEMPとCCTEMPにはドライブにとり本当に「やばい」温度が設定されています**。

　NVMe仕様では、CCTEMPを以下のように説明しています。

> indicates a critical overheating condition (e.g., may prevent continued normal operation, possibility of data loss, automatic device shutdown, extreme performance throttling, or permanent damage)
>
> _NVMe仕様"Figure 275: Identify – Identify Controller Data Structure, I/O Command Set Independent"より_

　「例えば、通常動作継続困難、データ喪失、自動デバイスシャットダウン、極端な性能抑制、永続的な損害発生、などを引き起こす可能性がある致命的な過熱状態を示す」とあります。例示内容を見ると、Composite TemperatureがCCTEMPを超えているという状態は一刻も早い解消が必要な状態であることが良く分かります。

　一方WCTEMPは、もう少し柔らかく「Composite Temperatureがこの値(WCTEMP)よりも小さい値になるように努めるべきである」と説明されています。

　また、前々回説明したS.M.A.R.T.属性"Critical Warning"の「温度異常」発出条件には「温度が上限閾値を超えた」というものがあります。NVMe仕様にはこの「上限閾値」のデフォルト値はWCTEMPであるとの記載もあります。

　前々回の説明図を使用してWCTEMPとCCTEMPの関係（例）を示すと図1のようになります。

![WCTEMPとCCTEMPの関係](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/08c38280-03d6-4c2b-a97b-de482ba7d895.png "WCTEMPとCCTEMPの関係")
図1：WCTEMPとCCTEMPの関係例

　図1のように、基本的にWCTEMPよりもCCTEMPのほうが高い温度に設定されます。

　以上より、Warning / Critical Composite Temperature Timeは、ドライブの温度(Composite Temperature)がこれら「やばい」温度以上を記録した累積時間であることがわかります。

　これらの累積値が非ゼロである、さらには増える傾向にある、ということは、ドライブの動作環境が適切でなくドライブがその能力を発揮でてきていない可能性が高く、動作環境の改善が必要であることを示します。

### Thermal Management Temperature 1/2 Transition CountとTotal Time For Thermal Management Temperature 1/2
　この2種類4つの累積値は、ユーザが設定可能な温度閾値に関する属性値です。"Thermal Management Temperature 1/2 Transition Count"の単位は「回数」、"Total Time For Thermal Management Temperature 1/2"の単位は「秒(second)」です。

　ただし、その内容の解釈には注意が必要です。**属性名からは「温度に関する属性値」に見えるのですが、実はこの4つの属性値はNVMe仕様上「温度」そのものではなく「コントローラが行うサーマルスロットリング」の記録です**。

![Thermal Management Temperature Transition CountとTotal Time For Thermal Management Temperatureの意味](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/901e576f-5f6f-a38a-c343-d83fc70a7c78.png "Thermal Management Temperature Transition CountとTotal Time For Thermal Management Temperatureの意味")
図2：Thermal Management Temperature Transition CountとTotal Time For Thermal Management Temperatureの意味

　図2は、以前NVMe仕様が定義するサーマルスロットリング(HCTM)の説明で使用した図に説明文を追加したものです。

　図2に記載した通り、これら4つの属性値は、TMT1やTMT2という温度そのものではなく、温度変化により行われるサーマルスロットリングの状態を記録したものです。

　NVMe仕様におけるThermal Management Temperature 1 Transition Countの記述内容（一部）を引用すると下記の通りです。

> **Thermal Management Temperature 1 Transition Count:** Contains the number of times the controller transitioned to lower power active power states or performed vendor specific thermal management actions while minimizing the impact on performance in order to attempt to reduce the Composite Temperature because of the host controlled thermal management feature.（以降略）
>
> _NVMe仕様"Figure 207: Get Log Page – SMART / Health Information Log"より_

　"the number of times the controller transitioned to lower power active power states or performed vendor specific thermal management actions"と書かれており、「温度(Composite Temperature)がTMT1を超えた回数」ではありません。

　例えば、「弱いスロットリング」を実装していないコントローラでは、Thermal Management Temperature Transition 1 Countは記録されず（0のまま増えず）、またTotal Time For Thermal Management Temperature 1も記録されない（0のまま増えない）、となります。

　またこの定義からは、「強いスロットリングから弱いスロットリングへの遷移」時にもThermal Management Temperature Transition 1 Countが増えるように読めます。

　つまり、NVMe仕様上は図3のようなことが起こり得ます。

![NVMe仕様上起こり得る例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/4c06f9a1-7985-17ad-28db-a70acea944e4.png "NVMe仕様上起こり得る例")
図3：NVMe仕様上起こり得る例

　実際には図2に示したような「素直」な実装が多いと思われ、またNVMe仕様もそれを前提にしていると考えられます。

　良く考えると、**ユーザ視点では温度そのものよりも「サーマルスロットリングが発動したかどうか」のほうが重要**ですね。とするとこの仕様は的を射ていると考えられます。変えるなら属性名を変えるべき（例："Temperature"を削除）です。

　サーマルスロットリングの発動、特に「強いサーマルスロットリング」の発動は、そのような動作環境でドライブを動作させる危険性および性能低下という面から可能な限り避けるべきです。

　このため、これらの累積値が非ゼロであるさらには増える傾向にある場合、ドライブの動作環境が適切でなくドライブがその能力を発揮でてきていない可能性が高いため、動作環境の改善が必要です。

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

　これらの属性値は値の変化が重要であるため継続的な監視が基本的な対応となります。エラー数のような異常系属性値はもちろん、「コマンド数」や「データサイズ」のような属性値でも監視の際には対象コマンドや値の単位への留意が必要です。

# References
[1] NVM Express, _"NVM Express Base Specification,"_ Revision 2.0b, Jan. 2022
[2] NVM Express, _"NVM Express Base Specification,"_ Revision 1.4b, Sept. 2020
[3] NVM Express, _"NVM Express NVM Command Set Specification,"_ Revision 1.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>の下に提供されています。