NVMe SSDの自己診断機能とその使いかた

NVMe SSDの自己診断機能とその使いかた
An image of health check

この記事で紹介している製品

おことわり

 この記事のオリジナルは日本語で書かれています。記事が日本語以外の言語で表示されている場合、それは機械翻訳の結果です。当社は機械翻訳の精度に責任を負いません。

はじめに

 NVM Express (NVMe)基本仕様[1](以降NVMe仕様と記載)は、ドライブの自己診断機能(Device Self-test)を定義しています。

 この自己診断機能はオプション機能であり、ドライブによりサポート有無が異なるだけでなく実行されるテストの内容も製品依存です。

 この記事では、NVMe仕様が示す自己診断の内容例と、自己診断の実行方法と診断結果の確認方法をご説明します。

 お使いのもしくはご検討中のNVMe SSDの自己診断機能サポート有無や、サポートしている場合のテスト内容や診断結果表示内容につきましては、各メーカーにお問い合わせください。

まとめ

  • NVMe仕様には自己診断機能が定義されているが、サポート有無は製品依存
  • 自己診断の実行は、メーカー配布のツールに加え、コマンドラインでも可能

自己診断機能の定義

 NVMe仕様は、自己診断機能をサポートするドライブに以下の4つを求めています。

  1. 2つのテスト(短時間テストと拡張テスト)の提供
  2. 拡張テストの所要時間(目安)の提示
  3. 実行中のテストを中止する方法の提供
  4. 自己診断が実行中かどうか、実行中であればどの程度完了したか、を確認する方法の提供

 そして、具体的なテスト内容の例として、以下のものを挙げています。

テストセグメントテスト内容例合否判定条件
1:RAMSRAMやDRAMへのテストパターンの書き込み、読み出し、比較訂正不能誤りや不一致の有無
2:S.M.A.R.T.S.M.A.R.T.ログのCritical Warningを確認警告の有無
3:バックアップ機能揮発メモリのバックアップ機能(キャパシタなど)の確認特筆すべき性能劣化の有無
4:メタデータ全メタデータが有効かどうか確認正しく読み出せるかどうか
5:不揮発メモリ各不揮発メモリの書き込みと読み出しと比較データ不一致の有無
6:データバックグラウンド処理の実施(拡張テストのみ)メタデータが正しく読み出せるかどうか
7:メディア使用可能な全物理ブロックへのランダム読み出しアクセス不能ブロックの有無
8:寿命データ書き込みの継続可否確認S.M.A.R.T.のPercentage Usedが255になるなど、重要指標が適格性を否定していないか
9:S.M.A.R.T.S.M.A.R.T.ログのCritical Warningを確認(セグメント2と同じ)警告の有無
表1:NVMe基本仕様が例示する自己診断機能の内容(仕様書のFigure 414より)

 各メーカーは、上記9つのテストセグメントからセグメントを選択して実行順序やテスト範囲を定める、独自のテストを定義する、それらを組み合わせる、などの方法でテスト内容を決定します。

 メーカーが「このテストを実行すれば自己診断が可能だ」と判断して構成した内容になりますので、定期的なドライブの健康状態チェックに組み込むことは有効です。

 NVMe仕様では、短時間テストは2分以内で完了することが望ましいとしています。また、拡張テストにかかる時間の目安はIdentify ControllerデータのExtended Device Self-test Time (EDSTT)というフィールドで示されます(分単位)。私が以前調べた際には、メーカーや容量により数分から数十分と幅広い値が設定されていました。

 通常アクセスと自己診断が重なると、通常アクセスの性能が低下するだけでなく自己診断にかかる時間も延びますので、自己診断を実行するタイミングの決定も重要です。また自己診断を頻繁に実行することは無駄なSSDの寿命消費に繋がりますので、実行頻度を適切に調整することも重要です。

自己診断の実行方法

ツールで実行(Windows)

 多くのメーカーは、自社製品向けにGUIを備えたツールを提供しています。そして自己診断機能をサポートしている場合の多くは、それらのツールから診断の実行や実行結果の取得が可能です。

 詳細はお使いのドライブのメーカーにお問い合わせください。

コマンドラインで実行(Windows)

 ここでは、私が作成したPowerShellスクリプト[2]を用いてNVMeドライブの自己診断を実行してその結果を取得する方法をご紹介します。PowerShellはWindowsで標準的に使用可能であり、ご紹介するスクリプトはMicrosoftの標準NVMeデバイスドライバを使用しているため、幅広い環境で使用可能です。

 自己診断の実行にはこちらのスクリプトを使います。引数にドライブの番号(「ディスクの管理」ツールで確認可能)と操作内容(短時間テストなら1、拡張テストなら2)を指定します。

 以下は、ドライブ0に短時間テスト(Short Device Self-test)を要求し、実際にテストが開始された時の表示です。なお、管理者権限でPowerShellコンソールを実行する必要があります。

PS C:\> .\do-selftest.ps1 0 1

[I] Short Device Self-test is requested
[I] Short Device Self-test started. Test progress and result can be checked by get-selftest-log.ps1

 テストの進捗と結果は別のスクリプトで取得可能です。テストが進行中の場合は以下のように出力されます。この例ではテストの進捗が9%と表示されています。

PS C:\> .\get-selftest-log.ps1 0
Device Self-test Information:

byte [    0] Current Device Self-test Operation: 0x01 (Short device self-test operation in progress)
byte [    1] Current Device Self-test Completion: 9 (9% completed)

 テストが終了していると、同じスクリプトで以下のように結果の取得が可能です。

PS C:\> .\get-selftest-log.ps1 0
Device Self-test Information:

byte [    0] Current Device Self-test Operation: 0x00 (No device self-test operation in progress)
byte [    1] Current Device Self-test Completion: 0 (No test is in progress)

Self-test Result Data #0:
    byte [    0] Device Self-test Status
        bit [ 3: 0] 0x0 = Completed without error
        bit [ 7: 4] 0x1 = Short device self-test operation
    byte [    1] 0x00 = Segment Number
    byte [    2] Valid Diagnostic Information
        bit [    0] 0 = Namespace Identifier field is invalid
        bit [    1] 0 = Failing LBA field is invalid
        bit [    2] 0 = Status Code Type field is invalid
        bit [    3] 0 = Status Code field is invalid
    byte [11: 4] 0x000000000000154C = Power On Hours
    byte [27:26] 0x0000 = Vendor Specific

 テスト結果には”Completed without error”と表示されておりエラーが検出されていないことがわかります。他には、実行されたテストが短時間テスト(Short device self-test)であること、このテストを実行した時刻がドライブ内時刻(Power On Hours)で5,452 (0x154C)時間経過時であることが記録されています。

コマンドラインで実行(Linux / Ubuntu)

 Ubuntuでは、nvme-cliパッケージに含まれるnvmeコマンドを使う方法が最も簡単です。

 自己診断を実行する方法は以下の通りです。

% sudo nvme device-self-test /dev/nvme0 -s 1
Device self-test started

 実行には管理者権限が必要ですのでsudoを使用しています。自己診断の実行を要求するドライブとして/dev/nvme0を指定し、短時間テストを実行するために-sオプションに1を指定しています。

 自己診断の進捗を確認するには同じくnvmeコマンドを使用します。

% sudo nvme self-test-log /dev/nvme0        
Test is 3% complete and is still in progress.

 この例では進捗は3%です。

 自己診断が完了したもしくは自己診断を実行していないときは以下のように表示されます。

% sudo nvme self-test-log /dev/nvme0
Test is 0% complete and is still in progress.

このコマンドは、何かエラーが検出されない限り自己診断の結果を表示しないようです。

おわりに

 この記事では、NVMe仕様が定義する自己診断(Device Self-test)機能について説明し、WindowsとLinux (Ubuntu)で実際に自己診断を実行して実行結果を取得する方法をご説明しました。

 NVMe仕様の自己診断機能はオプションであり、テスト内容もメーカーや製品により異なるものですが、もしサポートされていれば定期的なドライブの健康状態チェックに組み込むことは有効です。

 NVMe SSDをお使いになる際や検討される際のご参考になれば幸いです。

References

[1] NVM Express, “NVM Express Base Specification”, Revision 2.0c, October 2022
[2] nvmetool-win-powershell: Sample script of accessing NVMe drive using Windows’ inbox NVMe driver

他社商標について

 記事中には登録商標マークを明記しておりませんが、記事に掲載されている会社名および製品名等は一般に各社の商標または登録商標です。

記事内容について

 この記事の内容は、発表当時の情報です。予告なく変更されることがありますので、あらかじめご了承ください。