2008/02/24(日)フラッシュメモリは何日で壊れる? ウェアレベリングの仕組み

一昔前はLinuxマシンにCFディスクをCF→ATAPI変換して使うということもありました。SSDをはじめ半導体不揮発メモリが盛り上がりつつある時代、寿命について考えてみたいと思います。

なお、SSDのいわゆるプチフリーズと呼ばれる現象の正体は、このウェアレベリングに他なりません。*1

資料:SanDiskCF仕様書SanDiskウェアレベリング(ホワイトペーパー)

SanDiskのCFについて考察しますが、他社製の半導体メモリでも同様の機構があります

*1 : このような書き込み中に数秒とまるという現象は、SSD登場以前のCFでも既に起こっていました。

半導体メモリの寿命

ほぼすべての半導体メモリには構造上の寿命があります。これは書き込み回数の制限で、一般的に10万回(多くて30万回)と言われています。しかしこれはSLCタイプと呼ばれるメモリの話で、現在主流となっている安価なMLCタイプ*2では1万回程度と言われています。(この記事では30万回を寿命として計算していますので、普通のSD等では1/30だと読み進めてください。)

30万回ならば到底問題ないじゃないかと思うかも知れません。

しかし、例えば30万回だとして、1秒に1回データを書き込んでいたとすると

3600(秒)×24(時間)=86400
86400×4日=345600

となり、たった4日で壊れる計算になります。同じファイル(の同じ場所)をそんなに書き換えないと思うかも知れませんが、ファイルシステムというものが存在するので、ログディレクトリ内で1秒1回書き込んでいると、常に同じ場所に存在するログディレクトリ(ディレクトリファイル)は1秒に1回書き換えられることになります。*3

デジカメの写真なら30万枚撮らないと壊れませんが、パソコンのディスクとして使用すると結構簡単に壊れることが分かると思います。

*2 : この回数は1セルに2bit以上記録する。

*3 : Windowsは、ファイルに触るたびにファイルへの最終アクセス時刻をファイルシステムに記録するのでもっと酷いことになります。レジストリを操作すればオフにできますが。

SanDisk製コンパクトフラッシュの故障防止機構

SanDisk製CFにはウェアレベリングという故障防止機構が搭載されいてます。

ディスク容量などによって大きさは変化しますが、CFは16KBごとの物理ブロックに分割されて内部管理されています。またディスク全体は4MBごと*4にゾーンとして切り分けています*5。各ゾーンは約3%(128KBぐらい)の余剰領域(通常はアクセスできない)を持っています。

waer_leveling.png

CF内のアドレス(CHS/LBA)はそれぞれ4MBごとに物理ゾーンと対応しています*6。各ゾーンは「Erase Pool」と呼ばれる空き領域の線形リストを持っています。データの書き込まれていないブロックはすべてErase Poolに置かれます

ゾーン内への書き込み命令があったとき、対応する物理アドレスを直接書き換えるのではなく、「Erase Pool」から1ブロックを取り出しそこに内容を書き込み、それを(内部的に)書き込んだ論理アドレスに対応させます。今まで論理アドレスに対応していた物理ブロックは消去した上で「Erase Pool」に移動されます。こうすることでゾーン内での書き込みを分散させます。

しかしこのままでは、各ゾーン(に対応する論理アドレス)に書き込みが集中したときあっという間に壊れてしまいます。そのためゾーンに対する書き込みがある一定数に達すると「対応ゾーンの変更処理」が行われます。ゾーンAとゾーンBのデータが入れ替えです。入れ替えといっても、ディスク内部でデータを互いにコピーしているだけですので少々時間がかかります。実際、CFに対して連続書き込み*7を行うと、一定回数書き込みむごとに動作が2~3秒停止します*8。このときゾーン間のコピーが発生しているようです。

このようなゾーン内の分散処理とゾーン自体の入れ替え処理により、書き込み負荷はディスク全体に分散され、ディスクに空き領域があればあるだけディスクの寿命が伸びます。半導体メモリ各社で実装には色々な違いや特徴(特許)ががりますが、このようなディスクの機構をwear leveling(ウェアレベリング)といいます。

*4 : ディスクによって異なります

*5 : 書き込みや読み込みは、通常ページやセクタ単位(512byte等)で行われますが、消去(空き領域管理)はゾーン単位です

*6 : メモリのページング機構みたいなもの

*7 : 同一ファイルの上書きアップデートとF_SYNC

*8 : SSDで言うところのいわゆるプチフリーズ現象です。

ウェアレベリングの実際

かなり秀逸な機構……に見えますが、実際はそうそう上手く行きません。この機構が正しく働くためには、書き込みを行うディスクに空きゾーン領域がたくさんなければなりません。

例えば、CFディスクを結構使い動作も遅くなってきたので、一度フォーマットして全領域を一度開放したいと思ったとします。ここで、WindowsなどからCFディスクをフォーマットすると(クイックフォーマット除く)どうなるでしょうか? 空き領域(空きブロック/空きゾーン)を増やすつもりが、逆にCFディスクの全領域が使用中にマークされてしまいます。空き領域(空きブロック等)を増やそうとファイルを削除してもまったく増えません。

なぜなら、ディスクはファイルシステムの空き領域を知ることはできないからです*9。ディスク側は1度でも何か書き込まれれば、そのブロックは使用済領域とみなします。

もし、ディスクの空き領域(空きブロック等)を増やすのであれば、ディスクに対してそのブロックが既に使用されてないことを教える特殊なコマンドを発行してあげる必要があります。実際、CFにはそのようなコマンドとして「CF ERASE SECTORS」が規定されています。しかしながらIDEディスク代わりやUSBメモリとして使っている場合、このコマンドは発行されません*10

要するに全く未使用の状況ならともかく、使っているうちに実際のディスク使用率(ファイルシステム上の空き領域)に関わらず「Erase Pool」はどんどん減少していきます。うっかり通常フォーマットやエラーチェックでディスク全体の書き込み検査でもしようものなら、「Erase Pool」は最初から余剰分として用意された3%しか無くなります。

*9 : ディスク自体にファイルシステムの機能があるのではなく、OSがファイルシステムを持っているのだから当たり前です

*10 : OSとデバイスドライバに依存しますが、OSがディスクを普通のHDD等とみなしている限り無理でしょう。ZPOOL(ZFS)なんかだと、ディスクまで開放命令(ERASE SECTORS)が発行されるみたいです。あとここ最近のSATA接続のSSDとかも開放されるらしい。

3%の余剰セクタで何日使える?

例えばディスク容量が2GBとすると、2048MBの3%で62MBの余剰領域となります。16KBの消去ブロックで考えると62MB/16KB=約4000となります。理想通り効率的にディスク全体に書き込みが分散されるとしたら、1秒1回書き込むとして

4000(ブロック数)×300000(寿命)/86400=13653日

となります。書き込み回数が1秒2回(各16KB以内)ならば、この値は半分になるし容量が半分になっても半分になります。

用途によっては秒間10回(または160KB/sec)の書き換えというのは、それほど非現実的ではありません。このときたった136日でCFは壊れます。もちろんこれはウェアレベリングが理想的に動作したときで、実際はもっと前にエラーが起こるでしょう。

CFのエラーマネジメント機構

ちなみにCFには(HDDにも)エラーマネジメント機構として、エラーのあった場所を代替セクタで置き換えるシステムがあります。HDDのエラーは一度起これば広範囲かつ致命的に起こるのですぐに発見できますが、CFのエラーは局所的にしか発生しないため、エラーマネジメントによって置き換えられ隠蔽されます。*11

よってCFのエラーの発生を調べるのはかなり大変です。

*11 : 仕様書には記載されていませんが、この置き換えにはさきほどの3%の余剰ブロックが使われていると思われます。

まとめ

半導体メモリを使用する際は、構造的な有限寿命であることを考慮の上、書き込み回数をよく見積もってから使うべきです。ユーザー環境なら構わないでしょうが、サーバや組み込み系システムで(HDDよりもいいだろうと思って)安易に半導体ディスクを使うと大変なことになります。

今回行った計算はあくまで例です。寿命はセルあたりの書き込み回数寿命、ウェアレベリングの方式、zoneサイズ、全容量が大きく関係しますが、それは製品によって異なります。

2006/12/17(日)Apple社製USBメモリ

最近かえでさんに頼んでUSBメモリを買ってもらいました。ちょうどUSBメモリを1つも持ってなかったので*1、まあいいやと。

このUSBメモリ、どういうわけか音楽再生機能が付いていて、選ぶのも面倒だったのである方に適当にセレクションしてもらいました。しばら~~~く聞いていて(トータル2~3時間ぐらい)「宇宙で恋は☆るるんルーン」が流れたときに思わず漏れた一言。

「やっと普通の曲が出た」(ほっ

……はっ!? いやまてまて自分。「宇宙で恋は☆るるんルーン」のどこが普通の曲なんだ!!

それぐらい聞いていて知らない曲ばっかりのすごい選曲でした……。

*1 : 512MB SDとか、256MB CFとかは腐ってるんですが。しかもどっちも高速タイプ(汗)

歴代PCメモ

はてブ数 2000/03/01メモPC

古いもの

CF-SZ6, Core i5 7200U, LPDDR3 8GB

CF-SZ6.png
crucial_MX300_525GB.png

  • CPU : Core i5 7200U / 2.5GHz / 2C4T / Kaby Lake-U
  • RAM : LPDDR3 8GB
  • SSD : CT525MX300SSD1 / Crucial MX300 525GB / SATA / 160TBW / TLC
  • GPU : Intel HD Graphics 620
  • Cinebench R23: 1781/732 (AC電源)
  • DQ10ベンチ 1280x720フルスクリーン 標準画質
    • GPU電源プラン 省電力:5983 バランス:7393 最大:8159
2017年5月購入。

Ryzen 4750G, DDR4 3600MHz 16GB

Ryzen 4750G.png
WD Blue SN550 NVMe 1TB.png

  • CPU: Ryzen 4750G / 3.6GHz / 8C16T / zen2 Renoir
  • M/B: ASRock A520M-HDV
  • RAM: PVS416G360C7K / Patriot Viper Steel DDR4 3600MHz CL17 8GB x 2
  • SSD: WDS100T2B0C-EC / WD Blue SN550 NVMe 1TB / 600TBW / TLC / PCIe3.0
  • GPU: Radeon Graphics 8
  • Cinebench R20: 4782
  • Cinebench R23: 12408/1305
  • iGPU VRAM: 2GB
    • DQ10ベンチ Ver1.5 1920x1080 最高画質: 12142
    • FF14暁月のフィナーレ 1920x1080 最高品質: 3807
      • Re Size Bar有効 VRAM 2GB: 3804
      • Re Size Bar有効 VRAM 4GB: 3807
  • アイドル時電力: AMD Ryzen Balanced 15W / 省電力 11W
    • BIOS設定 Global C-State Control: Auto
2020年9月28日。

HP ProDesk 600 G4 SFF, Radeon RX 6400, DDR4 16GB

ProDesk-600.png
ProDesk-600_ssd.png

  • メーカー: HP ProDesk 600 G4 SFF
  • CPU: Core i5 8500 / 3.0GHz / 6C6T / Coffee Lake
  • RAM: DDR4 2666 8GBx2*1
  • SSD: LEGEND 800 ALEG-800-1000GCS / 1TB / 600TBW / TLC / PCIe4.0 (PICe3.0接続)
  • GPU: SAPPHIRE PULSE Radeon RX 6400 GDDR6 4GB (PICe3.0接続)
  • Cinebench R20: 2226
  • Cinebench R23: 5530/1058
  • DQ10ベンチ Ver1.5 1920x1080 最高品質: 8521
  • FF14暁月のフィナーレ 1920x1080 最高品質: 9675
  • Intel UHD Graphics 630 使用
    • DQ10ベンチ Ver1.5 1920x1080 最高画質: 6151
    • FF14暁月のフィナーレ 1920x1080 最高品質: 1170
  • アイドル時電力: 14W / グラボなし: 9W
2022年9月4日。DQ10ベンチが苦手(GPU使用率が60%ぐらい)でスコアが伸びず。

*1 : 元々の8GBメモリに、シリコンパワー1.2V CL19 SP008GBLFU266B02 2666 8GBを追加。

HP EliteDesk 800 G4 DM, DDR4 16GB(ミニPC)

EliteDesk_800_G4_8500T_01.png
EliteDesk_800_G4_8500T_02.png

  • CPU: Core i5 8500T / 3.0GHz / 6C6T / Coffee Lake
  • RAM: DDR4 2666 8GB + CFD DDR4 3200 8GB
  • SSD: Western Digital CL SN520 SDAPNUW-256G / 256GB / 200TBW / PCIe3.0x2
  • Cinebench R20: 1647
  • Cinebench R23: 4243/880
  • DQ10ベンチ Ver1.5 1920x1080 最高品質: 5031
  • FF14暁月のフィナーレ 1920x1080 最高品質: 1037
2024年3月購入。アイドル時8W。いわゆるミニPC。

Beelink MINI S12 Pro N100, DDR4 16GB(ミニPC)

Intel-N100.jpg
Intel-N100_ssd.png

  • ミニPC: Beelink MINI S12 Pro
  • CPU: Intel N100 / 3.4GHz / 4C4T / Alder Lake-N
  • RAM: DDR4 3200 16GB
  • SSD: AZW 512G / NVMe 512GB / MAP1202搭載 / PCIe3.0x1接続
  • Cinebench R20: 1121
  • Cinebench R23: 2921/932
  • Intel UHD Graphics
    • DQ10ベンチ Ver1.5 1920x1080 最高品質: 6320
    • FF14暁月のフィナーレ 1920x1080 最高品質: 998
    • FF14暁月のフィナーレ 1920x1080 標準PC: 2258
  • アイドル時6W(Windows11/Linux)。Cinebench中24W。FF14ベンチ30W→25W。
    • BIOS: Advacnced→Power→GT→RC6 Enable。これがオフだとアイドル8W。
Linuxサーバ化。
  • NVMe: MS950G75PCIe4-02TB / 2TB / 2000TBW / TLC / PCIe4.0対応
  • SATA: CT2000BX500SSD1JP 2000GB / 2TB / 720TBW / TLC
2023年7月1日。レビュー記事。付属SSD性能はPCIe3.0x4接続ならもっと速い(↓)。

Core i3 12100F, GeForce RTX4700 12GB, DDR4 64GB

12100F.png
12100F_ssd.png

  • CPU: Core i3 12100F / TDP:58W,89W / 4C8T / Alder Lake-S
  • M/B: ASRock B660M Phantom Gaming 4
  • RAM: PVB464G360C8K / Patriot DDR4 3600 32GBx2
  • SSD: AZW 512G(MINI S12 Pro付属) / MAP1202搭載 / PCIe3.0x4接続
  • GPU: GV-N4070WF3OC-12GD / GIGABYTE GeForce RTX4070 GDDR6X 12GB(流用)
  • Cinebench R20: 3179
  • Cinebench R23: 8269/1621
  • DQ10ベンチ Ver1.5 1920x1080 最高品質: 22858
  • FF14暁月のフィナーレ 1920x1080 最高品質: 24303
  • アイドル時電力 Windows:34W, Linux:37W
2023年7月7日。ゲームマシンではなくAI用サーバ。Resize Bar有効。

電源のアイドル電流メモ

PS-ON(GNDと緑の線をショート)させた状態での消費電力メモ。
電源最大80PLUSアイドル電流
Antec EA-380D Green380W2W
Aopen AO300-08TE8(H360K-300BK付属)300W3W
玄人志向 KRPW-TX300W/90+300W3W
※EA-380D Greenの電源ファン: ADDA AD0812HS-A70GL 12V 0.25A 38.6CFM 80mm角×25mm*2

メモ

  • Surface Pro 5 1796
    • Core i5-7300U / 2.6GHz / 2C4T / Kaby Lake-U
    • Intel HD Graphics 620
    • RAM 8GB
    • SSD 256GB