Linuxを使用したSDカードのストレステスト


19

きちんとした(GB +)サイズのSDカードでのfsメタデータのロギングと維持は、カードを装着するほど重要ではないということについて、昨日ここでの答えの論理および/または信regarding性について誰かと少し議論しました妥当な期間(年および年)でアウト。反論の要点は、SDカードを身に着けている人々のオンラインの物語が非常に多いため、私は間違っているに違いないということのように思えました。

私は24時間年中無休のrwルートファイルシステムを含むSDカードを備えたデバイスを持っているので、私は自分の満足する前に前提をテストしました。このテストを少し調整し、実際に同じカードを使用して繰り返し、ここで紹介します。私が持っている2つの中心的な質問は次のとおりです。

  1. 私はそれを再書き込み連続の効果を再現することを意図しています念頭に置いて、実行可能なカードを破壊しようとするために使用される方法で、小さなデータの量は?
  2. カードを確認するために使用した方法はまだ実行可能ですか?

最初の部分への異議はおそらく私のテストが実際にカードに書き込みをしなかったと断言する必要があるため、SOまたはスーパーユーザーではなくここに質問を入れていますLinuxの特別な知識。

[SDカードが何らかのスマートバッファリングまたはキャッシュを使用し、同じ場所への繰り返し書き込みが摩耗しにくい場所でバッファリング/キャッシュされることも考えられます。私はどこにもこれの兆候を見つけていませんが、SUでそれについて尋ねています]

テストの背後にある考え方は、カード上の同じ小さなブロックに何百万回も書き込むことです。これは、そのようなデバイスが何回の書き込みサイクルを維持できるかという主張をはるかに超えていますが、ウェアレベリングが有効であると仮定すると、カードがまともなサイズであれば、「同じブロック」がそうであるように、何百万ものそのような書き込みはまだ重要ではありません文字通り同じ物理ブロックではありません。これを行うには、すべての書き込みがハードウェアと同じ見かけの場所に本当にフラッシュされるようにする必要がありました。

ハードウェアにフラッシュするために、私はPOSIXライブラリ呼び出しに依存しましたfdatasync()

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>

// Compile std=gnu99

#define BLOCK 1 << 16

int main (void) {
    int in = open ("/dev/urandom", O_RDONLY);
    if (in < 0) {
        fprintf(stderr,"open in %s", strerror(errno));
        exit(0);
    }

    int out = open("/dev/sdb1", O_WRONLY);
    if (out < 0) {
        fprintf(stderr,"open out %s", strerror(errno));
        exit(0);
    }

    fprintf(stderr,"BEGIN\n");

    char buffer[BLOCK];
    unsigned int count = 0;
    int thousands = 0;
    for (unsigned int i = 1; i !=0; i++) {
        ssize_t r = read(in, buffer, BLOCK);
        ssize_t w = write(out, buffer, BLOCK);
        if (r != w) {
            fprintf(stderr, "r %d w %d\n", r, w);
            if (errno) {
                fprintf(stderr,"%s\n", strerror(errno));
                break;
            }
        }
        if (fdatasync(out) != 0) {
            fprintf(stderr,"Sync failed: %s\n", strerror(errno));
            break;
        }
        count++;
        if (!(count % 1000)) {
            thousands++;
            fprintf(stderr,"%d000...\n", thousands);
        }
        lseek(out, 0, SEEK_SET);
    }
    fprintf(stderr,"TOTAL %lu\n", count);
    close(in);
    close(out);

    return 0;
}                                 

パーティションの先頭に200万回以上の書き込みを蓄積するまで、これを8時間ほど実行しました/dev/sdb11 簡単に使用できました/dev/sdb(パーティションではなくrawデバイス)が、これによってどのような違いが生じるかわかりません。

次に、ファイルシステムを作成してマウントしようとしてカードをチェックしました/dev/sdb1。これは機能し、私が一晩中書いていた特定のブロックが実行可能であったことを示しています。ただし、カードの一部の領域が摩耗レベリングによって摩耗および変位していなかったが、アクセス可能なままであったことを意味するものではありません。

それをテストするためbadblocks -v -wに、パーティションで使用しました。これは破壊的な読み書きテストですが、ウェアレベリングの有無にかかわらず、ローリング書き込みごとにスペースを提供する必要があるため、カードの実行可能性を強く示す必要があります。言い換えれば、それは文字通りカードを完全に埋めてから、すべてが大丈夫であることを確認することと同じです。数回、badblocksにいくつかのパターンを機能させたので。

[以下のContra Jason Cのコメント、このようにbadblocksを使用することに関して、何も悪いことも間違っていることもありません。SDカードの性質上、実際に不良ブロックを識別するのには役立ちませんが、修正されたテストが行​​われた-band -cスイッチを使用して、任意のサイズの破壊的な読み取り/書き込みテストを行うことは問題ありません(私自身の答えを参照してください) )。カードのコントローラーによる魔法やキャッシュの量は、数メガバイトのデータをハードウェアに書き込み、再び正しく読み戻すことができるテストを欺くことはできません。ジェイソンの他のコメントは誤読に基づいているように見えます-IMOは意図的なものです。だから、私は議論する気になりませんでした。その頭を上げて、何が理にかなっていて、何がそうでないかを決めるのは読者に任せます。]

1このカードは、私がかろうじて使用した古い4 GB Sandiskカード(「クラス」番号がない)です。繰り返しますが、これは文字通り同じ物理的な場所への200万回の書き込みではないことに注意してください。ウェアレベリングにより、テスト中にコントローラーによって「最初のブロック」が絶えず移動され、用語が示すように、ウェアを平準化します。


これは、以下に概説する理由により信頼性の低いテストです。またbadblocks、フラッシュドライブでページエラーを表示するために使用することはできません(それが非常に誤解を招くと主張します)。これらはコントローラーによって処理され、検出されたときにスペースを予約するためにマッピングされます。ドライブ上のデータの物理レイアウトは、I / Oを実行するときに表示される物理レイアウトと同じではありません。これが、ウェアレベリングが透明性を維持する方法です。どれもこれのは、I / Oの間にあなたに表示されません。ドライブがSMARTをサポートしている場合、せいぜい、コントローラーから障害と残りの予約済みスペースに関する小さな情報を取得できます。
ジェイソンC

用として/dev/sdb1/dev/sdbそれはあなたのプログラムの違いはありませんが、何(後述のように)違いを作るあなたのデバイス上の未使用ブロックの状態がテスト中のため不明と行方不明で、ということですあなたは、デバイス全体を埋めない限り(たとえば、/dev/sdb)データを最初に使用する場合、使用する必要があるスペースウェアレベリングの量は大きな変数です。そのため、デバイスとパーティションはテストには関係ありませんが、これは主に欠陥のあるテストの結果です。デバイスにデータを適切に入力した後、パーティションごとは利用可能なオプションではありません(フォーマットしない限り)。
ジェイソンC

テストを非現実的にするもう1つのポイントは、ページが失敗する可能性があり(非常に一般的には失敗します)、その後もSDカードを100%使用可能なままにすることです。障害が検出され、コントローラーによってマスクされているが、データを読み取ることができない場合、コントローラーがブロックをコピーしようとすると、ファイルシステムのデータが破損する可能性があります。
ジェイソンC

私に記述する-私が何を言う特定の条件で再現可能なテストからSDカードを着用し、その後、私は真剣にあなたを取りますよ。再現不可能な「権威からの主張」と個人的な逸話はまさにそれです。
論争

1
私はその特定のカードについては知りませんが、それらのほとんどは少なくともとにかくもう少し死んでいます。これらの人々は、少なくとも1つのブランドのSDカードでマイクロコントローラーをハッキングしました:bunniestudios.com/blog/?p = 3554
mikeserv 14年

回答:


11

SDカードのストレステストは、一般的に次の2つのことを考えると問題があると思います。

  1. ウェアレベリング次の書き込みが実際にSD上の同じ物理的位置を実行しているという保証はありません。配置されているSDシステムのほとんどは、ブロックを把握しており、各場所が受ける「摩耗」に基づいて、それをバックアップする物理的な場所を移動していることに注意してください。

  2. さまざまなテクノロジー(MLCとSLC)これに関して私が見る他の問題は、テクノロジーの違いです。SLCの種類のSSD私は、MLCの種類よりもはるかに長い寿命を期待しています。また、MLCにははるかに厳しい許容範囲があり、SLCで対処する必要はありません。または、少なくとも、この方法で失敗することを許容します。

    • MLC-マルチレベルセル
    • SLC-シングルレベルセル

MLCの問題は、特定のセルに複数の値を格納できることです。ビットは、たとえば物理的な+ 5Vまたは0Vではなく、電圧を使用して基本的にスタックされるため、SLCよりもはるかに高い故障率の可能性があります。同等。

平均余命

このリンクを見つけて、ハードウェアの持続時間について少し説明しています。タイトルは「SSDを知る-SLC vs. MLC」です。

SLC

SLC ssdsは、ほとんどの場合、平均で49年から149年のどこにでも住むように、最良の推定値で計算できます。Memorightテストでは、1日あたり平均100Gbの書き込みで、200年を超える書き込み耐久寿命を持つ128Gb SSDを検証できます。

MLC

これは、mlc設計が不十分な場所です。まだリリースされていません。mlcでどのような平均余命が保証されているかを実際に調べた人はいませんが、それはかなり低くなります。私は、SLC設計を支持して、平均して10から1の寿命になるいくつかの異なる信念を受け取りました。控えめな推測では、各メーカーのコントローラー内の「ウェアレベリングアルゴリズム」の進歩に応じて、ほとんどの寿命の推定値は7〜10年になります。

比較

書き込みサイクルで比較するために、slcのライフタイムは完全な書き込みサイクルが100,000回で、mlcのライフサイクルは書き込みサイクルが10,000回です。これは、使用する「ウェアレベリング」の設計に応じて大幅に増加する可能性があります。


1
WRTウェアレベリング「次の書き込みが実際にSD上の同じ物理的位置を実行しているという保証はありません」 -これは質問slmで想定されています!非常に明確に、私は考えています...ウェアレベリングなしでは、指定された書き込みサイクルの最大寿命をはるかに超えているため、このテストに合格することは決してありません。このテストは、ウェアレベリングの有効性を証明するためのものであり、それを無視するものではありません。同じ見かけの場所に200万回書き込むことができるという事実は、ウェアレベリングが有効であることを示しています。
goldilocks

WRT#2、品質と技術はもちろん、あるカードを別のカードと区別します。私のポイントは、1日あたりに書き込まれるデータの量が比較的少ない場合、誰もが実際に必要とするよりもはるかに長持ちする安価なSandiskカードがまだ長持ちするということです。
goldilocks

@goldilocks-OK、OK、それについて私をbeatるな。8-)だから、あなたが言っているのは、方程式からウェアレベリングを効果的に排除し、それにバッドブロックを実行するように十分な量のデータを書き込むと、ウェアレベリングの有効性を示すのに十分ですか?
slm

1
@goldilocks-パンドラの箱を開けただけですか?
slm

1
(例:SDカードにイメージを書き込むことでクローンを作成し、fstrimその後コピーできない/できない場合、動的ウェアレベリングを完全に無効にしました[静的ウェアレベリングを備えた消費者グレードのSDカードを見つけるのは難しいでしょう]すべてのページを使用済みとしてマークします。)
ジェイソンC

6

テストには多くの問題があり、いくつかはあいまいですが、いくつかはそうではありません。また、あなたの目標にもよります。2つの微妙な、あいまいな問題は次のとおりです。

  • 書き込み先と同じ領域から読み取りを行っていないので、読み取りテストは効果的に行われません(コントローラーが読み取り妨害補正を行っていない限り、読み取り中のページを別の場所に移動することがありますが、これでも実行されます)テストに影響しません)。
  • 不良ブロックへの読み取り/書き込みがコントローラーによって検出および報告されたと仮定します(保証はされませんが、保証されるわけではありません)-データを書き込み、それを読み返し、保証されたチェックのために比較したいでしょう。

ただし、それらは間違いなく教訓的です。より深刻なのは:

  • badblocksフラッシュメモリ上の失敗したページを表示するために使用することはできません。すべての障害検出および後続のページマッピングはコントローラーによって行われ、OSに対して透過的です。ドライブがサポートしている場合は、SMARTから情報を取得できます(サポートしているSDカードはありません。サポートしているハイエンドのサムドライブがあるかもしれません)。
  • ウェアレベリングは、以前のTRIMコマンド、テスト中のドライブの空き/使用状態、および予約済みスペースを考慮しないテストで複雑になります。

ウェアレベリング:主な問題は、ウェアレベリングがテストの主要な変数であることです。これはコントローラーで(通常)発生し、いずれにしても、直接的なデバイスシーク+読み取り/書き込みに対しても透過的です。あなたの例では、あなたは実際にウェアレベリング状態を知りません(特に、最近ブロックを解放するためにTRIMコマンドが発行されましたか?)...

デバイスの動的ウェアレベリング(実質的にすべてのコンシューマグレードストレージデバイスに存在する)の場合、どの状態でもかまいません:極端な場合、ページはどれも空きとしてマークされていないため、コントローラーが動作する必要があるページのみwithは予約されたスペースにあるものです(ある場合)。あればということ注意され、デバイス上の予約領域が、それはなりますが、保証取得を開始する前に完全に失敗しなければならないが(自由が残りとしてマークされ、他のページが存在しない仮定)ページへの書き込みに失敗しました。他の極端な場合、すべてのページが空きとしてマークされます。この場合、理論的には、書き込みエラーが表示される前に、デバイス上のすべてのページが失敗する必要があります。

静的ウェアレベリング(SSDにある傾向があり、SDカードにない傾向があり、サムドライブが異なる)の場合:デバイス上のすべてのページに繰り返し書き込みを行うことを除けば、実際には回避方法はありません。

...言い換えれば、特に動的なウェアレベリングが使用されているかどうか、静的なウェアレベリングが使用されているかどうか、そして、制御する方法を知らないウェアレベリングの詳細があります。ウェアレベリングのためにデバイスに予約されているスペースの量(コントローラー[または、M-Systemsの古いDiskOnChipなどの場合によってはドライバー]を通過して見えない)。

SLC / MLC: SLC対MLCに関しては、これは予想される限界に非常に直接的な影響を及ぼしますが、一般的なウェアレベリング手順とテスト手順はどちらも同じです。多くのベンダーは、デバイスが安価な消費者向け製品のSLCまたはMLCであるかどうかを公開していませんが、ページあたり100k +のサイクル制限を主張するフラッシュドライブはSLCである可能性があります(簡略化されたトレードオフはSLC =耐久性、MLC =密度)。

キャッシング:に関しては、少し不確かです。もちろん、OSレベルでは、一般的な場合、fsync / fdatasyncはデータが実際に書き込まれることを保証しません。ただし、リムーバブルドライブは一般的に次の一般的な使用パターン向けに設計されているため、この場合は(または少なくともコントローラーがそうすることをコミットした、つまり書き込みがキャッシュに飲み込まれない)と想定しても安全だと思います「取り出し」(アンマウント>同期)してから削除します(電源切断)。確かなことは分かりませんが、経験に基づいた推測では、特に書き込み->同期->読み戻しで同期が完全に行われることを同期が保証すると仮定しても安全であると言われています(そうでない場合、ドライブは信頼できません取り出し後)。イジェクト時に発行できる「sync」以外のコマンドはありません。

コントローラーでは何でも可能ですが、上記の仮定には、少なくともコントローラーが同期後のデータ損失のリスクに十分な「複雑な」ことを何もしていないという仮定も含まれます。コントローラーは、たとえば、同じデータが(限られた範囲で)書き換えられている場合、バッファーおよびグループ書き込み、またはデータ書き込みを行わないことが考えられます。以下のプログラムでは、2つの異なるデータブロックを交互に使用し、リードバックの前に同期を実行して、適切なコントローラーキャッシングメカニズムを無効にします。それでも、もちろん、保証はなく、知る方法もありませんが、これらのデバイスの通常の使用と健全な/共通のキャッシングメカニズムに基づいて合理的な仮定を立てることができます。

テスト:

残念ながら、デバイスに予約スペースがなく、静的なレベリングを行っていないことがわかっていない限り、特定のページのサイクル制限を明確にテストする方法はありません。ただし、取得できる最も近いものは次のとおりです(静的ウェアレベリングがないと仮定)。

最初にあなたがする必要がある事は、データとカード全体を埋めています。これは重要であり、元のテストで残された主な変数です。これは、予約されたスペース(アクセスする方法がない)を除いて、使用されるブロックを可能な限り多くマークします。単一のパーティションを操作してもデバイス上の特定の領域のみに影響するため、デバイス全体を操作していることに注意してください(これによりすべてのデータが破壊されます)。

dd if=/dev/urandom bs=512k of=/dev/sdb conv=fsync oflag=sync

あなたがプログレスバータイプの場合:

pv -pterb -s <device_size> /dev/urandom | dd bs=512k of=/dev/sdb conv=fsync oflag=sync

編集:4MBの消去ブロックを持つカードの場合、書き込みを高速化するためにこれを試してください:

dd if=/dev/urandom bs=4M of=/dev/sdb conv=fsync oflag=direct,sync iflag=fullblock

次に、次のようにサイクルテストプログラムを記述し、O_DIRECTand O_SYNC(および場合によっては偏執的な冗長な使用fsync())を使用して、できるだけ多くのOSバッファリングとキャッシュを画像から切り取り、理論的にはコントローラーに直接書き込みます操作が終了したことを報告するまで待ちます。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;

static const int BLOCK_SIZE = 512;
static const int ALIGNMENT = 512;
static const int OFFSET = 1024 * ALIGNMENT; // 1024 is arbitrary


int main (int argc, char **argv) {

    if (argc != 2) {
        fprintf(stderr, "usage: %s device\n", argv[0]);
        return 1;
    }

    int d = open(argv[1], O_RDWR | O_DIRECT | O_SYNC);
    if (d == -1) {
        perror(argv[1]);
        return 1;
    }

    char *block[2], *buffer;
    int index = 0, count = -1;

    // buffers must be aligned for O_DIRECT.
    posix_memalign((void **)&(block[0]), ALIGNMENT, BLOCK_SIZE);
    posix_memalign((void **)&(block[1]), ALIGNMENT, BLOCK_SIZE);
    posix_memalign((void **)&buffer, ALIGNMENT, BLOCK_SIZE);

    // different contents in each buffer
    memset(block[0], 0x55, BLOCK_SIZE);
    memset(block[1], 0xAA, BLOCK_SIZE);

    while (true) {

        // alternate buffers
        index = 1 - index;

        if (!((++ count) % 100)) {
            printf("%i\n", count);
            fflush(stdout);
        }

        // write -> sync -> read back -> compare
        if (lseek(d, OFFSET, SEEK_SET) == (off_t)-1)
            perror("lseek(w)");
        else if (write(d, block[index], BLOCK_SIZE) != BLOCK_SIZE)
            perror("write");
        else if (fsync(d))
            perror("fsync");
        else if (lseek(d, OFFSET, SEEK_SET) == (off_t)-1)
            perror("lseek(r)");
        else if (read(d, buffer, BLOCK_SIZE) != BLOCK_SIZE)
            perror("read");
        else if (memcmp(block[index], buffer, BLOCK_SIZE))
            fprintf(stderr, "memcmp: test failed\n");
        else
            continue;

        printf("failed after %i successful cycles.\n", count);
        break;

    }

}

の場合O_DIRECT、バッファは適切に配置する必要があります。通常、512バイトの境界で十分です。以下を使用してコンパイルできます。

g++ -O0 test.cpp -o test

追加する -D_POSIX_C_SOURCE=200112L必要に応じてます。

次に、上記のようにデバイスを完全に満たした後、そのまま一晩実行します。

./test /dev/sdb

512バイトの整列書き込みは問題ありません。1ページ全体を消去して書き換えます。より大きなブロックサイズを使用すると、テストを大幅に高速化できますが、具体的な結果を得るのは複雑になります。

現在、昨日歩道で見つけた、かなり見栄えの良い4GB PNYサムドライブでテストしています(http://www3.pny.com/4GB-Micro-Sleek-Attach-- -Purple-P2990C418.aspx)。

上記のプログラムは本質的に制限されたバージョンでbadblocksあり、すべての予約スペースが使い果たされるまで障害は表示されません。したがって、(反復ごとに1ページが書き込まれる)期待は、上記の手順がreserved_pa​​ge_count * write_cycle_limitの反復で平均して失敗することです(繰り返しますが、ウェアレベリングは主要な変数です)。それはあまりにも悪いサムドライブであり、SDカードは通常SMARTをサポートしていません。SMARTは予約されたスペースサイズを報告する機能を持っています。

ちなみに、このテストの目的では、fsyncvs fdatasyncは実行中のブロックデバイスの書き込みには影響しません。あなたopen()のモードが重要です。

技術的な詳細に興味がある場合; ここに、SDカードの内部動作について(さらに)知りたいすべてのものがあります:https : //www.sdcard.org/downloads/pls/simplified_specs/part1_410.pdf

編集:バイト対ページ:これらのタイプのテストのコンテキストでは、バイトではなくページの観点から物事を考えることが重要です。逆のことをすることは非常に誤解を招く可能性があります。たとえば、SanDisk 8GB SDでは、コントローラーに応じたページサイズ(経由でアクセス可能/sys/classes/mmc_host/mmc?/mmc?:????/preferred_erase_size)は完全な4MBです。16MBの書き込み(4MBの境界に合わせて)してから、4ページを消去/書き込みします。ただし、それぞれ4MBオフセットで4つの単一バイトを書き込むと、4ページも消去/書き込まれます。

「4バイトの書き込みでテストした」と同じ摩耗量であるため、「16MBの書き込みでテストした」と言うのは不正確です。より正確には、「4ページの書き込みでテストしました」。


バイトとページに関するコメントを追加しました。
ジェイソンC

PNYは不滅です。ただし、まったく新しいSanDisk 8GB MicroSDで〜8.1milの反復(約8時間以上)の後、電源を入れ直すと、最大書き込み速度(元は4MB /秒)が永続的に〜410kB /秒に低下し、dd250MBの書き込み後に失敗します。損傷は、電源の再投入後まで現れませんでした。PNYサムドライブは、〜30milの反復後も影響を受けません。上記のプログラムを修正しましたが(上記のコードには反映されていません)、毎回同じではなくランダムな16kBの位置に書き込むようにしましたが、SDで約4mil繰り返した後にそれを行いました。新しいカードで再テストします。
ジェイソンC

ddそのカードでの3回目の試行は、250MBのマークを超え、そのポイント以降の領域への書き込みパフォーマンスが完全に4MB /秒に再び増加しました。ただし、ブロックのシャッフルが継続されるため、パフォーマンスは予測できないと予想されます。私はカードが破壊されたとは言いませんが、確かに100%ではありません。
ジェイソンC

5

ただ、SLMの答えにいくつかのポイントを追加- SSDは再生するので、これらは、「ダム」のSDカードよりもSSDのための場所でより多くであることに注意してください多くのデータで汚れたトリックを(例えば、重複排除):

  • デバイスの先頭に64KBを書き込みます-これ自体には2つの問題があります:

    1. フラッシュセルには通常、16KB以上のサイズの消去ブロックがあります(ただし、128〜512KBの範囲である可能性が高い)。つまり、少なくともこのサイズのキャッシュが必要です。したがって、64KBを書き込むだけでは十分ではないようです。

    2. ローエンド(「非エンタープライズ」と呼ばれる)ソリューション(およびSSDよりもSD / CFカードの方がさらに期待される)の場合、メーカーはデバイスの最初の部分を他の部分よりも弾力性のあるものにすることを選択できます。重要な構造-パーティションテーブルとデバイス上の単一パーティションのFAT(ほとんどのメモリカードはこのセットアップを使用しています)はそこにあります。したがって、カードの先頭のテストには偏りが生じる可能性があります。

  • fdatasync() データが物理メディアに書き込まれることを実際に保証するものではありません(ただし、OSの制御下にあるものがおそらく最善の結果を出しますが)-manページを参照してください。

    デバイスが転送の完了を報告するまで、呼び出しはブロックされます

    外部電源が失われた場合に、キャッシュされたデータをフラッシュメモリに書き込むためのエネルギーを提供できる小さなコンデンサがあることが判明しても、あまり驚くことではありません。

    いずれにせよ、キャッシュがカードに存在するという仮定のもとで(SUに関する質問への私の答えを参照)、64KBの書き込みと(with fdatasync())の同期は、この目的に十分な説得力がないようです。「電源バックアップ」がない場合でも、ファームウェアはそれを安全でないまま再生し、予想よりも少し長くデータが書き込まれないようにします(通常の使用例では問題は発生しません)。

  • データが実際に機能することを確認するために、新しいブロックを書き込んで比較する前にデータを読み取ることをお勧めします(十分な妄想がある場合は、読み取りにクリアされたバッファーを使用します)。


+1キャッシュの可能性とこれにおける消去ブロックの重要性を強調するため。しかし...
ゴルディロックス

「カードの先頭をテストすることは偏っているかもしれません」ウェアレベリング(プレイ中でなければならない-この時点で書き込みサイクルの合理的な数を超えているため)を思い出してください-これは明らかに最初のブロックにすぎません。つまり、最初の物理ブロックではなく、最初の仮想ブロックです。
goldilocks

「fdatasync()は、実際にデータが物理メディアに書き込まれることを実際に保証しません」 IMO、転送が完了したことを報告するデバイスは、デバイスが読み書きテストにも合格した場合、書き込みが行われたに違いないことを示します(まだ失敗しました)。キャッシングはこれを複雑にする可能性がありますが、それを回避するためにかなり大きなチャンクを使用する場合、デバイスが成功を報告したときに「誤った書き込み」があることは不可能です。それができれば、それは役に立たないでしょう。
ゴルディロックス

1
@goldilocksいいえ、デバイスからデータを読み取ることは何も保証しません。データが物理メディア上にあることを期待するのは合理的であり、おそらくほとんどの場合はそうなりますが、保証されません-少なくともキャッシュサイズを超えない限り。
ペテルフ

1
@goldilocks peterphは、私が指摘したかったもう1つのことを示します。readあなたのテストでは、それが何の情報を追加していないし、書き込みサイクル試験に関連しない、不要です。真のテストでは、コントローラーがすべての障害モードを検出して報告できることが確実でない限り、作成したブロックを読み取って検証する必要があります。
ジェイソンC

2

Peterphの答えは、可能性のあるキャッシュの問題をさらに検討させてくれました。掘り下げた後、私はまだ、いくつか、またはすべてのSDカードがこれを行うかどうかを確実に言うことはできませんが、それは可能だと思います。

ただし、キャッシュに消去ブロックより大きいデータが含まれるとは思わない。確かに、64 kBではなく16 MBのチャンクを使用してテストを繰り返しました。これは、4 GBカードの合計ボリュームの1/250です。これを10,000回行うのに約8時間かかりました。ウェアレベリングが負荷を分散するために最善を尽くす場合、これはすべての物理ブロックが40回使用されたことを意味します。

大したことではありませんが、テストの元のポイントは、同じ(見かけの)場所に適度な量のデータを繰り返し書き込むことでカードを簡単に破損できないことを示すことで、ウェアレベリングの有効性実証することでした。IMOの以前の64 kBのテストはおそらく本物でしたが、16 MBのものはそうでなければなりません。システムはデータをハードウェアにフラッシュし、ハードウェアはエラーなしで書き込みを報告しました。これが詐欺である場合、このカードは何にも適しておらず、16 MBをプライマリストレージ以外の場所にキャッシュすることはできません。これがテストの目的です。

願わくは、16 MBの10,000回の書き込みで、ボトムエンドのブランドカード(値:5ドルのCDN)でさえ、毎日24時間365日、適度な量のデータを書き込むrwルートファイルシステムを実行してもカードがすり減らないことを実証するのに十分です妥当な期間。 10,000日は27年です...そして、カードはまだ大丈夫です...

それよりも重い仕事をしたシステムを開発するための報酬を得ていたら、少なくともいくつかのテストを行って、カードどれくらいの期間持続できるかを判断したいと思います。私の予感は、書き込み速度が遅いこのようなものでは、最大速度で数週間、数ヶ月、または数年の連続書き込みが必要になる可能性があることです(この種のオンラインの比較テストの多くは、それは非常に長期にわたることになるという事実)。

カードがまだ大丈夫であることを確認することに関しては、badblocksデフォルト設定での使用は適切ではないと思います。代わりに、私はこのようにしました:

badblocks -v -w -b 524288 -c 8

これは、8回繰り返される512 kBブロック(= 4 MB)を使用してテストすることを意味します。これは破壊的なrwテストであるため、連続ループで使用した場合のデバイスへのストレスに関しては、おそらく私の手がけたテストとして良いでしょう。

また、その上にファイルシステムを作成し、2 GBのファイルにコピーしdiff、元のファイルに対してファイルをコピーし、ファイルが.isoだったため、イメージとしてマウントし、その中のファイルシステムを参照しました。

カードはまだ大丈夫です。結局、これはおそらく予想されることです...

;);)


私はあなたの数学が正しいとは思わない。クラス2カードは2MB / sのスループットを維持しているため、約4か月で20TBを使用できます。確かに、あなたはクラス分けされていないカードを持っていると言いましたが、あなたは本当に桁外れに見えます(unix.stackexchange.com/questions/84902/…で指摘されているように)。そうでなければ、私はslmに完全に同意します。
ペテルフ

頻繁に取り外されるように設計されており、バス駆動型であるメディアの同期後、キャッシングの影響は、あるとしても最小限であると合理的に確信できると思います。これらのデバイスは、確実に「排除」されて削除されるように設計されており、同期は、可能な限りOSがデバイスに対して行うことができる絶対的な最後のことです。たとえば、USBドライブまたはSDカードは、同期後に物理的に書き込まれるか、少なくとも電源を切った後、非常に短い時間で書き込みを行うことを約束することを想定するのが妥当です。
ジェイソンC

また、ところで、badblocksフラッシュメモリ上の失敗したページは表示されません。このジョブには適切なツールではないため、フラッシュ上の失敗したページを見つけるために使用することはできません。コントローラーが障害を検出すると、ページを内部的に不良としてマークし、予約スペースのページに再マップします。これらはすべてコントローラーの背後で発生し、rawデバイスダンプでもまったく見えません。SMARTがサポートされている場合、コントローラーから情報を取得できます。デバイス上のデータの物理的な順序は、デバイスでIOを実行するときに表示されるバイトの順序と一致しません。
ジェイソンC

もう1つのコメント、FYIの詳細:SanDisk 8GB MicroSD、消費者向けグレードでは、割り当て単位(ページサイズ)はコントローラーによって報告される4MBです。つまり、そのカードの16MBは4ページです(位置合わせされていない場合は5ページ)。16MBをカードに供給するのではなく、相互に4MBのオフセットで512バイトを書き込むことで、テストを高速化できます。バイトとページ数を区別していませんが、そうすべきです-たとえば、SanDisk 8GBカードの場合、「16MB」は「2KB」と同じ摩耗をカードに与えます。ページではなくバイトを参照することは、非常に誤解を招く可能性があります。
ジェイソンC

上記で作成したテストプログラムで〜8.1milの反復(8時間以上)の後、新しいSanDisk 8GB MicroSDで電源を入れ直した後、書き込み速度は永久に約450kB /秒に制限され、約dd250MBを超えて書き込みに失敗しましたマーク。3回目のdd試行で250MBを超えましたが、一度実行すると、それらの領域で書き込みパフォーマンスが再び向上しました。カードが破壊されたとは言いませんが、確かに100%ではありません。
ジェイソンC
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.