GNU/Linux >> Linux の 問題 >  >> Linux

Linux – Linuxを使用したSdカードのストレステスト?

私は昨日、ここでの私の答えの論理や信憑性について誰かと少し議論しました。つまり、適切な(GB +)サイズのSDカードにfsメタデータを記録して維持することは、カードを着用するのに十分なほど重要ではないということです。妥当な時間(年と年)でアウトします。反論の要点は、SDカードを身に着けている人々のオンラインの話が非常に多いので、私は間違っているに違いないということのようでした。

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

  1. 私がカードを破壊しようとして使用した方法は、継続的に小さな書き直しの効果を再現することを目的としていることを念頭に置いて、実行可能です。 データ量は?
  2. カードがまだ問題ないことを確認するために使用した方法は実行可能ですか?

S.Oではなくここに質問をします。またはSuperUser。最初の部分に異議を唱える場合は、私のテストが実際にはカードに書き込まれていないことを主張する必要があり、Linuxに関する特別な知識が必要であると主張する必要があるためです。

[SDカードが何らかのスマートバッファリングまたはキャッシュを使用している可能性もあります。そのため、同じ場所への繰り返しの書き込みは、摩耗しにくい場所でバッファリング/キャッシュされます。これについての兆候はどこにも見つかりませんでしたが、S.Uで質問しています。]

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

ハードウェアへのフラッシュについては、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,"BEGINn");

    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 %dn", r, w);
            if (errno) {
                fprintf(stderr,"%sn", strerror(errno));
                break;
            }
        }
        if (fdatasync(out) != 0) {
            fprintf(stderr,"Sync failed: %sn", strerror(errno));
            break;
        }
        count++;
        if (!(count % 1000)) {
            thousands++;
            fprintf(stderr,"%d000...n", thousands);
        }
        lseek(out, 0, SEEK_SET);
    }
    fprintf(stderr,"TOTAL %lun", count);
    close(in);
    close(out);

    return 0;
}                                 

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

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

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

関連:MVCユニットテスト?

[以下のJasonCのコメントとは対照的に、この方法でbadblockを使用することについては何も悪いことも間違っていることもありません。 SDカードの性質上、実際に不良ブロックを特定することはできませんが、-bを使用して任意のサイズの破壊的な読み取り/書き込みテストを実行することは問題ありません。 および-c 改訂されたテストが行​​われた場所であるスイッチ(私自身の回答を参照)。カードのコントローラーによる魔法やキャッシュの量は、数メガバイトのデータをハードウェアに書き込んで正しく読み戻すことができるテストをだますことはできません。ジェイソンの他のコメントは誤読に基づいているようです—IMOは意図的 1つは、それが私が議論することを気にしない理由です。その頭を上げて、何が理にかなっていて、何が意味がないかを決めるのは読者に任せます 。]

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

承認された回答:

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

  1. ウェアレベリング
    ある書き込みが次の書き込みで、実際にSD上の同じ物理的な場所を実行しているという保証はありません。設置されているSDシステムのほとんどは、私たちが知っているように積極的にブロックを取り、各場所が受けた知覚された「摩耗」に基づいて、それを支える物理的な場所を移動していることを忘れないでください。

  2. さまざまなテクノロジー(MLCとSLC)
    これで私が目にするもう1つの問題は、テクノロジーの違いです。 SSDのSLCタイプは、MLCの種類に比べてはるかに長い寿命があると思います。また、MLCには、SLCで対処する必要のない、はるかに厳しい許容範囲があります。少なくとも、この方法で失敗することに対する許容度ははるかに高くなります。

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

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

平均余命

ハードウェアの寿命について少し説明しているこのリンクを見つけました。タイトル:SSDを知る–SLCとMLC。

SLC

SLC ssdsは、ほとんどの場合、最良の見積もりにより、平均して49年から149年の間のどこにでも住むことができると計算できます。 Memorightテストでは、書き込み耐久性が200年を超え、1日あたりの平均書き込みが100Gbである128GbSSDを検証できます。

MLC

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

比較

書き込みサイクルによって比較を行うために、slcは10,000の書き込みサイクルの寿命を持つmlcと比較して、100,000の完全な書き込みサイクルの寿命を持ちます。これは、使用する「ウェアレベリング」の設計によっては大幅に増加する可能性があります。


Linux
  1. Linux カーネルで getnstimeofday を使用する例

  2. Linux でシグナルを使用した IPC

  3. Linux 待ち行列システム

  1. checksecを使用してLinuxのセキュリティプロパティを特定する

  2. Linux で SD カードを初期化中にエラーが発生しました

  3. 仮想マシンを使用した Linux モジュールの開発/テストは安全ですか?

  1. Linuxカーネルテストのライフサイクル

  2. Linuxでのripgrep(rg)コマンドの使用

  3. 50 UNIX / Linux システム管理者チュートリアル