NVMe SSDのサーマルスロットリング設定温度をいじってみた

# 更新情報(2020/7/2)
　MicrosoftのWebサイトが更新され、Windowsの標準NVMeデバイスドライバを使用して、HCTMに関する値（温度）を`Set Features`コマンドにより設定できることがわかりました（[ソース](https://docs.microsoft.com/en-us/windows-hardware/drivers/storage/stornvme-command-set-support)）。

　したがって、この記事の「残念なお知らせ」節の内容は、現時点では正しくありません。obsoleteです。

　一方、それ以外の内容（nvme-cliを使用したLinux上での設定方法など）は現時点でも有効であると考えています。

　今後、Windowsの標準NVMeデバイスドライバを使用して、`Set Features`コマンドによりHCTMに関する値（温度）を設定する方法を試してみようと考えています。

# はじめに
　最近、SSDの特集記事にはほとんどと言って良いくらい「温度（発熱）」に関する記載があります。

　特に、PCIe Gen4に対応したNVMe SSDが登場したことで、「ハイエンドSSDと発熱対策は切っても切れないもの」という認識が強くなってきたと思われます。

　ユーザができるSSDの発熱対策としては、例えばヒートシンクなどによる冷却が挙げられます。

　一方で、一般的には、**SSDも性能を抑えることで発熱を抑えて（過度な）温度上昇を防ぐ**機能を備えています。

　この「温度上昇を抑えるために性能を抑える」機能のことを「**サーマルスロットリング(Thermal Throttling)**」と呼びます。

　ヒートシンクなどによるSSDの冷却の必要性や、サーマルスロットリングを含めた温度と性能の関係については、これまでにも様々な記事で解説されています<sup>[1][2][3]</sup>。

　実はこのサーマルスロットリングに関連する「温度」、**SSDによっては、ユーザが知ることができ、かつ設定することも可能です**。

　そこで、コントローラの種類も多いPCIe Gen3x4接続のNVMe SSDを2つ用意し、サーマルスロットリング関連設定を変えると性能がどのように変わるのかを調べてみました。

　SSDのサーマルスロットリングに関連する温度設定を把握し、かつそのSSDを使用する環境や使いかたに合わせてその設定をカスタマイズすることで、過不足のない冷却機構の構築や、強制冷却ができない環境でのより安定した性能での運用、などが可能となります。

　逆に、SSDを選定する際に、実環境の環境温度や冷却能力などからSSDが動作する温度を定め、その温度を設定して実性能を評価する、ということも可能になります。

※注意：NVMe仕様中では「SSDの代表温度」的な温度のことを"Composite Temperature"と呼んでいます。ただ、上手い日本語訳を思いつかないため、この記事中では"Composite Temperature"のことを単に「（SSDの）温度」と記載します。また、この記事で参照するNVMe仕様は、NVMe 1.3d<sup>[4]</sup>とします。

# サマリ
* **NVMe SSDのサーマルスロットリング関連温度の一部はユーザが設定可能**
* サーマルスロットリングの動作は製品によって大きく異なる
* サーマルスロットリングが発動すると性能が落ちたり性能の変動が大きくなる
    * もし思ったようにSSDの性能が出ない場合、サーマルスロットリング発動有無や設定内容を確認するのも一つの手
* **コンシューマ向けSSDであれば、おおよそ摂氏70度以下で運用すれば、サーマルスロットリングは発生しない**
    * Readの性能は一般的にWriteの性能より高いため発熱により注意が必要だが、それも含めて摂氏70度以下になるように管理すれば良い
    * この温度を手掛かりにヒートシンクなどによる外部冷却を検討すべき
* 逆に、SSDはReadやWriteで負荷がかかると摂氏70度程度になり、周囲に熱をばらまく熱源になり得ることにも注意

# NVMeの温度関連仕様
　NVMe仕様は、「SSDの温度」として最低1つ(Composite Temperature)、最大で9つ（Composite TemperatureとTemperature Sensor 1～8）を定義しています（全てが独立とは限りません）。

　そして、それらの温度を使用した機能として、以下の機能を定義しています。

1. ホストにアラート（警告）やイベントを通知する機能と関連する温度
    * Warning Composite Temperature Threshold (WCTEMP)
    * Critical Composite Temperature Threshold (CCTEMP)
    * Temperature Threshold
2. Host Controlled Thermal Management (HCTM)に関連する温度
    *  Minimum Thermal Management Temperature (MNTMT)
    *  Maximum Thermal Management Temperature (MXTMT)
    *  Thermal Management Temperature 1 (TMT1)
    *  Thermal Management Temperature 2 (TMT2)

　上記の機能および設定のうち、サーマルスロットリングに関連する機能・設定は、後者のHCTMです。

　そこでこの記事では、まずNVMe SSDの温度を取得する機能を説明し、その後HCTMの説明をします。

　なお、HCTMをサポートしていないSSDも存在しますのでご注意ください。SSDがHCTMをサポートしているかどうかの確認方法も後述します。

# SSDの現在温度を取得する
　何はともあれ、SSDの温度を知ることから始めます。

　NVMe SSDの「現在の温度」は、SMART情報に含まれています。したがって「現在の温度」を取得するには`Get Log Page`コマンドを発行してSMART情報を取得する必要があります。SMART情報のLog Page IDは02hです。

　以下は、[以前ご紹介したWindowsプログラム](https://qiita.com/ken-yossy/items/ffecfd31d41d71f27dca)を使って、とあるNVMe SSDのSMART情報を取得した結果です。

　SMART情報に含まれる温度以外の情報を省略していること、およびSSDから取得した情報を読みやすく整形していることに注意してください。また、★印以降は説明のために付与したものであり、NVMe仕様における温度は絶対温度で表現されますので単位はケルビン(K)です。

```
[I] Composite Temperature: 318 (K), 45 (C)  ★「温度」の現在値
[I] Temperature Sensor 1: (not implemented) ★「温度センサ1」の現在値
[I] Temperature Sensor 2: (not implemented) ★「温度センサ2」の現在値
[I] Temperature Sensor 3: (not implemented) ★「温度センサ3」の現在値
[I] Temperature Sensor 4: (not implemented) ★「温度センサ4」の現在値
[I] Temperature Sensor 5: (not implemented) ★「温度センサ5」の現在値
[I] Temperature Sensor 6: (not implemented) ★「温度センサ6」の現在値
[I] Temperature Sensor 7: (not implemented) ★「温度センサ7」の現在値
[I] Temperature Sensor 8: (not implemented) ★「温度センサ8」の現在値
```

　この結果より、このSSDはSMART情報では必要最低限の温度のみ報告する仕様で、取得時点の温度は318K（318 - 273.15 = 44.85、摂氏約45度）であることがわかります。

　別のSSDでは以下のような情報が取得できました。

```
[I] Composite Temperature: 312 (K), 39 (C)
[I] Temperature Sensor 1: 312 (K), 39 (C)
[I] Temperature Sensor 2: 315 (K), 42 (C)
[I] Temperature Sensor 3: (not implemented)
[I] Temperature Sensor 4: (not implemented)
[I] Temperature Sensor 5: (not implemented)
[I] Temperature Sensor 6: (not implemented)
[I] Temperature Sensor 7: (not implemented)
[I] Temperature Sensor 8: (not implemented)
```

　このSSDでは2つの温度センサの情報も報告しています。それぞれSSDコントローラ(ASIC)の温度センサの値とNANDフラッシュメモリ（BGAパッケージ内）の温度センサの値でしょうか。また、SSDとしての温度は温度センサ1の値なのかもしれません。

　Linuxの場合、`nvme-cli`を使用することでSMART情報を取得することができます。

```
% sudo nvme smart-log /dev/nvme0		

Smart Log for NVME device:nvme0 namespace-id:ffffffff		
critical_warning                    : 0
temperature                         : 41 C ★ これがComposite Temperature
available_spare                     : 100%
available_spare_threshold           : 5%
percentage_used                     : 0%
data_units_read                     : 153706
data_units_written                  : 2923680
host_read_commands                  : 397659
host_write_commands                 : 1760780
controller_busy_time                : 318
power_cycles                        : 64
power_on_hours                      : 1
unsafe_shutdowns                    : 47
media_errors                        : 0
num_err_log_entries                 : 0
Warning Temperature Time            : 0
Critical Composite Temperature Time : 0
Temperature Sensor 1                : 41 C ★ 温度センサ1の温度
Temperature Sensor 2                : 44 C ★ 温度センサ2の温度
```

# Host Controlled Thermal Management(HCTM)とは
　NVMe SSDにおいて、「サーマルスロットリング」はHCTMの設定に関連していることをご紹介しました。

　ここではこのHCTMとその設定について説明します。

## HCTMが有効かどうかを確認する方法
　あるNVMe SSDについてHCTMが有効かどうかは、コントローラのIdentifyデータで判別します。

　つまり、`Identify`コマンドをCNS Value = 01hで発行した結果を参照することになります。

　具体的には、以下の2バイトの値のビット0が1ならばHCTMをサポートしている、ということになります。

![HCTMサポート有無を示すデータ（NVMe仕様書より抜粋）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/cf565c8e-4d82-b52b-583f-752c30420f03.png "HCTMサポート有無を示すデータ（NVMe仕様書より抜粋）")
図1：HCTMサポート有無を示すデータ（NVMe仕様書より抜粋）

## HCTMの仕組み
　次に、HCTMの具体的な仕組みです。

### HCTMの設定
　HCTMの設定用にNVMe仕様が定めているのは、冒頭で挙げた以下の4つの温度とその大小関係です。

* Minimum Thermal Management Temperature (MNTMT)
* Maximum Thermal Management Temperature (MXTMT)
* Thermal Management Temperature 1 (TMT1)
* Thermal Management Temperature 2 (TMT2)

　この4つの設定温度のうち、MNTMTとMXTMTは製品によって決まる固有値で、TMT1とTMT2は、HCTMをサポートしているSSDにおいてホストが設定可能な値です。

　この4つの値は、以下の関係にあることがNVMe仕様に定められています。

```math
MNTMT \le TMT1 \lt TMT2 \le MXTMT
```

　つまり、HCTMが有効なSSDに対しては、ホストは、MNTMT以上MXTMT以下という範囲内でTMT1とTMT2という2つの温度を設定できる、ということを意味します。

　MNTMTとMXTMTは、コントローラの`Identify`データで知ることができます。例えばこんな感じです。

```
[O] Minimum Thermal Management Temperature (MNTMT): 273 (K) (0 (C))
[O] Maximum Thermal Management Temperature (MXTMT): 358 (K) (85 (C)
```

　`nvme-cli`で取得する場合は、`% sudo nvme id-ctrl /dev/nvme0`などとすれば取得できます。

　TMT1とTMT2の現在値は、`Get Features`コマンドで取得します。HCTMのFeature IDは0x10です。同じく`nvme-cli`で取得する場合には以下のようになります。

```
% nvme get-feature /dev/nvme0 -f 0x10
get-feature:0x10 (Unknown), Current value:0x1110166
```

　NVMe仕様によって解釈すると、上記"Current value"の上位16ビットがTMT1、下位16ビットがTMT2ですので、TMT1は0x111つまり273K（摂氏約0度）、TMT2は0x166つまり358K（摂氏約85度）、ということになります。このSSDのデフォルト値は、$MNTMT = TMT1$で$TMT2 = MXTMT$のようです。

　別のNVMe SSDでは、MXTMTが摂氏75度、MNTMTが摂氏30度、TMT1が摂氏71度、TMT2が摂氏75度でした。

　このように、これらの4つの温度設定はSSDによって全く異なる可能性が高いです。

### HCTMの具体的な動作
　NVMe SSDは上記の設定（温度）を使用してサーマルスロットリングを行いますが、**これらの設定をどのように使用してどのようにサーマルスロットリングを行うかは完全に実装依存です**。

　NVMe仕様で定めているのは、前記4つの温度とそれらの大小関係のみです。

　NVMe仕様の8.4.5節"Host Controlled Thermal Management"には図2のような例が記載されています。この図2は、NVMe仕様書のFigure 263をもとに描き起こした図です。

![HCTMによるSSDのサーマルスロットリング動作イメージ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/ac23d78b-5a8e-da78-f9d0-81a789268f26.png "HCTMによるSSDのサーマルスロットリング動作イメージ図")
図2：HCTMによるSSDのサーマルスロットリング動作イメージ図

　SSD Aの例は、SSDの温度がTMT1に達するとすぐに「強いスロットリング」を発動し、SSDの温度がTMT1を十分に下回ってかつSSD A固有の閾値温度まで下がったらサーマルスロットリングを解除する、という動作イメージです。

　一方SSD Bの例では、SSDの温度がTMT1に達すると「弱いスロットリング」を発動します。もし「弱いスロットリング」を発動してもSSDの温度が下がらずTMT2に達してしまったら「強いスロットリング」を発動し、SSDの温度がTMT1を十分に下回ってかつSSD B固有の閾値温度まで下がったらサーマルスロットリングを解除する、という動作イメージです。

　これらの動作イメージはあくまで例であり、SSDによってHCTMの動作は大きく異なる可能性が高いです。

## サーマルスロットリング関連温度を変更する
　それでは、実際に、サーマルスロットリング関連温度を変更してみます。

　まず最初に、そもそも「変更できるのか？」を確認します。

　このことは、`Feature Identifier`にHCTMを示す0x10を、そして`SELECT`フィールドに3を設定して、`Get Features`コマンドを発行することで確認します。

　`SELECT`フィールドに3を設定して`Get Features`コマンドを発行すると、その機能の"Supported Capabilities"つまり「その機能に対してホストからできること」を取得できます。

　具体的には、取得結果のビット2が「値を変更可能かどうか」を、ビット0が「値を保存可能かどうか」を示します。実際にはこんな感じになります。

```
% sudo nvme get-feature /dev/nvme0 -f 0x10 -s 3
get-feature:0x10 (Unknown), Supported capabilities value:0x000005
```
　取得した値は16進数で5つまり2進数で101となり、このSSDのTMT1およびTMT2は変更可能（加えて保存可能）であることがわかりました。

　変更可能であることがわかりましたので、TMT2の設定を変更します。

　デフォルトでは摂氏85度（358K、16進数で0x166）でしたので、これを摂氏60度(333K、16進数で0x14d）に設定してみます。先ほどの`Get Features`コマンドとほぼ同様に`Set Features`コマンドを使うことで設定できます。

```
% sudo nvme set-feature /dev/nvme0 -f 0x10 -v 0x111014d
set-feature:0x10 (Unknown), value:0x111014d

% sudo nvme get-feature /dev/nvme0 -f 0x10
get-feature:0x10 (Unknown), Current value:0x111014d
```

　これでTMT2を摂氏60度に変更できました。

　ちなみに、このHCTMの設定が「保存可能」である場合、「**LinuxマシンでHCTMの設定を変更して保存したNVMe SSDをWindowsマシンで使う（＝変更した設定値を引き継ぐ）**」ということも可能です。

　ただし、メーカーが設定したデフォルトの値を変更する際は、十分に注意して実行してください。また、OSの挙動に悪影響を与える可能性があることにも留意してください。

## 残念なお知らせ
　**（2020年7月2日追記）本節の内容は2019年12月時点での情報です。最新情報については、この記事冒頭の「更新情報」を参照してください**

　ここで残念なお知らせです。

　記事執筆時点（2019年12月）では、**Windowsの標準NVMeデバイスドライバ(stornvme.sys)経由では`Set Features`コマンドの発行ができない模様です**。`Get Features`コマンドは発行できるのですが。

　「`Set/Get Features`はNVMe独特の仕様なので難しいだろうな」と思いつつSCSI Pass-throughも試したのですが、やはり上手くいきませんでした。

　ですので、前記TMT2を変更する手順ではLinuxの`nvme-cli`を使用しています。

　Windowsにおける`ioctl()`である`IoControl()`関連仕様のうち、`Set Features`コマンドの発行に必要な仕組みは、以前と比べると充実してきてはいるのですが、まだあと少し足りない印象です。

　Windowsの中の人が仕組みを完成させてくれることを願っています。

# サーマルスロットリングによる性能の変化
　サーマルスロットリング関連設定を変えると性能がどのように変わるのかを観測するために、2つのPCIe Gen3x4接続のNVMe SSDを準備し、それぞれHCTMの設定を変化させて性能の変化を調べました。

　そこでこの性能評価結果を示します。

## 性能評価と温度取得の方法
　性能評価には、Iometer<sup>[5]</sup>を使用しました。

　評価は、以下のような環境で行いました。

![性能評価環境](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/838081dc-0501-e203-c66f-1f40300786a3.png "性能評価環境")
図3：性能評価環境

　評価対象のNVMe SSDはLinuxマシンに装着し、そのLinuxマシン上で動作しているIometer (dynamo)に対してWindowsマシン上で動作するIometerのコンソール(GUI)からネットワーク経由で指示を出して負荷をかけます。ですので、評価結果はWindowsマシン上で取得しました。

　Iometerでは複数の"Worker"を設定できますが、今回Worker数は1で計測しました。

　アクセスパターンは、評価対象の2つのSSDそれぞれのSLC Cacheサイズに収まるサイズのLBA領域に対して1MB単位で先頭LBAが1MBアラインしたシーケンシャルライトをQD=64で行うというものにしました。
　このアクセスパターンであれば、データの書き込みは常にSLC Cacheに対して行われることになり、Writeの最大性能が維持されるはずだからです。

　SSDの温度は、Linuxマシン上で1秒間隔で`nvme-cli`によりSMART情報を読み出して記録しました。評価環境は室温の環境に設置しています。

　SSDは、ヒートシンク等は装着せずATXのマザーボードに設置し、そのマザーボードを収めたPCのケースを閉めて動作させました。PCケース内のエアフローについては、特別な対策はとらず、フロントファン、リアファン、そしてCPUファン（吸気）が設置されているのみです（図4）。

![評価対象SSDを接続したPCの内部写真](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/f8a02297-2dc7-5e9f-ce19-59f13e72340d.png "評価対象SSDを接続したPCの内部写真")
図4：評価対象SSDを接続したPCの内部写真

　評価結果の集計は、Iometerの評価結果と`nvme-cli`で取得した温度情報を手作業で突き合わせることで行いました。
　このため、評価結果と温度には多少のずれがあると思われますが、性能と温度の関係の傾向を見る程度であれば問題ないと考えます。

## プリコンディショニング
　プリコンディショニングは、`Dataset Management`コマンドで全LBAをDeallocateすることで行いました。

　`Dataset Management`コマンドは、`nvme-cli`を使うと次のように実行できます。コマンドの処理対象として、デバイス(`/dev/nvme0`)ではなくネームスペース(`/dev/nvme0n1`)を指定していることに注意してください。以下は、今回使用した1TBドライブの例です。

```
% sudo nvme dsm /dev/nvme0n1 -d -s 0 -b 0x773bd2b0
NVMe DSM: success
```

　`-d`オプションでDeallocateを、`-s`オプションで先頭LBAを、`-b`オプションでセクタ数を指定します。`-b`オプションで設定するセクタ数は、ネームスペースを指定した`Identify`コマンドの結果から取得可能です。

```
% sudo nvme id-ns /dev/nvme0n1
NVME Identify Namespace 1:
nsze    : 0x773bd2b0 ★ これ
ncap    : 0x773bd2b0
nuse    : 0x773bd2b0
nsfeat  : 0
nlbaf   : 0
```

　表示された"Namespace Size (NSZE)"の値を`-b`オプションに指定します。

## 評価結果（その1）
　まず1つめのSSDの評価結果です。ここでは、このSSDを仮に"SSD1"と呼びます。

　HCTMの設定内容等を表1に示します。

表1：評価設定(SSD1)
![評価設定(SSD1)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/91d09080-76e2-1100-ddaa-88301b446103.png "評価設定(SSD1)")

　HCTMの設定を変更する前の性能と温度の変化は以下の図5のようになりました。

![デフォルト設定での性能と温度の時間変化(SSD1)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/cc6ff816-e8ef-3196-73cb-aa4bb20359e6.png "デフォルト設定での性能と温度の時間変化(SSD1)")
図5：デフォルト設定での性能と温度の時間変化(SSD1)

　横軸は経過時間（右に行くほど時間が経過する）、縦軸は、左縦軸がWriteのバンド幅（実線）、右縦軸がSSDの温度（点線）です。

　図5の通り、SLC Cacheに書き込まれていることを示すバンド幅（1.6GB/s前後）が出続けていながらも、SSDの温度は最高でも摂氏65度前後となっています。

　次に、HCTMの設定のうち、TMT1を摂氏70度に、TMT2を摂氏80度に変更した場合の性能と温度の変化を図6に示します。グラフの見かたは図5と同じです。

![TMT1=摂氏70度、TMT2=摂氏80度の時の性能と温度の時間変化(SSD1)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/fae2b222-2b3d-e8fb-7164-9fc3645049af.png "TMT1=摂氏70度、TMT2=摂氏80度の時の性能と温度の時間変化(SSD1)")
図6：TMT1=摂氏70度、TMT2=摂氏80度の時の性能と温度の時間変化(SSD1)

　図5とほとんど同じ傾向が得られました。そもそも図5でも最高温度は摂氏70度未満でしたから、サーマルスロットリングが発動していないことがわかります。

　最後に、TMT1を摂氏60度に、TMT2を摂氏70度に設定した場合の性能と温度の変化を図7に示します。グラフの見かたはこれまでと同じです。

![TMT1=摂氏60度、TMT2=摂氏70度の時の性能と温度の時間変化(SSD1)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/5b2104db-495f-feeb-4ca9-c61a8fc8cc61.png "TMT1=摂氏60度、TMT2=摂氏70度の時の性能と温度の時間変化(SSD1)")
図7：TMT1=摂氏60度、TMT2=摂氏70度の時の性能と温度の時間変化(SSD1)

　この図7からは、**このSSD1が、SSDの温度がTMT1の値（図7では摂氏60度）に到達したところでサーマルスロットリングを発動していることが強く推測されます**。

　それにしても、サーマルスロットリングが発動した時の性能の低下度合いと、サーマルスロットリング発動有無による性能の変動（バタつき）の大きさがすごいですね...この図7からは、「**サーマルスロットリングを発動させてしまうと性能が大きく低下してかつ不安定になる**」ということが如実にわかります。

　最後に、比較しやすくするために図5から図7を一つのグラフに描くと図8のようになります。

![HCTM設定変更前後の性能と温度の時間変化比較(SSD1)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/d2ab3050-a4d3-f0c6-5406-91b16409e604.png "HCTM設定変更前後の性能と温度の時間変化比較(SSD1)")
図8：HCTM設定変更前後の性能と温度の時間変化比較(SSD1)

## 評価結果（その2）
　次に2つめのSSDの評価結果です。ここでは、このSSDを仮に"SSD2"と呼びます。

　HCTMの設定内容等を表2に示します。

表2：評価設定(SSD2)
![評価設定(SSD2)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/d6e5fbbb-500d-aa06-e96b-c629f53b3272.png "評価設定(SSD2)")

　HCTMの設定を変更する前の性能と温度の変化は以下の図9のようになりました。グラフの見かたはこれまでと同じです。

![デフォルト設定での性能と温度の時間変化(SSD2)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/3212a36b-df2a-34a9-a211-90370b1f55b4.png "デフォルト設定での性能と温度の時間変化(SSD2)")
図9：デフォルト設定での性能と温度の時間変化(SSD2)

※注意：SSD1と比較してWriteバンド幅の絶対値が低いのは、ドライブ容量が小さい（おそらく搭載NANDフラッシュメモリチップ数が少ない）ためです。

　この図9を見ると、SLC Cacheに書き込まれていると想像される性能を記録している間でも、SSDの温度は高くても摂氏70度が維持されています。性能も安定しています。

　次に、TMT1を摂氏65度に、TMT2を摂氏70度に変更した場合の性能と温度の変化を図10に示します。グラフの見かたはこれまでと同じです。

![TMT1=摂氏65度、TMT2=摂氏70度の時の性能と温度の時間変化(SSD2)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/e31ab776-463b-cfb4-15ea-243192b322db.png)
図10：TMT1=摂氏65度、TMT2=摂氏70度の時の性能と温度の時間変化(SSD2)

　図10を見ると、SSDの最高温度は、TMT1に設定した摂氏65度を若干下回る値で推移していることがわかります。図9と図10の内容から、このSSDはSSDの温度をTMT1に設定された温度以下に保とうと制御しているのではないか、と推測することができます。

　性能については、図9と図10を比較すると、図10のほうが100MB/sに満たない範囲ですが低下していることがわかります。それでも、安定性という意味では十分に安定した性能を出しているとみることができます。

　次に、TMT1を摂氏60度に、TMT2を摂氏70度に変更した場合の性能と温度の変化を図11に示します。グラフの見かたはこれまでと同じです。

![TMT1=摂氏60度、TMT2=摂氏70度の時の性能と温度の時間変化(SSD2)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/0a980167-0aef-d02f-b25f-1343563970f4.png "TMT1=摂氏60度、TMT2=摂氏70度の時の性能と温度の時間変化(SSD2)")
図11：TMT1=摂氏60度、TMT2=摂氏70度の時の性能と温度の時間変化(SSD2)

　この図11からも、**このSSDがSSDの温度をTMT1に設定された温度以下に保とうと制御している**ことが推測できます。

　ただ、さすがに性能は1.1GB/s程度に低下しています。

　最後に、さらに設定温度を下げて、TMT1を摂氏50度に、TMT2を摂氏60度に変更した場合の性能と温度の変化を図12に示します。グラフの見かたはこれまでと同じです。

![TMT1=摂氏50度、TMT2=摂氏60度の時の性能と温度の時間変化(SSD2)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/01cee9fe-dc5a-5b9d-5e47-cea960505f3d.png "TMT1=摂氏50度、TMT2=摂氏60度の時の性能と温度の時間変化(SSD2)")
図12：TMT1=摂氏50度、TMT2=摂氏60度の時の性能と温度の時間変化(SSD2)

　この図12では、これまでとは異なり**SSDの温度がTMT2に設定された温度（今回は摂氏60度）まで上がってしまったため、強力なサーマルスロットリングを発動した**ことがわかります。

　この強力なサーマルスロットリングでは、性能は100MB/s未満に落ち込んでいます。

　図12では、これまでのようにTMT1に設定された温度（図12では摂氏50度）のあたりではサーマルスロットリングを発動した形跡がありません。

　SSDの温度がTMT1の設定温度である摂氏50度を下回るとサーマルスロットリングが解除されていますが、すぐにまた摂氏50度を超えてしまっていることから、そもそもこのSSDを使うにあたってTMT1を摂氏50度に設定すること自体が間違っていると考えるべきでしょう。

　以上の評価結果より、このSSDは、**HCTMの設定(TMT1)が適切であれば、その設定温度にしたがった制御を行い、かつ多少性能は低下しながらも安定した性能を発揮する、「使いやすいSSD」である**とも言えます。

　こちらも比較しやすくするために図9から図12を一つのグラフにまとめて描くと図13のようになります。

![設定変更前後の性能と温度の時間変化比較(SSD2)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/53eab951-6449-4071-7d1e-2689fb673d8a.png "設定変更前後の性能と温度の時間変化比較(SSD2)")
図13：設定変更前後の性能と温度の時間変化比較(SSD2)

## 評価結果まとめ
　この2つのSSDの評価結果から、PCIe Gen3x4接続のNVMe SSDでは、よほどSSDの周辺温度が高くない限り、摂氏70度を超えるような温度にはならないことがわかります。

　そもそも、コンシューマ向けSSDであれば、メーカーの製品仕様にはたいてい「動作温度」として「摂氏0度から摂氏70度まで」と記載されていると思います。
　PCIe Gen3x4接続の製品でも、PCIe Gen4x4接続の製品でも、たいてい製品仕様における動作温度は「摂氏0度から摂氏70度まで」になっていると思います。
　つまり、製品設計上、最高性能を発揮してもSSD単体では摂氏70度未満である、ということであり、上記の評価結果とも一致します。

　SSDの構成部品の中で、PCIe Gen3x4接続の製品とPCIe Gen4x4接続の製品とで変わらない、製品の動作温度を支配しそうなものと言えば、まずはNANDフラッシュメモリが挙げられます。
　このことから、SSDの動作温度はNANDフラッシュメモリの動作保証温度が支配的になっていると推測されます。

　ただし、PCIe Gen3x4接続の製品でもPCIe Gen4x4接続の製品でも、周辺温度によって、その「摂氏70度」というひとつの目安を容易に超えてしまうことが考えられます。
　
　そのような環境でもNVMe SSDの高い性能を安定して出し続けるためには、ヒートシンクなどに代表される強制冷却機構が必須である、ということになります。

# おわりに
　この記事では、NVMe SSDのサーマルスロットリングについて、設定項目とその意味や取得および変更方法をご紹介し、実際に設定変更前後での性能測定結果を示しました。

　冒頭でもご説明した通り、SSDを使用する際に、そのSSDのサーマルスロットリングに関連する温度設定や挙動を把握し、かつそのSSDを使用する環境や使いかたに合わせてその設定をカスタマイズすることで、過不足のない冷却機構の構築や、強制冷却ができない環境でのより安定した性能での運用、などが可能となります。

　そして、SSDを使っていて思うような性能が出ない際のトラブルシューティングでは、このサーマルスロットリングに関連する設定や、運用時のSSDの温度の確認、さらにはサーマルスロットリング発動の有無を確認することも重要です。

# Reference
[1] PC Watch、「_[アプリ起動もデータコピーも超高速! 最新NVMe SSD注目7製品一斉比較
～気になる発熱とサーマルスロットリングもテスト](https://pc.watch.impress.co.jp/docs/news/1139883.html)_」、2018年8月27日（2019年12月26日閲覧）
[2] AKIBA PC Hotline!、「_[M.2 SSDは冷却が必要？･･････など、“ストレージのギモン” 3点を解決【パワレポ連動：解決策はココにあり！ 自作のギモン大究明（9）】](https://akiba-pc.watch.impress.co.jp/docs/dosv/1028875.html)_」、2016年11月15日（2019年12月26日閲覧）
[3] 「_[粕田舞造 夢日記 Re:2 第2回NVMe SSDは熱いのか？ 冷却は必須か？ ヒートシンクは本当に必要なのか!?](https://news.mynavi.jp/article/customize-ou-2/)_」、2019年9月2日（2019年12月26日閲覧）
[4] NVM Express, _"NVM ExpressTM Base Specification"_, Revision 1.3d, March 20, 2019
[5] [Iometer project](http://www.iometer.org/)（2019年12月24日閲覧）

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