SSDとFTL(Flash Translation Layer)の影響
SSDが速い理由と突然遅くなる理由を内部から理解。FTLとウェアレベリング、書き込み増幅とTRIMの連携まで、I/O設計の勘所が一本でつながります。
- 1.NANDはページ単位で書け、消去はブロック単位という非対称性を持つ。上書き不能なため、FTLが論理アドレスを空きページへ書き、旧ページを無効化するアウトオブプレース更新を行う。
- 2.FTLはL2P変換表・ウェアレベリング・ガベージコレクションを担い、有効ページの退避で物理書き込みが論理書き込みを上回る書き込み増幅(WAF)が生じる。
- 3.TRIM/discardでOSが不要LBAをFTLへ伝えるとGCの退避量が減りWAFと遅延を抑えられる。4KB境界整列とログ構造的な書き方がI/O設計の要になる。
SSDはディスクのふりをした別物
OSから見たSSDは、HDDと同じく512バイトや4KBのセクタが並ぶブロックデバイスです。read/write はシステムコールを経て同じLBA(論理ブロックアドレス)で要求されます。ところが内部の物理は全く違います。HDDが任意セクタを何度でも上書きできるのに対し、SSDの記憶素子であるNANDフラッシュは一度書いた場所をそのまま上書きできないという根本的な制約を持ちます。この溝を埋め、SSDを「ただの速いディスク」に見せかけているのが FTL(Flash Translation Layer) です。FTLの挙動を知らないと、SSDが速い理由も、ある日突然遅くなる理由も説明できません。
NANDの非対称性:ページで書き、ブロックで消す
NANDフラッシュの読み書きには3つの操作があり、その単位がそろっていません。
| 操作 | 単位 | おおよその単位サイズ | 特徴 |
|---|---|---|---|
| 読み出し(read) | ページ | 4〜16KB | 高速・単位が小さい |
| 書き込み(program) | ページ | 4〜16KB | 1→0方向のみ。空きページにしか書けない |
| 消去(erase) | ブロック | 数百ページ=数MB | 0→1へ戻す。低速で単位が大きい |
要点は、書き込みはページ単位なのに、消去はずっと大きいブロック単位という非対称性です。program は「1のビットを0にする」方向にしか動かせず、いったん書いたページを違う値に書き直すには、まずブロックごと消去して全ビットを1へ戻すしかありません。ところが1ブロックには数百ページが同居するため、1ページを書き換えたいだけでも周囲を巻き込んでしまう。だから素朴な「同じLBAをその場で上書き」は物理的に不可能なのです。
FTLの基本戦略はアウトオブプレース更新です。LBAへの書き込みは毎回どこかの空きページへ書き、古いページは「無効(stale)」と印を付けるだけで消さない。これにより遅い消去を書き込みの都度行わずに済みます。代償として、無効ページがブロックに散らばっていく問題が生まれます。
FTLの三大仕事:変換・平準化・回収
FTLはコントローラ上で動くファームウェアで、主に3つの役割を負います。
1. L2P(論理→物理)アドレス変換。 OSが書くLBAと、実際に書かれたNAND上の物理位置(PPA)は毎回ずれます。FTLは両者を対応づけるマッピングテーブルを持ち、読み出し時はここを引いて実体ページへ辿ります。表は通常DRAM上に置かれ、容量1TBあたり概ね1GB(4KBページ・4バイトエントリの目安)が必要になります。
2. ウェアレベリング(摩耗平準化)。 NANDの各ブロックには消去回数の寿命(P/Eサイクル、近年のTLC/QLCでおおむね数百〜数千回)があり、同じブロックばかり消すとそこだけ先に死にます。FTLは書き込み先を全ブロックへ均等にばらまき、消去回数を平準化してデバイス全体の寿命を延ばします。アウトオブプレース更新が、結果的にこの分散を自然に助けます。
3. ガベージコレクション(GC)。 無効ページが溜まると空きページが枯渇します。GCは無効ページの多いブロックを選び、まだ有効なページを別ブロックへコピーで退避してから、元ブロックを消去して空きに戻します。この退避コピーこそが、次に述べる書き込み増幅の正体です。
GC前: Block A [有効][無効][有効][無効][無効][有効] ← 無効が多い
↓ 有効ページだけ Block B へ退避コピー
GC後: Block B [有効][有効][有効]... (新しい書き込み先)
Block A → 一括消去 → 空きブロックに復帰
書き込み増幅(WAF)がI/O設計を縛る
GCの退避コピーは、OSが要求していない余分なNAND書き込みです。これを定量化したのが 書き込み増幅率(WAF, Write Amplification Factor) で、
WAF = NANDへの実物理書き込み量 / ホストが要求した論理書き込み量
と定義されます。WAFが1なら理想(要求どおりだけ書く)、2なら要求の2倍をNANDが書いている、ということです。WAFが効いてくる帰結は3つあります。
- 寿命が縮む。 物理書き込みが増えればP/Eサイクルの消費も増え、SSDの総書き込み可能量(TBW)を食いつぶします。
- 速度が落ちる。 空き枯渇下では書き込みのたびにGCが割り込み、退避と消去で遅延が跳ね上がります(ガベージコレクションによる遅延の裾)。
- 空きが減ると悪化する。 ブロックの有効ページ率が高いほど退避量が増え、WAFは非線形に膨らみます。
ここで効くのが オーバープロビジョニング(OP) です。表示容量より多いNANDを内部に隠し持ち、GCの作業領域を確保しておく。OPが厚いほど「ほぼ無効だけのブロック」を作りやすく、退避コピーが減ってWAFが下がります。エンタープライズSSDが容量を削ってでもOPを厚くするのはこのためです。
4KBのランダム書き込みを撒き散らすと、各ブロックに有効ページと無効ページがまだらに混じり、GCの退避量が最大化します。逆に大きく連続したシーケンシャル書き込みはブロックを丸ごと無効化しやすく、退避ゼロで消去できるためWAFが1に近づきます。これが「ログ構造的に追記せよ」という設計原則の物理的根拠です。
TRIM/discard:OSとFTLの情報連携
FTLが抱える本質的な弱点は、どのLBAがもう不要かをFTL自身は知らないことです。ファイルシステムがファイルを削除しても、メタデータ上で空きにするだけでデバイスへは何も伝えません。FTLから見ると、解放されたページは依然「有効データ」に見え、GCが律儀に退避し続けます。これが無駄な書き込みと寿命消費を生みます。
この溝を埋めるのが TRIM(ATA)/deallocate・discard(NVMe) コマンドです。OSが「このLBA範囲はもう中身に意味がない」とFTLへ明示的に通知すると、FTLは該当ページを即座に無効扱いにできます。
| 項目 | TRIMなし | TRIMあり |
|---|---|---|
| 削除済みデータ | FTLは有効と誤認しGCで退避 | 無効と分かり退避不要 |
| WAF | 高い(無駄な退避が増える) | 低い(退避量が減る) |
| 空きブロック確保 | 遅い・枯渇しやすい | 速い・余裕が生まれる |
| 書き込み遅延 | GC割り込みで悪化しやすい | 安定しやすい |
Linuxでは2つの発行方式があります。オンラインdiscard(マウントオプション discard)は削除のたび即TRIMを送りますが、コマンドが書き込み経路に割り込み遅延要因になり得ます。一般に推奨されるのは バッチdiscard(fstrim を定期実行)で、未使用LBAをまとめて通知し平常時のI/Oを乱しません。なお fstrim はページキャッシュの書き戻しとは別レイヤの話で、あくまでブロック層から下への通知である点に注意します。
I/O設計への実務的な含意
FTLの性質は、上位のI/O設計に具体的な指針を与えます。
- 書き込みは4KBに整列する。 NANDの内部ページ境界とずれた書き込みは、1論理書き込みが2物理ページにまたがるread-modify-writeを誘発しWAFを上げます。パーティションとファイルシステムのブロックを4KB境界にそろえるのが基本です。
- 小さなランダム上書きより追記を選ぶ。 LSMツリーやジャーナル、WALのようなログ構造の書き方はシーケンシャルに寄り、FTLのGCと相性が良い。多くのDBがこの形を採るのは偶然ではありません。
- TRIMを効かせる。 ファイルシステムとブロックデバイスでdiscardが通る構成を組み、
fstrimを定期化します。 - 並列で叩く。 SSDの性能源は内部の多チャネル並列です。I/Oスケジューラでの並べ替えより、マルチキューブロック層で深いキュー(queue depth)を保ち多数の要求を同時に流すほうが効きます。
「SSDで書き込み性能が経年で落ちるのはなぜか」を一言で説明できるか。空き領域が減るとGCの退避量が増えてWAFが上がり、書き込みのたびに消去が割り込むから、が核。緩和策はTRIMで不要LBAを通知すること、オーバープロビジョニングを厚くすること、そしてランダム小書き込みをシーケンシャルに寄せること。「ページ単位で書き・ブロック単位で消す非対称性が全ての出発点」と添えられれば完璧です。
まとめ
OS Article
SSDとFTL(Flash Translation Layer)の影響を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
SSD
比較で見る軸
難易度: advanced / カテゴリ: OS / タグ数: 6
導入後に効く点
FTLはL2P変換表・ウェアレベリング・ガベージコレクションを担い、有効ページの退避で物理書き込みが論理書き込みを上回る書き込み増幅(WAF)が生じる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- OS
- タグ数
- 6
判断チェックリスト
- 自社の用途が「SSD / FTL」に近いか確認する。
- 強みである「NANDはページ単位で書け、消去はブロック単位という非対称性を持つ。上書き不能なため、FTLが論理アドレスを空きページへ書き、旧ページを無効化するアウトオブプレース更新を行う。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。