続報2: microSD カードの寿命を調べる
磁気研究所ブランドの microSD がついにご臨終になったようだが、Windows の環境で調べるとまだ大丈夫のように見える、と前回の記事に追記した。今回はその続きで、何が起こっているのか考察してみる。
/*----------- -----------*/
テストプログラムを Windows で動かす
テストプログラムは Python で書いていたので Windows 上でも動かすことができる。実際に試すとがっかりする結果になった。
J:\>python wrt_chk.py
Check OK!
## I/O time: operation total max min
#WRT_256k 526.7 1.942 0.173
#WRT_256M 1245.2 417.828 412.405
#RD_256k 2.7 0.294 0.002
#RD_256M 2.0 0.680 0.674
J:\>
結果に表示した処理時間は秒単位である。やたら書き込みに時間がかかっているが、これが寿命が尽きかけていることが原因なのかそうでないのか、新品の状態で同じテストを行っていないので分からない。
がっかりしたのは読出しが異様に早く終わっていること。これは間違いなくキャッシュを読んでいる。Windows はストレージに書き込んだのと違うデータが読み出される事態を想定していないから、書き込みデータがキャッシュに残っていれば読み出しに行った時無条件にそれを返して来る。これではテストにならない。
ATTO Disk Benchmark を使う
これはディスクの I/O パフォーマンスを測るプログラムだが、Direct I/O に加えて I/O Comparison をサポートしている。書き込んだデータが正しく読み出せているか確認する機能である。ブロックサイズと総書き込み量は Python のテストプログラムに合わせた。
やはりこれだとエラーが山ほど出る。新品の SD カードやハードディスクでエラーが出ることはあり得ないので、テスト対象の microSD の寿命が尽きかけている事の表れと考えて間違いない。
これは Direct I/O だから分かることだ。書き込んだデータを WinMerge などで普通に比較したのではエラーが見つからない。
今回の記事の本題ではないが、製品の保証の事を考えるとこれは結構厄介な事態を引き起こすかもしれない。「パソコンで正常に読み書きできるなら製品は正常。うまく読み書きできないスマホ(or デジカメ etc.)に問題がある。」と言い逃れされそうな気がする。もちろん今回やったようなテストは「通常の使用」に該当するかどうかおおいに怪しいから、今話題にしている microSD の保証を求めるつもりはない。しかし実際に「通常の使用」中に同じような状態になったらどうだろう、と言うことである。
microSD の寿命に関する数式モデル
単純化して数式モデルを作ってみた。
- C: microSD の総容量 [バイト]
- Ds: テストで書き変わらないデータ量 [バイト]
- W1: 1回のテストで書き込むデータ量 [バイト]
- Wt: 寿命に到達するまでに書き込めるデータ量 [バイト]
- WA: Write Amplification [無単位]
- E: 寿命 [消去&プログラム回数]
バイト単位と表示したものは、同じ単位ならキロバイトでもメガバイトでも良い。テストプログラムは毎回同じファイル名で上書きする想定だ。
- Wear Leveling を全く行っていない場合: E = Wt / W1
- Dynamic Wear Leveling を行っている場合: E = WA × Wt / (C - Ds)
- Static Wear Leveling を行っている場合: E = WA × Wt / C
Wear Leveling を行っていない場合は単純に上書き回数が寿命になるはずだ。Dynamic Wear Leveling を行っている場合、書き込みは microSD の空き容量全体にまんべんなく行われるが、1回のテストでフラッシュメモリーに実際に書き込まれるデータ量は Write Amplification を考慮する必要がある。Static Wear Leveling なら書き込みは microSD 全体にまんべんなく行われる、と言うこと。
今回行ったテスト条件と結果をこの数式モデルに当てはめると以下のようになる。
- C = 4 × 109
- Ds = 1 × 109
- W1 = 10243
- Wt = 9.3 × 1012
WA と E の正確な値は分からない。今回の条件だと WA は1に近いと考えられる。また E は数千~1万程度と言われている。従ってこれらの情報からつじつまの合いそうなシナリオを考えることになる。
WA ≒ 1 はかなり確実そうなのでこの通りと仮定し、各 Wear Leveling 方式の場合の E を計算してみよう。
- Wear Leveling を全く行っていない場合: E = (9.3 × 1012) / (10243) ≒ 8,700
- Dynamic Wear Leveling を行っている場合: E = 1 × (9.3 × 1012) / ( 4 × 109 - 1 × 109) ≒ 3,100
- Static Wear Leveling を行っている場合: E = 1 × (9.3 × 1012) / (4 × 109) ≒ 2,300
通常 E は数千の後半だと考えられるので、この結果から以下の可能性が考えられる。
- 仮定通り WA ≒ 1 で Wear Leveling を全く行っていない
- 仮定に反して WA = 2~3 で Dynamic Wear Leveling を行っている
- 仮定に反して WA = 3~4 で Static Wear Leveling を行っている
- 仮定通り WA ≒ 1 で何らかの Wear Leveling を行っているが、寿命の短いフラッシュメモリーを使っている
ここで他の microSD サンプルとの関係を考えると W1 は全く同じ、C および Ds もほとんど同じである。そうなるとよほど特殊な事情が無い限り WA も同じになるはずだ。もしそうだとすると上記 2. および 3. の可能性はあまり無さそうだ。
つまりこう言うこと。
他のサンプルで現在の書き込み量が 1.6 × 1013バイト近くになっているものがある。このサンプルに上記可能性 2 および 3 の前提条件をである WA = 2~4 を当てはめて考えると、Static Wear Leveling を行っていて WE が2.5 以下の場合を除き E が1万を超えてしまうからである。
従って WE は最大 2.5。この上限は現在の値で、テストが進むともっと小さくなる可能性がある。限りなく 1 に近い、と言う仮定が正しいようだ。磁気研究所ブランドのサンプルについては上記 1. または 4. の可能性が高い。
問題は Wear Leveling を行っているかどうか。これを調べるにはそれなりに手間がかかるが、やってみる価値はあるだろう。
Wear Leveling を全く行っていないかどうか調べる
少量のデータを繰り返し上書きすると Wear Leveling を全く行っていない場合その領域は比較的短時間で寿命に達する。このことを利用して調べることができないか試した。
ATTO でTotal Length を小さくすれば、現状でもほとんどエラーが出ることは無い。
ATTO は指定したドライブのルートに benchtst.$$$ と言う固定した名前のファイルを作るのでテストを行う都度上書きしているはずだ。
ここで Run Continuously にチェックを入れてテスト実行してみる。この場合実行時間を指定できる。1回のテストが約 12 秒かかるので 20 分を指定すれば約 100 回上書きを行っていることになる。まずこれでどの程度エラーが発生するか調べるのだが、実際にやってみるとエラーは全く発生しなかった。
次に 200 分 ≒ 1,000 回を指定して繰り返しテスト行い、発生するエラー数がどのように変化するか調べた。比較的短時間と言っても 200 分 = 3 時間 20 分である。今までのテストに比べれば短時間、と言う意味だ。
200 分の 11 回目でエラーが発生した。
しかし不一致情報はログされていない。またこの後エラーが引き続き発生することもなかったので microSD カードの接触不良のような一過性の問題だった可能性が高い。
更にテストを続けると 200 分の 15 回目で不一致のエラーが記録され始めた。
この時のログの先頭は以下の通りだ。
Friday, February 27, 2015 4:59 PM Running Untitled.... Bench32 logged 542 errors for drive (j:) Transfer Size: Buffer Index: Expected Value: Actual Value: 256.0 8198 64D84512 64C84512 256.0 8207 23252E8C 21256E8C 256.0 8208 69B96B22 69B9EB22 256.0 8209 57A75338 D7A75338 256.0 8210 3E73535D 3C71535D 256.0 8213 5AA54932 5AAD4932 256.0 8215 13D22026 13D22226 256.0 8219 237D6A88 237C6A88 (以下省略)
この後もエラーが出続けたので 17 回目を最後に打ち切った。15 回目は 542 件、16 回目は 2,385 件、17回目は 644 件エラーが発生した。
200 分のテストでは 256k バイトのデータを約 1,000 回上書きしているので、書き込みデータ量としては 256M バイト弱である。15 回繰り返したことによる総書き込み量は約 3750M バイトだ。
僅か 3750M バイト書き込んだだけでエラーが出始めたのは Wear Leveling を全く行っていない証拠、と言いたいところだが、この事実だけでそう言い切ることはできない。既に 9T バイトを超える書き込みテストを行っているので寿命を迎える直前の状態で今回のテストを始めた可能性を否定できないからだ。
しかし 15 回目以降継続してエラーが発生するようになったことを併せて考えると、Wear Leveling を全く行っていない可能性がかなり高い、と言えるだろう。Wear Leveling を行っていれば毎回エラーが発生するような状況になるのはおかしいと考えられるからである。ただし全体として寿命に到達したため、それまで行っていた Wear Leveling を停止した可能性もある。
結論: 現状は Wear Leveling を全く行っていない可能性が高い。しかし新品状態でどうだったかについては分からない。
数日の時間を費やしたが、残念ながら決定力に欠ける結果になってしまった。
今回のまとめ
テストを開始2か月で4サンプル中1つの結果が得られた。Wear Leveling を全く行っていないと考えてもおかしくない程度の結果である。
そうなると、普通この程度は持つだろうと私が考えている結果が得られるのはまだ少し先、と言うことだ。気長に待つしかない。
| 固定リンク
「BeagleBone Black」カテゴリの記事
- DSDはピアノ・ピアニッシモを奏でられるのか?(2016.08.01)
- 最終回: microSD カードの寿命を調べる(2015.07.27)
- 続報3: microSD カードの寿命を調べる(2015.05.02)
- 続報2: microSD カードの寿命を調べる(2015.03.01)
- 続報: microSD カードの寿命を調べる(2015.02.21)
この記事へのコメントは終了しました。
コメント