« 続報: microSD カードの寿命を調べる | トップページ | 続報3: microSD カードの寿命を調べる »

2015年3月 1日 (日)

続報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 のテストプログラムに合わせた。

Atto

やはりこれだとエラーが山ほど出る。新品の 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 は数千の後半だと考えられるので、この結果から以下の可能性が考えられる。

  1. 仮定通り WA ≒ 1 で Wear Leveling を全く行っていない
  2. 仮定に反して WA = 2~3 で Dynamic Wear Leveling を行っている
  3. 仮定に反して WA = 3~4 で Static Wear Leveling を行っている
  4. 仮定通り 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 を小さくすれば、現状でもほとんどエラーが出ることは無い。

Atto2

ATTO は指定したドライブのルートに benchtst.$$$ と言う固定した名前のファイルを作るのでテストを行う都度上書きしているはずだ。

ここで Run Continuously にチェックを入れてテスト実行してみる。この場合実行時間を指定できる。1回のテストが約 12 秒かかるので 20 分を指定すれば約 100 回上書きを行っていることになる。まずこれでどの程度エラーが発生するか調べるのだが、実際にやってみるとエラーは全く発生しなかった。

Atto3

次に 200 分 ≒ 1,000 回を指定して繰り返しテスト行い、発生するエラー数がどのように変化するか調べた。比較的短時間と言っても 200 分 = 3 時間 20 分である。今までのテストに比べれば短時間、と言う意味だ。

200 分の 11 回目でエラーが発生した。

Atto20011

しかし不一致情報はログされていない。またこの後エラーが引き続き発生することもなかったので microSD カードの接触不良のような一過性の問題だった可能性が高い。

更にテストを続けると 200 分の 15 回目で不一致のエラーが記録され始めた。

Atto20015

この時のログの先頭は以下の通りだ。

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 を全く行っていないと考えてもおかしくない程度の結果である。

そうなると、普通この程度は持つだろうと私が考えている結果が得られるのはまだ少し先、と言うことだ。気長に待つしかない。

|

« 続報: microSD カードの寿命を調べる | トップページ | 続報3: microSD カードの寿命を調べる »

BeagleBone Black」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/543745/61214463

この記事へのトラックバック一覧です: 続報2: microSD カードの寿命を調べる:

« 続報: microSD カードの寿命を調べる | トップページ | 続報3: microSD カードの寿命を調べる »