2008年03月26日

microSDカードの書き込み耐性(3)

前記事のmicroSDカードの書き込み耐性についてmicroSDカードの書き込み耐性(2)で、microSD が壊れるまで書き込みを続けようとしてきた。
だが、まだ壊すことができていない。

いくつかのコメントにあったが、損耗平均化アルゴリズム (wear leveling algorithms) で、書き込み先を分散することで、メモリ全体に書き込みが分散されるから、この程度の書き込みでは壊れないのだろうか?

そうであれば良いのだが、私は、メモリ全体に渡って書き込みを分散することはないと考えている。

その機能を作るとすると、MMU のようにマップが必要になる。2GB の メモリ全体をカバーするとすれば、65536 個のエントリが必要になる。それぞれのエントリには、マップ先を示す 16bit のエリアと 書き込み回数を記録する 24bit ぐらいのエリアが必要だろう。
合計で、384KB が必要で、更新頻度が高いから、RAM である必要がある。そして、その RAM は不揮発性であるか、カードの電源が OFF になってから FLASH に書き戻すとかする機能を持っている必要がある。

そこまでの RAM 容量と機能を持っているのはあまり考えにくい。そういう機能ではなく、書き込み頻度の高いところを見つけて、そこの書き込み回数を記録して、ある程度の回数になれば、壊れるまえに代替ブロックに置き換えるのではないだろうか?

別の見方もある。もし完全に平均化できる機能であれば、FLASH メモリの書き込み耐性の問題はクリアしているといえるのだ。もっと大々的に宣伝されているはず。そうでないから不完全な機能だと思えるわけだ。

PC 用 ハードディスクの エラーレートを知っているだろうか?たとえば、HGST Deskstar E7K500のデータシートには、1/10^14 だと書いてある。同じ土俵の数字ではないだろうが、10万ブロック x 10万回だと 1/10^10 。ハードディスクに遠くおよばないが、容量が 1/1000 だとして、容量あたりという考え方をすれば、ハードディスクの 1/10 程度にまでなってくる。

ちなみに、損耗平均化アルゴリズム (wear leveling algorithms)があることを スペックに明記しているのは、A-DATA だけ。他はハードディスクと同じような不良ブロックマネージメント機能だと思う。

ちなみに、代替ブロックは、OS から見えないところに専用のエリアがあるはずだ。どれぐらいの容量があるかはわからないが、たぶんメモリ全体の1〜5%程度だと思う。(自信なし)
    代替ブロックの場合もマップは必要で RAM である必要がある。
    エントリのサイズが増えるが、メモリ全体の 5% しかないなら、32KB ぐらいで済みそうだ。

    また、RAM は不揮発性である必要がない。代替する毎に書き込みしても、書き込み頻度はあまり高くない。


追記:↑の考察はそうとうに甘かったようだ。入れ替える方法ならば、メモリ全体を使える。詳しくは↓を参照のこと。

どういうテストをすれば壊れるのか?

キングストンなどは 5000万回も書いても壊れなかった。どんどん代替プロックが置き換えられているとも考えられるが、Write Back キャッシュになっていて、書き込んだ回数 != Flash に書かれた回数という可能性もある。

いろいろ考えたのだが、書き込んだら確実に Flash に書かれるように 1回の書き込みサイズを 1MB にすることにした。1MB ものキャッシュを持っているとは思えないので、大丈夫だろう。

それは良いのだが、1MB もの領域を書き込んで、確認のために読み込むとなると、相当時間がかかる。だいたい 1万回書き込むのに 1時間前後。100 万回でも 4 日のオーダになる。

ここまできたら意地である。何日かかろうともやってみようと思う。


  • プログラム、flashtest2.c
    - M,K の指定ができるように若干改造


このプログラムで、まずは、300万回書き込んでみることにする。

ターゲットは、いままで使ってきた 上海問屋オリジナル 2GB 、キングストン 2GB 、A-DATA 1GB 。


    現在の状況
  • 上海 2GB 121万回 エラーなし。
  • キングストン 2GB 118 万回 エラーなし。
  • A-DATA 1GB 116 万回 エラーなし。


6 日やってこの状況だ。300 万回まで一週間以上かかる。300万回をクリアしたとしても、まだまだ続ける予定。

結果は、このページの追記に記載する。

おまけ

実はコメントを見て驚いたことがある。

多くの人が、書き込みを平均化するのに、空きエリアから代替するブロックを取ってくると考えているようなのだ。

結論から言うとそのようなことは不可能だ

空きエリアは、OS のファイルシステムが管理する。そして、その情報を、DISK に書き込まずキャッシュするのが普通なのだ。

たとえ、microSD 側が、FAT ファイルシステムの構造を知ることができても情報が最新である保証がない限り、どこが空いているか確実に知ることはできない。つまり、最新の情報は OS しかもっていないから、どこが空いているか正確にはわからないのだ。

もし、使用しているエリアを使ってしまえばデータが化けてしまうわけで、そのような仕組みを入れることは不可能なのである。

ウェアレベリング機能

コメントで教えてもらったウェアレベリングをググってみた。

ウィキペディア の
NAND型フラッシュメモリ
がわかりやすいと思う。

実際の例として、業界初のメモリ管理機能内蔵フラッシュメモリがヒットした。
東芝も LBA-NANDというウェアレベリングをサポートしたチップを出している。

たとえば、ある一定の書換回数に至ると、自動的に書換え回数の少ない領域とデータとアドレスを入れ替えるというもの(特許になっていていくつか方式がある)らしい。

なるほど、入れ替えるならば、空きエリアなどファイルシステムが管理する情報に依存せず実現できる。

入れ替える単位は、たぶん ブロックサイズなのだろう。ブロックサイズが何KB かわからないが、4K ページ x 64 とすると、256 KB 。2GB なら、8000 個ぐらいある計算。8000 個を順番に使うのなら、20万回でエラーになるとしても、1MB を 4億回書かないと寿命に至らない。300 万回程度の書き込みでは何もおこらないだろう。

フラッシュメモリは何日で壊れる? ウェアレベリングの仕組みというページを見つけた。ここでは、SanDisk の CF の仕組みを解説しているのだが、OS が空きエリアを CF に通知しないとウェアレベリングに使うプール(Erase Pool)が増えない。非対応の OS だと 3% の代替ブロックが使えるに過ぎない。ウェアレベリングにもいろいろあるようだ。

空きエリアが多いほど... と考えている人は、ひょっとして SanDisk の CF の仕組みを想定しているのかも知れない。
普通に使う範囲ならば、空きエリアは関係なく、一度も使ったことのないエリアということになる。
パーティションきりなおして、小さくしておけば耐性があがるかも。

といっても、各社ウェアレベリングは特許にしているだろうから、方式はマチマチになると思う。一般化してしまうのは無理がありそう。日立の入れ替えるという方法がもっとも良いと思うが、日立の特許で他のメーカは使え(and/or わ)ないのかも。


あまり深く考えてなかったのだが、普通の不良ブロックマネージメント機能で、5% の代替エリアを持っていると仮定しても、2000万回書き換えられる計算。前のテストで、Write Error を起こしたことがある上海 2GB なら何らかのエラーになる可能性はあるが、300 万回ではなにも起きないかも。一応 300万回 x 2 の合計 600万回やってみてなにもなければ、テストをやめることにしよう。

やはり意地である。理想的なウェアレベリング機能でなければ、壊すことは可能そうだ。ただ 300万回では話にならなさそうだ。クリアしてしまったら、再検討してトライしてみることにする。

おまけ2
上海問屋オリジナル 1G/2G は、A-DATA my Super 1G/2G の OEM らしいことがわかった。

裏面に浮き出ているパターンみたいなのがそっくりだったので、デバイスのサイズを見てみたら、まったく同じだった。

1G 994816 KB
2G 1993728 KB

3種類調べていたつもりが、ほぼ2種類(一応 1G/2G の違いがある)だったとは、ちょっとショック。

おまけ3:手持ちの microSD の性能


write read size
A-DATA 1G 4.67 15.29 994816 (3886 x 256)
A-DATA 2G 7.96 15.29 1993728 (7788 x 256)
キングストン 2G 7.35 15.51 1966080 (7680 x 256)
Silicon Power 2G 3.91 9.21 1985024 (7754 x 256)

※ 上海問屋 1G は、A-DATA 1G と同じ性能 (2G は未測定 )

size の単位 KB
read/write の 単位 MB/sec ( 1024x1024 /sec )

テスト内容
write 100MB のファイルを write
- キャッシュを(ほぼ)書き出すまで
read 100MB のファイルを read
- いったん umount し DISK から読み出す
テスト環境 玄箱/HG Linux(自分改造版)
USB アダプタ SDMMC M121 (14cd/6700)
ファイルシステム FAT16
- クラスタサイズ 1G -> 16K / 2G -> 32K
microSDの性能についてに続く

追記

1MB では、秒間 3 回ぐらいしか書けない。これではラチがあかないので、もう少しなんとかしたい。

秒間 3回でも 1MB なので、3MB/sec で Write + Read していたことになる。転送性能から見てこれぐらいが精一杯。

一応 4K ページ・256K ブロックの Flash だと仮定しよう。
おなじ 1MB の領域を使うとしても、256 K バイトおきに、先頭の 数キロバイトのみ書き込みしていっても同じ効果になりそうだ。

中断して、新プログラムに変更することにする。


    1MB の write 最終状況
  • 上海 2GB 210万回 エラーなしで中断
  • キングストン 2GB 156 万回 エラーなしで中断
  • A-DATA 1GB 146 万回 エラーなしで中断



  • プログラム、flashtest4.c
    - n バイト間隔で m バイトの書き込みとチェックができるよう変更
    - チェックの方法を書き込む前に、前のデータが期待するものかどうかをチェックするように変更。



    現在の状況 (1MB に対し 256KB 毎に 32KB の write 4回分)
  • 上海 2GB (= A-DATA 2G)
     1万回に 4分 40 秒
     1万回に 16分 20 秒  (42万回時)
     593 万回から 最初の USB アダプタに変更。 (1万回に 23分)
     754 万回 時に、データ化け(例によって USB アダプタの問題)
     →そのまま中断
  • キングストン 2GB
     1万回に 36分
     1万回に 51分 (5 万回時)
     329 万回(中断)
  • A-DATA 1GB
     1万回に 5分 40秒
     1万回に 16分 20 秒 (41万回時)
     1000 万回 ノーエラー終了


これだと、上海/A-DATA は、一日で 250 万回ぐらいになりそうだ。とりあえず 1000万回を上限にテストをスタート。

まだはじめたばかりに近いのに、どんどん遅くなっている。ひょっとして、エラーが頻発していたりするのだろうか?

ようやく 1/2 の 500万回まできた。性能は安定しているようだ。
しかし、なにも起こらない。最後まで行ってしまう予感。


キングストンは遅い。こういう書き方をされるのは苦手なようだ。

追記

ここに来て、上海/A-DATA (1G/2G, Super) は、SLC であるということを知った。そして、キングストン 2G (日本製)も。

SLC は MLC と比べて書き込み耐性が 1桁違うらしい。なかなか壊れないのもそれが理由かも知れない。

ちなみに 8GB は確実に MLC 。4GB もたぶん MLC 。SLC だけを調べてなにかわかったとしても 4G/8G の特性まで一般化できない。

4GB のテストは、4GB が1500 円を切るようなことがあればやってみることにして、今は 2GB 。SanDisk 2GB bulk は、A-DATA とも キングストンとも特性が違うようなので、(このテストが終わったら)試してみようと思う。

それはともかく、あまりになにも起きないので、上海 2G に対して、最初に使った USB アダプタに切り替えてみようと思う。

USB アダプタ SDMMC M121 (14cd/6700) について

少しばかりコレについて説明しておこうと思う。

14cd/6700 は、USB のベンダID/プロダクトID。SDMMC M121というのは、USBからみえるベンダ名。相当変であるが、USB アダプタのチップがそう言ってくるわけで、とりあえずこれを名前にしている。
ちなみに、このベンダには、14cd/6600 というのがあって、それは、ベンダ名: Super Top プロダクト名:USB 2.0 IDE DEVICE を返すらしい。しかし、Super Top というベンダの Home Page は見つけられていない。


実際の製品としては、FUJITEK microSD超小型カードリーダー。それ以外の FUJITEK アダプタにもこのチップが使われている。また、GREEN HOUSE GH-CRMR1-S*Aシリーズも同じもの。なんと 0.82g の軽さ -- microSD を装着しても 1.22g 。

このアダプタ、これだけのテストでエラーを出していないし、小型なので気に入っている。ただいくつか不満な点もある。

ひとつは、最大性能があまり高くない(らしい)こと。Photo Fast とか 150x (22.5MB/sec)らしいが、read で16MB/sec ぐらいまでしか出ていない。たぶん 最大クロックが十分ではないのだろう。実用上はぜんぜん問題ないが、性能テストするには不十分なのだ。

もうひとつは SDのイレーズ機能がないらしいこと。パナソニックの SDformatter には、イレーズするという機能がある。しかし、この USB アダプタだと "デバイスにイレーズ機能がありません" と言われてしまう。ひょっとして、A-DATA などイレーズすることで、ウェアレベリング機能に対して空きエリアをリセットできるのではないかという気がしていて、イレーズをやってみたいのだが、それが出来ない。まぁイレーズ機能があるアダプタなど パナソニック純正以外にあるのかどうかも判らないのだが、少々残念。

電子工作ネタ
一般のUSB アダプタでは完全に初期化できないなら、イレーズコマンドを発行して SDカードを初期化し、フォーマットする。そういう装置を作るのもいいかも知れない。



A-DATA 1G 1000万回達成

なにもおこらず 1000万回達成してしまった。キングストンは遅く その時点で、329万回まで。A-DATA 2G はエラーが出るアダプタで、やはりというか754 万回にエラーが出た。

ちなみに、1MB 相当ということにしたので、4ヵ所書いて 1回 にしている。トータルでは 4000万回書いたのだが、なにも起きなかった。

これで終わりにしたいところだが、テストしたカードは実用目的には使えないし、マシンも遊んでいるので当面続けようと思う。

実は HUB を買ってきた。テストを 1台に集約して、ずっとテストし続けられるように。カードも SanDisk 2G を追加。テスト方法も少々変更する予定。1MB (4ヵ所) から 10MB (40ヶ所)に広げてみる。

地味な話題なので、経過報告は、ここに追記していく。


    10MB に対し 256KB 毎に 32KB の write
    (前回と違い 1 write を 1回と数える)

    現在の状況
  • 上海 2GB (= A-DATA 2G)
     4万回に 15分 ( 192万回時 )
     8000 万回(断念)

  • キングストン 2GB
     4万回に 36分 ( 72万回時 )
     180 万回 で リードエラー (ついに限界)
     その後、書き込みはできるが、すぐ読めなくなることを確認。
     ファイルを変更してテストをしてみることに。
    → 166 万回で リードエラー
    (終了) 
  • A-DATA 1GB
     4万回に 56分 ( 44万回時 )
     204 万回 で リードデータ不一致 (電源不安定が原因)
     2820 万回(実行中)
     
  • SanDisk 2GB bulk
     4万回に 50分 ( 52万回時 )
     72 万回 で リードデータ不一致 (電源不安定が原因)
    168万回で ライトエラー (〃)
    208万回で ライトエラー (〃)
     3312 万回(実行中)



  • キングストンが若干速くなり、A-DATA 1G がすごく遅くなっている。上海 2G (A-DATA 2G) は変わらず。4ヵ所→40ヶ所に変更したのが関係しているのかも。
  • ちなみに、前記事コメントに従い、空き領域を 0 にしている。(一応ほとんど1回は書いたという状態)
  • USB アダプタはすべて、SDMMC M121 (14cd/6700)


SanDisk 2G が 72万回でデータエラー!

なんと 72万回で 書き込んだはずのデータと一致しないというエラー!

で、ファイルを読み込んでチェックしてみたが、正しい。こういうのは想定外だ。何度かおきるだろうから、再実行して様子見。

キングストン 2G が 180 万回で リードエラー!

お、あらためてファイルを読み出してみると、やはりリードエラー。

dmesg では複数のセクターでエラーが記録されている。

セクタ# (256KB 単位)
2131672 4163 -- テストでのエラー
2120888 4142 -- ↓ ファイル読み出しでのエラー
2120896 4142
2120896 4142
2121400 4143
2121408 4143



microSD (というか NAND Flash)は、一般に ECC を持っている。→ ググる
だから、書き込んだデータが化けてしまったとき正しいデータでなかったらエラーになる。
このテストでエラーになったということは、書き込んだ直後はエラーでなかったものが、2 秒後には化けてしまったということ。
そして、複数の場所で リードエラーがおきたということは、テストで気が付かなかっただけで、ほかのところも疲労しているということ。

ちょっと気になったので、テスト中のほかの microSD も確認してみたが、リードエラーが起きたのは、これだけだった。

ALL 0 のデータを書き込んでみたら書けたので、再度テストしてみたが、途中で止めて ファイルを読み出してみるとやはりリードエラー。代替もできない状態で 劣化したブロックを使っているようだ。

では、疲労していないはずのほかのファイルに対してテストするとどうなるのか? 代替ブロックはもうないはずで、メモリ自体の耐久性がわかるはず。

ところで、書き込み直後は OK でも 2秒後には read error になるケースが出てきた。このテストでは、ほかにもそういうところが出てきている末期的状況になるまで気が付かない。それでは困るので少々工夫しようと思う。

4万回毎に どこまで進んだか表示するようにしているが、このときに デフォルト 1分間の sleep を入れる。こうすることで、その間データを保持できないところがあれば発覚するようにした。

プログラム→ flashtest5.c

本来は、もっと長期間持たなければダメとしたいところだが、それではテストにならない。かなり劣化が進まないと確認できないことに注意。

SanDisk 2G が 通算168万回で ライトエラー!

dmesg で見てみるとジャーナルの I/O でエラーになっている。

それにしても、なんかこれだけ変なエラーがおきている。データ化けもそうだが、ライトエラーなんてものが起きるのはおかしい。ひょっとして、接触不良とかではないか。

一回取り外して、抜き差しして テストを再開してみることに。

通算208万回でもライトエラー。dmesg のエラーを冷静に見ると...USB レベルのエラーが先に起きている。

原因として、HUB のこのポートだけおかしいとか、USB アダプタがおかしいとか、あるいは microSD がレスポンスを返さないから USB アダプタの動作が変になったとか。まぁいろいろ考えられる。

とりあえず、USB アダプタを変えてみる。安物だから 不良品だったのかも知れない。

A-DATA 1G が 204万回でデータエラー!

SanDisk 2G で最初に起きたデータ不一致と同じ現象。これはもう Hub か、Hub を使ったことでタイミングが変わったのが原因だろう。いずれにせよ USB レベルの問題で microSD は関係なさそう。

とりあえず再開

実は、使用している Hub は AC アダプタがつけられるタイプで、AC アダプタ(5V 2A)で電源を供給したら、この現象は収まったようだ。
よくよく考えたら、ホストマシンは 玄箱/HGで ACアダプタタイプに改造したもの。5V の供給は DISK も含め 全部で 2A 。たぶん 5V の供給が不足して不安定になったのだろう。


それにしても、Hub をつけて 4 つ同時実行にしたらいろいろ起こりすぎる。データ不一致が起きても、1回ぐらいは再読み込みして続行しないと 放置して結果だけ見るようなことができない。

再度、少しばかりプログラムを変更することにしよう。
プログラム→ flashtest6.c

キングストン 2G が 166 万回で リードエラー!

ファイル名を変更してから 166 万回の write -- 1/40 すると、 4.2 万回。

最初の リードエラーのように あとで読み出すと複数(今回は 2ヶ所)のリードエラーが起きた。

キングストン系については、代替ブロックを使い尽くしてしまえば、書き込めても、読めないところが増えだす。
そして、読めるか読めないかは時間が立たないとわからない。

ただし、かなりの量の書き込みをしないと、代替ブロックを使い尽くすところまでは行かない。

記録を集めれば、通算何回 write したかは分かるのだが、テスト方法を何度も変更しているので、基準になるような数字にはならない。

新しいので、やってみても良いとは思っている。が、またテスト方法を再検討するようなことになると無駄になるので、他のカードがどうなるか見てから決める予定。


書き込んだ直後では本当にデータが保持できるのかどうか分からないような特性だと、どういう基準で、代替ブロックに変えるのか気になってくる。書き込み上限回数を設定しているのなら問題なさそうだが、書き込みでエラー検出のみだと、メディア全体が寿命に至らなくてもリードエラーが出てくる可能性があることになる。

読めなくなるのが、ファイルのデータなら1つのファイルが途中までしか読めないようなことになるのだが、ディレクトリエントリならそのディレクトリが全滅するかも知れない。ただし CHKDSK とかで復旧できそう。FAT なら ミラーがあるので大丈夫 --- 昔はそうだったと思うのだが、今は違うはず。アクセスしていないのに読めないファイルが出てくるんじゃないかと思う。そして、SUPERBLOCK (= BPB) なら全滅。

さて、このタイミングで他の カードが読めなかったりしないかチェックしてみた。が、大丈夫のようだ。

なかなか 上海(A-DATA) 2G は壊れない。連続書き込みという使い方では丈夫なようだ。性能も良い。ただし、製品の一つの面しか評価していないことに注意が必要。たとえば書き込んでいる最中、あるいは書き込み終わったすぐあとにカードを抜いたりするのに弱いとか弱点があるかも知れない。

A-DATA 2G が 8000万回達成!

8000 万回までやってみたが無問題。完成度が高い ウェアレベリングが実装されているのだろう。



さらにテスト中

A-DATA 2G はやめてしまったが、A-DATA 1G と SanDisk 2G は実はまだテストをやっている。

でそれぞれ既に 1億回突破。壊れるような気がしないが、まぁやれるだけやってみる。


  • A-DATA 1GB
     4万回に 56分 ( 44万回時 )
     204 万回 で リードデータ不一致 (電源不安定が原因)
     1億2176 万回(実行中)
     
  • SanDisk 2GB bulk
     4万回に 50分 ( 52万回時 )
     72 万回 で リードデータ不一致 (電源不安定が原因)
    168万回で ライトエラー (〃)
    208万回で ライトエラー (〃)
     1億7396 万回(実行中)
posted by すz at 02:12| Comment(2) | TrackBack(0) | microSD関係
この記事へのコメント
すでにご存じかと思いますが、最近下記記事を読んで興味深かったです。

MemCon Tokyo 2007レポート【フラッシュメモリ編】
http://pc.watch.impress.co.jp/docs/2007/1119/mct.htm


すzさんの記事を読んで、個人的に思ったこと。
・ECCはエラー検出だけでなくエラー訂正+検出です。1bitECCだと不良率が高いと訂正できなくなります。
上記記事によると4bitECCはビットエラーが少々出ても復元できてますね(効果100倍〜1千万倍以上)。
・書き込み時間はブロック内の一部に書き込むより全部に書き込むほうが不良検出力はあがるので、一部だけ書き込むのはあまり良策ではないと思う。
・書き込みデータはゼロの時、電子を注入している(ダメージがある)ので、ゼロ書き込みが良い。
Posted by camino at 2008年08月02日 17:39
興味深く拝見させていただきました。
私は、EeePCのSDスロットに16GBSDHCを入れ、このSDにubuntuをインストールしています。この状態で、カーネルを何度かコンパイル(makeしたり、make cleanしたり)したり、カーネルソースを入れたり消したりしていると、A-dataのSDは数回でコンパイル中にエラーになります。調べてみると、ソースファイル中のある一文字が化けていたりします。いじっていないソースが
コンパイルをするたびに場所を変えてエラーになるので、SDの劣化試験には最適でないかと最近思っています。比較してみると面白そうです。
Posted by とおりすがり at 2009年03月11日 13:59
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/30760450
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック