SSDの代替処理

# はじめに
　NANDフラッシュメモリを使用したSSD（以降単にSSDと記載）においても、Hard Disk Drive (HDD)で言う「代替処理」が存在します。

　以下は、[CrystalDiskInfo](https://crystalmark.info/ja/software/crystaldiskinfo/)を用いたストレージの健康状態監視に関する記事でのHDDの代替処理の説明です。

> 　「代替処理済みのセクタ数」というのは、何らかの理由でHDDの読み書きに問題があるセクタ（場所）が見つかったため、そこに新たなデータを書き込まないようにしつつ、代わりの領域を割り当てて対処した数。いわゆる不良セクタがある証拠だが、代替処理ができているため、実使用上は何ら問題ないように見える。
>
> _「[ゲーマーも常駐推奨！ HDDやSSDの異常を「CrystalDiskInfo」で検知](https://forest.watch.impress.co.jp/docs/serial/sspcgame/1458173.html)」より引用_

　この説明はHDD向けの説明ですが、SSD向けにもほぼこのまま適用可能です。「実使用上は何ら問題ないように見えるものの実際には故障が近づいている可能性がある」こともHDDと同じです。

　この記事では、SSDにおける代替処理の仕組みと、代替処理が発動したことをどのように検出するか、について説明します。

　なお、この記事ではHDDとしてCMR HDDを参照し、また「NANDフラッシュメモリを使用したSSD」のことを「SSD」と記載します。

# まとめ

* SSDの「代替処理」のひとつは「バッドブロック発生時に代替領域からブロックを供給すること」
* SSDで代替処理が発生すると、S.M.A.R.T.属性の変化や性能の一時的低下が起こり得る
* 上記から代替処理の発生を察知して早期の対策に繋げることが大事

# 準備：HDDとSSDの記録位置管理の違い
　代替処理の説明に入る前にHDDと（最近の）SSDのデータ管理アルゴリズムの違いを説明します。

　それは、**ホストが指定するLogical Block Address (LBA)とドライブ内でのデータ記録位置の関係がHDDは固定でSSDは可変であること**、です。これは「HDDは上書きができるが、SSDというかNANDフラッシュメモリはEraseしてからでないとデータが書けない」ことに起因します。

　HDDの場合、典型的には図1のようにLBAと一対一で対応するセクタにデータを記録します。

![HDDにおける典型的なLBAと記録位置の関係](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/aafd0a08-dadb-aece-5a1b-e77c5cfa3738.png "HDDにおける典型的なLBAと記録位置の関係")
図1：HDDにおける典型的なLBAと記録位置の関係

　図1に示した順序でドライブがホストからコマンドを受領すると、LBA = 1へのコマンドは全てセクタ1に、LBA = 2へのコマンドは全てセクタ2にアクセスします。図1の6コマンドを処理した後の状態は同図中の「ディスクの状態」のようになります。

　一方SSDでは、典型的には図2のように受領したコマンドのLBAに関係なくデータを書き込んで管理します。

![SSDにおける典型的なLBAと記録位置の関係](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/2d4b20a4-ff31-6557-3859-7c5f2a380847.png "SSDにおける典型的なLBAと記録位置の関係")
図2：SSDにおける典型的なLBAと記録位置の関係

　なお、図2では1ページに1セクタのデータのみ記録するように記載していますが、これは説明を簡略化するためであり最近では1ページ内に複数セクタのデータを記録可能です。

　図2 (SSD)に「古いデータ」がある（残る）点が図1 (HDD)との違いです。SSDに「古いデータ」が居座り続けるのは、「古いデータ」が記録されたページに別のデータを書き込むには当該ブロックを消去(Erase)する必要があるものの当該ブロック（図2ではブロック0）に最新データが記録されている限り当該ブロックを消去(Erase)できないため、です。

# HDDの代替処理
　前節で説明した管理方法をもとにすると、HDDでの代替処理（イメージ）は図3のように説明できます。

![HDDの代替処理（イメージ）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/2467d3eb-78f6-f711-6812-36fac1f453fe.png "HDDの代替処理（イメージ）")
図3：HDDの代替処理（イメージ）

　記録位置をセクタ単位で管理しているので、あるセクタが「データの記録に適さない」と判断された場合、そのセクタの代わりに代替領域からセクタを割り当てます。これが代替処理です。

　図3では、セクタ1が不良セクタと判断されたのでセクタ1の代替処理を行い、セクタXを割り当てています。この代替処理以降、LBA 1に対するコマンドは全てセクタXにアクセスします。

　あるセクタが「データの記録に適さない」と判断する条件はメーカーにより異なります。複数の条件が存在することもあります。Read時だけでなくWrite時に判断されることもあり得ます。

　HDDのS.M.A.R.T.属性に「代替処理済みのセクタ数」がある場合、この値は図3のセクタ1のように実際に代替処理により代替領域が割り当てられたセクタ数を示すと考えられます。一方「代替処理保留中のセクタ数」がある場合、「代替処理が必要だと判断されたが判断以降そのセクタに対応するLBAにデータが書き込まれていないため代替処理が実行されていない」セクタ数を示すと考えられます。コピーオンライトによる遅延処理に似ていますね。

# SSDの代替処理
　いよいよSSDの代替処理です。SSDにおいてある記録位置が「データの記録に適さない」と判断されると、その記録位置を含むブロックがいわゆる「バッドブロック(Bad Block)」となることが多いです。そしてバッドブロックが発生すると代替処理が行われます。

　ここで「多い」と書いたのは基準などがメーカーにより異なるからです。あるブロックをバッドブロックと扱う基準がNANDフラッシュメモリメーカーそしてSSDメーカーにより異なるのは、この条件がNANDフラッシュメモリひいてはSSDの寿命や信頼性に大きな影響を与えるためです。実際、各社工夫を凝らしています。ご利用のSSDのバッドブロック化条件や代替処理発動条件はメーカーにお問い合わせください。　

　この記事では、ある記録位置が「データの記録に適さない」と判断される状況で場合分けをしてSSDにおける代替処理を説明します。場合分けは、Read時、Write (Program)時、Erase時の3つです。Eraseの存在がSSDの特徴です。

## Read時に判断した場合
　ある記録位置がデータの記録に適さないとRead時に判断されるのは、その記録位置からデータをReadした時に多数のエラービットを検出した場合などです。

　Read時に多数のエラービットを検出する主要因にはData Retentionの悪化とRead Disturbの影響が挙げられます。Read Disturbの影響はEraseにより解消する可能性があるため、Read Disturbの影響が原因だと判断されれば当該ブロックをバッドブロック化せずに様子を見る方法もあります。

　Data Retentionが原因だと判断された場合、安全策をとると、当該ブロックをバッドブロック化します。「多数のエラービットを検出した記録位置（ページ）のみ以降使用しない」という細かな管理も技術的には可能ですが、細かい管理はコストが高いこと、Data Retentionの悪化は消去回数増加が主要因であり消去単位はブロックなので当該ブロックの他のページの信頼性も低下している可能性が高いこと、などから当該ブロックを丸ごと使わない（＝バッドブロック化する）ことが多いです。

　Read時にあるブロックのバッドブロック化を決定すると、当該ブロックに記録されている少なくとも最新データは他のブロックにコピーする必要があります。図4は、ブロックAのバッドブロック化に際してブロックBを代替ブロックとして割り当ててブロックAのデータをデッドコピーしている例です。これがSSDにおける代替処理のひとつです。

![Read時に発生したバッドブロックに対する代替処理の一例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/20e1c235-cc61-b46d-86d0-e505cf130842.png "Read時に発生したバッドブロックに対する代替処理の一例")
図4：Read時に発生したバッドブロックに対する代替処理の一例

　代替ブロック（図4のブロックB）はいわゆる代替領域として確保されていたブロックから選ばれて割り当てられます。

## Write時に判断した場合
　ある記録位置がデータの記録に適さないとWrite (Program)時に判断されるのは、その記録位置へのデータ書き込みに失敗した場合などです。

　NANDフラッシュメモリは一般的に、データ書き込みの成否を確認可能です。SSDコントローラはNANDフラッシュメモリにデータ書き込みを指示した後、その成否を確認します。この確認時に書き込み結果が「失敗」だと判明したらそのリカバリ処理を行います。

　データ書き込みに失敗したブロックを即バッドブロックにするかどうかも、NANDフラッシュメモリメーカーそしてSSDメーカーにより異なります。ですが、やはり安全策を採ればデータ書き込みに失敗したブロックはバッドブロック化します。

　NANDフラッシュメモリへのデータ書き込みはページ単位ですので、あるページへのデータ書き込みに失敗したら、書き込もうとしていたデータを代替ブロックに書き込む必要があります。それに加えて、当該ブロックの他のページには既にデータを書き込んだ可能性があるので、それら既に書き込んだデータの代替処理も必要です。例えば図5のように、書き込みに失敗したデータと、当該ブロックに書き込まれていたデータを、代替ブロックにコピーする方法が考えられます。

![Write (Program)時に発生する代替処理の一例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439683/b1a291e2-1fa9-3f1a-8a43-9b38999b497e.png "Write (Program)時に発生する代替処理の一例")
図5：Write (Program)時に発生する代替処理の一例

## Erase時に判断した場合
　ある記録位置がデータの記録に適さないとErase時に判断されるのは、当該ブロックのErase処理に失敗した場合などです。

　データ書き込みと同様、NANDフラッシュメモリは一般的にErase処理の成否も確認可能です。SSDコントローラはNANDフラッシュメモリにErase処理を指示した後、その成否を確認します。この確認時にErase結果が「失敗」だと判明したらそのリカバリ処理を行います。

　Erase処理に失敗したブロックを即バッドブロックにするかどうかも、NANDフラッシュメモリメーカーそしてSSDメーカーにより異なります。ですが、やはり安全策を採ればErase処理に失敗したブロックはバッドブロック化します。

　ただErase処理はデータ書き込みの準備ですので、Erase処理に失敗したブロックには最新データはありません。ですので、Read時やWrite時と異なりデータの代替（退避）処理は不要です。Erase失敗時の代替処理は、代替領域から代わりのブロックを用意してEraseする、という処理になります。

## 代替処理による影響
　以上のとおり、SSDの代替処理では発動要因にかかわらず代替領域から代替ブロックを供給します。このことはS.M.A.R.T.属性などに反映されます。

　SATA SSDであれば冒頭で示した「代替処理済みセクタ数」が増えるはずです（サポートしていれば）。NVMe SSDであれば、余剰領域率(Available Spare)、使用率(Percentage Used)、メディアエラー数(Media and Data Integrity Errors)、エラーログエントリ数(Number of Error Information Log Entries)、などの属性に変化の可能性があります。

　HDDでは、図3のとおり代替処理が行われたセクタへのアクセスのみ以後毎回代替領域に飛びますので、当該セクタを含む領域のアクセス性能は低下したままとなります。代替領域へのアクセスに回転待ちが必要であれば性能低下度合いは顕著になります。特にストリーミングデータの読み書きなどシーケンシャル性能の安定性が求められる場合には注意が必要となります。

　一方SSDでは、Read時やWrite時に代替処理が発生した場合はデータのコピー処理が、Erase時に代替処理が発生した場合は再度のErase処理が必要となり、この結果一時的に性能が落ちます。

　その代わり、HDDのように「あるセクタだけ代替領域にアクセスする」ということはなく、シーケンシャルアクセスにおいても性能劣化は（もちろんメーカー依存ですが）軽微で済む可能性が高いです。

　ただこの「代替処理による性能低下が一時的で済む」というSSDの特徴は、逆に「実使用上は何ら問題ないように見えてしまう」ことに繋がります。

　このためSSDの利用者としては、この「S.M.A.R.T.属性値の変化」や「性能の一時的な変化」をとらえて代替処理の発生を早期に察知し、例えば「バックアップをとる（頻度を高くする）」「バックアップや（RAIDなどの）冗長化機能を確認する」「SSDの交換を検討する」「交換用SSDを手配する」などの対策を講じること大事です。

# さいごに
　今回の記事では、SSDにおける「代替処理」を説明しました。

　NANDフラッシュメモリへのアクセスではRead時とWrite時とErase時の各処理でエラー発生の可能性があり、エラー発生時は最終的にバッドブロック発生に至ることがあります。バッドブロックが発生すると、当該ブロックの代わりに代替領域からブロックが割り当てられ、発生したエラーにしたがいリカバリ処理が行われます。これがSSDにおける代替処理です。

　ただ説明中でも触れたとおり、実製品における代替処理や代替処理に繋がるバッドブロック化に関する条件や処理は、NANDフラッシュメモリメーカーやSSDメーカーにより大きく異なる可能性がありますのでご注意ください。

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