Linux kullanarak SD kartlarda stres testi


19

Dün biriyle burada cevabımın mantığı ve / veya doğruluğu hakkında küçük bir tartışmaya girdim , vis., Fs meta verilerini iyi bir (GB +) boyutlu SD kartta günlüğe kaydetmenin ve tutmanın kartı takacak kadar önemli olamayacağı makul bir sürede (yıl ve yıl). Karşı argümanın jist'i, SD kartlar takan insanların çevrimiçi olarak birçok hikayesi olduğu için yanlış olmalıyım gibi görünüyordu.

İçinde 7/24 kalan rw kök dosya sistemleri içeren SD kartlı cihazlara sahip olduğum için, önceliği kendi memnuniyetime göre test etmiştim. Bu testi biraz değiştirdim, tekrarladım (aslında aynı kartı kullanarak) ve burada sunuyorum. İki temel sorum var:

  1. Kartı enkaz haline getirmek için kullandığım yöntem, küçük miktarlarda verilerin sürekli olarak yeniden yazılmasının etkilerini yeniden oluşturmayı amaçladığını düşünerek mi?
  2. Kartın hala uygun olduğunu doğrulamak için kullandığım yöntem geçerli mi?

Soruyu SO veya SuperUser yerine buraya koyuyorum, çünkü ilk bölüme itiraz muhtemelen testimin karta gerçekten yaptığım şekilde yazmadığını iddia etmek zorunda kalacak ve bazılarını gerektireceğini iddia edecekti linux özel bilgisi.

[Ayrıca SD kartların bir tür akıllı tamponlama veya önbellek kullanması da olabilir, böylece aynı yere tekrarlanan yazma işlemleri aşınmaya daha az eğilimli bir yerde arabelleğe alınır / önbelleğe alınır. Bunun hiçbir yerinde bulamadım ama SU hakkında soruyorum ]

Testin arkasındaki fikir karttaki aynı küçük bloğa milyonlarca kez yazmaktır. Bu, bu tür cihazların kaç yazma döngüsünün devam edebileceğine dair herhangi bir iddianın ötesindedir, ancak aşınma seviyesinin etkili olduğunu varsayarsak , kart iyi bir boyuta sahipse, bu tür milyonlarca yazının yine de "aynı blok" gibi çok fazla önemi yoktur. kelimenin tam anlamıyla aynı fiziksel blok değildir. Bunu yapmak için, her yazının donanıma ve aynı görünür yere gerçekten akıtıldığından emin olmalıydım .

Donanımı yıkamak için POSIX kütüphane çağrısına güvendim 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;
}                                 

Ben birikmiş dek ben, ~ 8 saat boyunca bu koştum 2000000 + yazıyor başlangıcına /dev/sdb1bölüm. 1 Kolayca kullanabildim /dev/sdb(ham cihazı ve bölümü değil) ama bunun ne gibi bir fark yaratacağını göremiyorum.

Daha sonra bir dosya sistemi oluşturmaya ve takmaya çalışarak kartı kontrol ettim /dev/sdb1. Bu, bütün gece yazdığım belirli bloğun mümkün olduğunu gösteren işe yaradı. Bununla birlikte, bu, kartın bazı bölgelerinin aşınma seviyesiyle yıpranmadığı ve yer değiştirmediği, ancak erişilebilir olduğu anlamına gelmez.

Bunu test etmek badblocks -v -wiçin bölüm üzerinde kullandım . Bu yıkıcı bir okuma-yazma testidir, ancak aşınma seviyelendirmesi olsun ya da olmasın, kartın fizibilitesinin güçlü bir göstergesi olmalıdır, çünkü her yuvarlanma yazımı için hala alan sağlamalıdır. Başka bir deyişle, kartı tamamen doldurmanın, ardından tüm bunların iyi olup olmadığını kontrol etmenin gerçek karşılığıdır. Birkaç kez, badblock'ların birkaç desenle çalışmasına izin verdim.

[Jason C'nin aşağıdaki yorumlarının aksine, badblock'ları bu şekilde kullanma konusunda yanlış veya yanlış bir şey yok. SD kartların doğası nedeniyle gerçekten kötü blokları tanımlamak için yararlı olmasa da , revize edilmiş testin gittiği yer olan -bve -canahtarları kullanarak keyfi boyutta yıkıcı okuma-yazma testleri yapmak iyidir (kendi cevabımı görün) ). Kartın denetleyicisi tarafından hiçbir sihir veya önbellek, donanıma birkaç megabayt verinin yazılabileceği ve doğru şekilde tekrar okunabileceği bir testi kandıramaz. Jason'ın diğer yorumları yanlış anlaşılmaya dayalı görünüyor - IMO kasıtlı bir yorum, bu yüzden tartışmak için rahatsız etmedim. Bu kafa kalmış, ben ne mantıklı ve ne karar vermek okuyucuya bırakıyorum yapar değil .]

1 Kart, zar zor kullandığım eski bir 4 GB Sandisk kartıydı (üzerinde "sınıf" numarası yok). Bir kez daha, bunun 2 milyon değil, aynı fiziksel yere yazıldığını unutmayın; aşınma seviyelendirmesi nedeniyle, "ilk blok" test sırasında kontrolör tarafından terimin belirttiği gibi aşınmayı düzleştirmek için sürekli olarak hareket ettirilecektir .


Bu, aşağıda belirtilen nedenlerden dolayı güvenilir olmayan bir testtir. Ayrıca badblocks, bir flash sürücüdeki sayfa hatalarını göstermek için (ve bunun çok yanıltıcı olduğunu iddia etmek için) kullanamazsınız . Bunlar denetleyici tarafından işlenir ve algılandığında yer ayırmak için eşlenir. Sürücüdeki verilerin fiziksel düzeni, G / Ç yaparken gördüğünüz fiziksel düzen ile aynı değildir, aşınma seviyelendirmesi şeffaflığını bu şekilde korur. I / O sırasında bunların hiçbiri sizin tarafınızdan görülemez. Sürücü en fazla SMART'ı destekliyorsa, kontrolörden arızalar ve kalan ayrılmış alan hakkında biraz bilgi alabilirsiniz.
Jason C

Gelince /dev/sdb1vs /dev/sdbsizin program için hiç fark etmez, ama ne yok (aşağıda açıklandığı gibi) bir fark yaratmak cihazınızda kullanılmayan blokların devlet sizin testinde bilinmeyen ve hesaba katılmamış olduğunu ve size tüm cihazı doldurmadan (örn /dev/sdb) önce verilerle birlikte, alan aşınması seviyesinin çalışması gereken önemli bir değişkendir. Bu nedenle, cihaz ve bölüm, testinizle alakasız olsa da, cihazı hatalı bir şekilde veriyle doldurduktan sonra, bölüm başına kullanılabilir bir seçenek olmaz (daha sonra biçimlendirilmedikçe).
Jason C

Testinizi gerçekçi olmayan bir başka nokta da bir sayfanın başarısız olabileceği (ve oldukça yaygın bir şekilde başarısız olduğu) ancak daha sonra SD kartı% 100 kullanılabilir durumda bırakmasıdır. Bir arızanın kontrolör tarafından algılanması ve maskelenmesi, ancak verilerin okunamaması durumunda, kontrolör bloğu kopyalamaya çalıştığında dosya sistemi verileri bozulabilir.
Jason C

Bana tarif - Ben ne diyeceğim belli açısından bir tekrarlanabilir testi bir SD kart yıpranacaktır yapar, sonra ben ciddiye alacağım. Geri alınamaz "otorite iddiaları" ve kişisel fıkralar tam da budur. Argumentum ab auctoritate
goldilocks

1
O kartı bilmiyorum, ama çoğu zaten en azından biraz ölü. Bu adamlar en az bir SD kart markasında mikrodenetleyiciyi hackledi: bunniestudios.com/blog/?p=3554 Konu hakkında yaptıkları saatlik konuşma oldukça iyiydi.
mikeserv

Yanıtlar:


11

Bence bir SD kart stres testi genel olarak 2 şey göz önüne alındığında sorunlu:

  1. aşınma seviyelendirmesi Bir sonrakine yazma işleminin SD'de aynı fiziksel konumları kullandığının garantisi yoktur. Mevcut SD sistemlerinin çoğunun bildiğimiz gibi aktif bir şekilde bir blok aldığını ve her bir yerin maruz kaldığı algılanan "aşınmaya" dayanarak onu destekleyen fiziksel konumu hareket ettirdiğini unutmayın.

  2. farklı teknolojiler (MLC ve SLC) Bununla ilgili olarak gördüğüm diğer bir konu da teknolojilerdeki fark. SLC tip SSD I, MLC çeşidine kıyasla çok daha uzun bir ömre sahip olmayı bekler. Ayrıca, MLC'de SLC'lerle uğraşmak zorunda kalmayacağınız çok daha sıkı toleranslar vardır veya en azından bu şekilde başarısızlığa karşı çok daha toleranslıdırlar.

    • MLC - Çok Seviyeli Hücre
    • SLC - Tek Seviyeli Hücre

MLC ile ilgili sorun, belirli bir hücrenin birden fazla değer depolayabilmesidir, bitler, örneğin sadece fiziksel bir + 5V veya 0V olmaktan ziyade bir voltaj kullanılarak istiflenir, böylece bu, SLC'lerinden çok daha yüksek arıza oranı potansiyeline yol açabilir eşdeğer.

Yaşam beklentisi

Donanımın ne kadar sürebileceğini anlatan bu bağlantıyı buldum. Başlık: SSD'lerinizi Tanıyın - SLC ve MLC .

SLC

SLC SSD'leri çoğunlukla ortalama 49 yıl ile 149 yıl arasında herhangi bir yerde yaşamak üzere en iyi tahminlerle hesaplanabilir. Memoright testi, 200 günden fazla bir yazma dayanıklılık ömrüne sahip 128 Gb SSD'yi günde ortalama 100 Gb yazma ile doğrulayabilir.

MLC

Bu, mlc tasarımının yetersiz kaldığı yerdir. Henüz hiçbiri yayınlanmadı. Hiç kimse mlc ile ne tür bir yaşam beklentisinin sağlandığını gerçekten incelememiş, bunun dışında oldukça düşük olacaktır. Ben slc tasarım lehine 10 ila 1 ömrü ortalama birkaç farklı inanç aldım. Muhafazakar bir tahmin, ömür boyu tahminlerin çoğunun, her üreticinin kontrolörleri içindeki 'aşınma dengeleme algoritmalarının' ilerlemesine bağlı olarak 7 ila 10 yıl arasında geleceğidir.

Karşılaştırmalar

Yazma döngüleri yoluyla karşılaştırma yapmak için, bir slc'nin ömrü, 10.000 yazma döngüsüne sahip olan mlc'ye kıyasla 100.000 tam yazma döngüsüne sahip olacaktır. Bu, kullanılan 'aşınma seviyelendirme' tasarımına bağlı olarak önemli ölçüde artabilir.


1
WRT aşınma seviyelendirme "Bir sonrakine yazma işleminin SD'de aynı fiziksel konumları kullanacağının garantisi yoktur" - bu slm sorusunda varsayılmıştır! Çok açık bir şekilde, sanırım ... Aşınma seviyelendirme olmadan, bu testin geçmesini asla beklemezdim çünkü belirtilen herhangi bir yazma döngüsü ömrünün ötesine geçiyorum. Test , aşınma seviyelendirmesinin etkinliğini ispatlamak için değil, kanıtlamayı amaçlamaktadır . Aynı görünür yere 2 milyon kez yazabileceğim gerçeği aşınma seviyelendirmesinin etkin olduğunu gösteriyor.
goldilocks

WRT # 2, kalite ve teknoloji elbette bir kartı diğerinden ayıracaktır. Benim demek olduğunu Sandisk karta Ucuzcu bir çalışma of-the-mill olacak hala kimse gerçekten çok ihtiyacı daha uzun geçen bir yol varsa günde yazılan veri miktarı nispeten azdır.
goldilocks

@goldilocks - Tamam, tamam, beni bu konuda dövmeyin. 8-), yani söylediğiniz şey, denklemdeki aşınma seviyelemesini etkili bir şekilde ortadan kaldıracak ve üzerinde badblokları çalıştıracak kadar büyük miktarda veri yazmam, aşınma seviyelemenin etkinliğini göstermek için yeterli mi?
slm

1
@ goldilocks - pandora'nın kutusunu açtım mı?
slm

1
(Örneğin: SD kartı bir görüntü yazarak klonlarsanız ve fstrimdaha sonra yapamazsanız / yapamazsanız , dinamik aşınma dengelemesini tamamen devre dışı bıraktınız [ her sayfayı kullanıldığı gibi işaretleme.)
Jason C

6

Testinizle ilgili bazı sorunlar var, bazıları bulanık, bazıları değil. Ayrıca hedefinize de bağlıdır. İki ince, bulanık tür:

  • Yazdığınız aynı alandan okumuyorsunuz, okuma testiniz etkili bir şekilde yapmıyorsunuz, o zaman hiçbir şey yapmaz (denetleyici okuma bozukluğu düzeltmesi yapmadığı sürece, bu durumda zaman zaman sayfayı başka bir yere taşıyabilir, ancak bu yine de testinizi etkilemez).
  • Denetleyici tarafından kötü bir bloğa okuma / yazma algılandığını ve raporlandığını varsayarsınız (ve muhtemelen, ancak garanti edilmez) - veri yazmak, tekrar okumak ve garantili bir kontrol için karşılaştırmak istersiniz.

Ancak, bunlar tartışmasız bilgiçlikçidir. Daha ciddi olan:

  • badblocksFlash bellekte başarısız olan sayfaları göstermek için kullanamazsınız ; tüm arıza tespitleri ve sonraki sayfa eşleştirmeleri kontrolör tarafından yapılır ve işletim sistemine karşı şeffaftır. Sürücü destekliyorsa SMART'tan bazı bilgiler alabilirsiniz (Bunu destekleyen hiçbir SD kart bilmiyorum, belki daha yüksek uç başparmak sürücüleri vardır).
  • Aşınma seviyelendirme, önceki TRIM komutlarını hesaba katmayan, test sırasında sürücünün serbest / kullanılmış durumunu ve ayrılmış alanı dikkate almayan karmaşıklık.

Aşınma Tesviye: Asıl mesele, aşınma tesviyesinin testinizde önemli bir değişken olmasıdır. Kontrol cihazında (genellikle) gerçekleşir ve her durumda doğrudan cihaz arama + okuma / yazma işlemine bile şeffaftır. Örneğinizde, aslında aşınma dengeleme durumunu bilmiyorsunuz (özellikle yakın zamanda serbest bloklara TRIM komutları verilmiş mi?) ...

Dinamik aşınma dengelemesi için (neredeyse tüm tüketici sınıfı depolama aygıtlarında bulunur), o zaman herhangi bir durumda olabilir: Bir uçta, sayfaların hiçbiri ücretsiz olarak işaretlenmez ve bu nedenle denetleyicinin çalışması gereken tek sayfa (varsa) ayrılmış alanda olanlar. Orada eğer Not olduğunu cihazda ayrılmış alan, bu olacak garantili alma başlamadan önce tamamen başarısız zorunda (serbest kalan olarak işaretlenmiş başka sayfalar olduğu varsayılarak) sayfa yazma işlemleri başarısız olur. Diğer uçta, her sayfa boş olarak işaretlenir, bu durumda teorik olarak yazma hatalarını görmeye başlamadan önce cihazdaki her sayfanın başarısız olması gerekir.

Statik aşınma dengelemesi için (hangi SSD'lerde olma eğilimi vardır, SD kartlarda bulunma eğilimi yoktur ve parmak sürücüleri farklıdır): Cihazın her sayfasına tekrar tekrar yazmanın yanı sıra, bunun çevresinde gerçekten bir yol yoktur.

Başka bir deyişle, bilmenin ve kesinlikle kontrol etmenin bir yolu olmayan aşınma seviyelendirme ayrıntıları vardır - özellikle dinamik aşınma seviyelendirmenin kullanımda olup olmadığı, statik aşınma seviyelendirmenin kullanımda olup olmadığı ve aşınma seviyelendirmesi için aygıtta ayrılan alan miktarı (denetleyicinin [veya M-Systems eski DiskOnChip gibi bazı durumlarda sürücünün ötesinde görünmez).

SLC / MLC: SLC'ye karşı MLC'ye gelince, bunun görmeyi beklediğiniz sınırlar üzerinde çok doğrudan bir etkisi vardır, ancak genel aşınma tesviye prosedürü ve test prosedürü her ikisi için de aynıdır. Çoğu satıcı, cihazlarının daha ucuz tüketici ürünleri için SLC veya MLC olup olmadığını yayınlamaz, ancak sayfa başına 100k + döngü sınırı olduğunu iddia eden herhangi bir flash sürücü muhtemelen SLC'dir (basitleştirilmiş takas SLC = dayanıklılık, MLC = yoğunluktur).

Önbellekleme: Önbellekleme için biraz havalı. İşletim sistemi düzeyinde, genel durumda, elbette, fsync / fdatasync verilerin gerçekten yazıldığını garanti etmez. Bununla birlikte, bu durumda çıkarılabilir sürücüler genellikle ortak kullanım deseni için tasarlandığından, bunun olduğunu (veya en azından denetleyicinin bunu yapmaya karar verdiğini düşünmek güvenli olduğunu düşünüyorum) "çıkar" (unmount> sync) sonra çıkarın (elektrik kesintisi). Her ne kadar kesin olarak bilmesek de, eğitimli bir tahmin, senkronizasyonun özellikle yazma -> senkronizasyon -> geri okumada yazmanın kesinlikle gerçekleşeceğini garanti ettiğini varsaymanın güvenli olduğunu söylüyor (eğer olmasaydı, sürücüler güvenilir olmayacaktır) çıkarıldıktan sonra). Çıkarmada verilebilen 'senkronizasyon'un ötesinde başka bir komut yoktur.

Denetleyicide her şey mümkündür, ancak yukarıdaki varsayım, denetleyicinin en azından bir eşitlemeden sonra veri kaybını riske etmek için yeterince "karmaşık" bir şey yapmadığı varsayımını da içerir. Aynı verilerin yeniden yazılması durumunda (sınırlı bir ölçüde) kontrolörün örneğin arabellek ve grup yazabileceği ya da yazamayacağı düşünülebilir. Aşağıdaki programda, iki farklı veri bloğu arasında geçiş yapıyoruz ve özellikle makul bir denetleyici önbellekleme mekanizmasını yenmek için geri okumadan önce bir senkronizasyon gerçekleştiriyoruz. Yine de, elbette, hiçbir garanti ve bilmenin yolu yoktur, ancak bu cihazların normal kullanımına ve aklı / ortak önbellekleme mekanizmalarına dayanarak makul varsayımlar yapabiliriz.

Test yapmak:

Ne yazık ki, gerçek şu ki, cihazın ayrılmış alanı olmadığını ve statik seviyelendirme yapmadığını bilmiyorsanız , belirli bir sayfanın döngü sınırını kesin olarak test etmenin bir yolu yoktur. Ancak, alabileceğiniz en yakın şey aşağıdaki gibidir (statik aşınma seviyelendirmesi olmadığını varsayalım):

İlk yapmanız gereken şey verilerle tüm kartı doldurmaktır. Bu önemlidir ve orijinal testinizde kalan ana değişkendir. Bu, ayrılmış herhangi bir alan dışında (erişme yolunuz yoktur) kullanıldığı kadar blok kullanılabilir. Tek bir bölümle çalışmak, aygıttaki yalnızca belirli bir alanı etkilediğinden, tüm bir cihazla (bunun üzerindeki tüm verileri yok edecektir) çalıştığımızı unutmayın:

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

İlerleme çubuğu türüyseniz:

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

Düzenleme: 4 MB silme blokları olan kartlar için daha hızlı yazma için bunu deneyin:

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

Daha sonra, resimden mümkün olduğunca fazla OS arabelleğe almayı ve önbelleğe almayı kesmek için O_DIRECTve O_SYNC(ve muhtemelen paranoyak, gereksiz kullanım fsync()) kullanarak bir döngü test programı yazabilir ve teorik olarak doğrudan denetleyiciye yazabilirsiniz. ve işlemin bittiğini bildirene kadar bekleyin:

#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;

    }

}

Bunun için O_DIRECTtamponların uygun şekilde hizalanması gerektiğini unutmayın . 512 bayt sınırları genellikle yeterlidir. Şunlarla derleyebilirsiniz:

g++ -O0 test.cpp -o test

-D_POSIX_C_SOURCE=200112LGerekirse ekleyin .

Ardından, cihazı tamamen yukarıdaki gibi doldurduktan sonra, gece boyunca çalıştırın:

./test /dev/sdb

512 baytlık, hizalanmış yazma işlemleri iyidir, bu size tüm sayfanın silinmesini ve yeniden yazılmasını sağlar. Daha büyük bir blok boyutu kullanarak testi önemli ölçüde hızlandırabilirsiniz, ancak daha sonra somut sonuçlara ulaşmak karmaşıklaşır.

Şu anda kaldırımda bulduğum oldukça dövülmüş görünümlü bir 4GB PNY başparmak sürücüsünü test ediyorum ( http://www3.pny.com/4GB-Micro-Sleek-Attach - -Mor-P2990C418.aspx ).

Yukarıdaki program aslında sınırlı bir sürümüdür badblocksve tüm ayrılmış alan tükenene kadar hata görmezsiniz. Bu nedenle, beklenti (yineleme başına 1 sayfa yazılır), yukarıdaki prosedürün ortalama olarak saklıdır_sayfa_sayısı * write_cycle_limit yinelemelerinde başarısız olması gerektiğidir (yine, aşınma seviyelendirmesi büyük bir değişkendir). Çok kötü parmak sürücüleri ve SD kartlar genellikle ayrılmış alan boyutunu bildirme özelliğine sahip SMART'ı desteklemez.

Bu arada, fsyncvs fdatasync, bu testin amaçları için yaptığınız blok cihazı yazma işlemleri için hiçbir fark yaratmaz. Kişisel open()modları önemlidir.

Teknik detayları merak ediyorsanız; SD kartların iç işleri hakkında bilmek isteyebileceğiniz her şey (artı daha fazlası): https://www.sdcard.org/downloads/pls/simplified_specs/part1_410.pdf

Düzenleme: Bayt ve Sayfalar: Bu tür testler bağlamında, şeyleri bayt değil, sayfalar açısından düşünmek önemlidir. Tam tersini yapmak çok yanıltıcı olabilir. Örneğin, bir SanDisk 8GB SD'de, denetleyiciye göre (üzerinden erişilebilir /sys/classes/mmc_host/mmc?/mmc?:????/preferred_erase_size) sayfa boyutu tam 4 MB'dir. 16MB yazma (4MB sınırlarına hizalı), ardından 4 sayfayı silin / yazar. Ancak, birbirinden 4MB ofsette dört adet tek bayt yazmak 4 sayfayı da siler / yazar.

"16MB yazma ile test ettim" demek yanlıştır, çünkü "4 bayt yazma ile test ettim" ile aynı aşınma miktarıdır. Daha doğrusu, "4 sayfa yazımı ile test ettim".


Bayt ve sayfalarla ilgili bir yorum ekledim.
Jason C

PNY yok edilemez görünüyor. Bununla birlikte, yepyeni bir SanDisk 8GB MicroSD'de ~ 8.1mil yinelemeden (yaklaşık 8 saatten fazla) sonra bir güç döngüsü, maksimum yazma hızı (başlangıçta 4MB / sn) kalıcı olarak ~ 410kB / sn'ye düştü ve dd250MB yazıldıktan sonra başarısız oldu . Hasar, güç çevriminden sonra görünmedi. PNY başparmak sürücüsü ~ 30mil yineleme sonrasında etkilenmez. Yukarıdaki programı değiştirdim (ancak yukarıdaki koda yansıtılmadı), her seferinde aynı yerine rastgele 16kB hizalanmış konumlara yazmak için değiştirdim, ancak bunu ~ 4mil sonra SD üzerinde yaptım. Yeni kart ile tekrar test edecek.
Jason C

Bu ddkart üzerindeki üçüncü deneme 250MB işaretini geçti ve yazma performansı bu noktadan sonraki alanlara tekrar 4MB / sn'ye yükseldi. Yine de bloklar karıştırılmaya devam ederken performansın öngörülemez olmasını bekliyorum. Kartın yıkıldığını söyleyemem, ama kesinlikle% 100'de değil.
Jason C

5

Sadece slm'nin cevabına bazı noktalar ekleyerek - SSD'ler için "aptal" SD kartlardan daha fazla yerinde olduğuna dikkat edin, çünkü SSD'ler verilerinizle çok daha düz hileler oynar (örn. Tekilleştirme):

  • Cihazın başına 64KB yazıyorsunuz - bunun iki sorunu var:

    1. flash hücrelerin genellikle 16KB'den büyük boyutlu silme blokları vardır (yine de 128-512KB aralığında daha olasıdır). Bu, en azından bu boyutta bir önbelleğe ihtiyaç duyduğu anlamına gelir. 64KB yazmak benim için yeterli görünmüyor.

    2. düşük uçlu ("kurumsal olmayan") çözümler için (ve SD / CF kartlar için bunu SSD'lerden daha da fazla bekleyebilirim) üreticileri, cihazın başlangıcını aşınmaya göre daha dayanıklı hale getirebilirler. önemli yapılar - cihazdaki tek bölümdeki bölüm tablosu ve FAT (çoğu bellek kartı bu kurulumu kullanıyor) - orada bulunuyor. Bu nedenle, kartın başlangıcını test etmek taraflı olabilir.

  • fdatasync() verilerin fiziksel ortama yazılmasını gerçekten garanti etmez (muhtemelen işletim sisteminin kontrolü altında olanı en iyi şekilde yapıyor olsa da) - man sayfasına bakın:

    Cihaz aktarımın tamamlandığını bildirene kadar çağrı engellenir

    Harici güç kaybı durumunda önbelleğe alınmış verileri flash belleğe yazmak için enerji sağlayabilen küçük bir kondansatör olduğu ortaya çıkarsa çok şaşırmam.

    Her durumda, kartta bir önbellek olduğu varsayılarak ( SU hakkındaki sorunuza verilen cevaba bakın ), 64KB yazma ve senkronizasyon (ile fdatasync()) bu amaç için yeterince ikna edici görünmüyor. Herhangi bir "güç yedeklemesi" olmasa bile bellenim yine de güvensiz oynatabilir ve verileri beklenenden biraz daha uzun süre saklayabilir (tipik kullanım durumlarında herhangi bir sorun yaratmamalı).

  • yeni blok yazmadan ve karşılaştırmadan önce, gerçekten çalıştığından emin olmak için verileri okumak isteyebilirsiniz (ve yeterince paranoyaksanız, okuma için temizlenmiş bir tampon kullanın).


+1 Önbellekleme olasılığını ve buradaki silme bloğunun önemini vurgulamak için. But ...
goldilocks

"Kartın başlangıcını test önyargılı" nedeniyle aşınma tesviye unutmayın (oyunda olmalıdır - bu noktada yazma çevrimi herhangi makul sayıda aştınız) - bu sadece görünüşte ilk bloğu. Yani, ilk fiziksel blok değil, ilk sanal blok.
goldilocks

"fdatasync (), verilerin fiziksel ortama yazılmasını gerçekten garanti etmez" IMO, aktarımın tamamlandığını bildiren aygıt, aygıtın ayrıca okuma-yazma testlerini geçmesi durumunda yazmanın gerçekleşmiş olması gerektiğini gösterir ( henüz başarısız oldu). Önbellekleme bunu zorlaştırabilir, ancak bunun üstesinden gelmek için oldukça büyük bir yığın kullanırsak, cihaz başarılı olduğunu bildirdiğinde "yanlış yazmalar" olması mümkün değildir. Bunu yapsaydı işe yaramaz olurdu.
goldilocks

1
@goldilocks hayır, verileri cihazdan geri okumak hiçbir şeyi garanti etmez. Öyle makul için bekliyoruz veriler fiziksel ortamda olmak, ve muhtemelen çoğu durumda olacak, ancak garanti değil - en azından önbellek boyutu ötesine sürece.
peterph

1
@goldilocks peterph işaret etmek istediğim başka bir şey getiriyor; readTestinizdeki hiçbir bilgi ekler ve bir yazma devri testine ilgili değildir, gereksizdir. Gerçek bir test için, kontrol cihazının tüm arıza modlarını algılayabildiğini ve raporlayabildiğinden emin değilseniz, az önce yazdığınız bloğu tekrar okumak ve doğrulamak isteyeceksiniz.
Jason C

2

Peterph'in yanıtı, olası önbellekleme konusunu daha fazla düşünmemi sağladı. Kazandıktan sonra, herhangi bir, bazı veya tüm SD kartların bunu yapıp yapmadığından emin olamıyorum, ancak bunun mümkün olduğunu düşünüyorum.

Ancak, önbelleğe almanın silme bloğundan daha büyük veriler içereceğine inanmıyorum. Gerçekten emin olmak için, testi 64 kB yerine 16 MB yığın kullanarak tekrarladım. Bu, 4 GB kartın toplam hacminin 1 / 250'sidir. Bunu 10.000 kez yapmak ~ 8 saat sürdü. Aşınma seviyelendirme, yükü yaymak için elinden geleni yaparsa, bu, her fiziksel bloğun 40 kez kullanıldığı anlamına gelir.

Çok fazla değil, ancak testin asıl noktası , aynı (görünür) konuma mütevazı miktarda veri tekrar tekrar yazarak karta kolayca zarar veremediğimi göstererek aşınma seviyesinin etkinliğini göstermekti. IMO önceki 64 kB testi muhtemelen gerçekti - ama 16 MB'lık bir tane olmalı. Sistem, verileri donanıma temizledi ve donanım, yazmayı hatasız olarak bildirdi. Bu bir aldatmaca olsaydı, kart hiçbir şey için iyi olmazdı ve hiçbir yerde 16 MB önbellek olamaz, ancak birincil depolama, bu test stres amaçlanmıştır.

İnşallah, her biri 16 MB'lık 10.000 yazı, bir alt uç marka kartında bile (değer: 5 $ CDN), günlük olarak az miktarda veri yazan bir rw root dosya sistemi çalıştırmanın 24/7 kartın makul bir süre. 10.000 gün 27 yıl ... ve kart hala iyi ...

Bundan daha ağır çalışma yaptı sistemler geliştirmek için para ödendi, ben bir kart süreyi belirlemek için en az bir kaç test yapmak ister yapabilirsiniz sürer. Benim önsezim, düşük yazma hızına sahip böyle biriyle, maksimum hızda haftalar, aylar veya yıllar süren sürekli yazımın olabileceği (bu tür çevrimiçi karşılaştırmalı testlerin ood'larının çevrimiçi olarak çok uzun bir ilişki olacağı gerçeği).

Kartın hala iyi olduğunu onaylamak için, artık badblocksvarsayılan yapılandırmasında kullanmanın uygun olduğunu düşünmüyorum . Bunun yerine, şu şekilde yaptım:

badblocks -v -w -b 524288 -c 8

Bu, 8 kez tekrarlanan bir 512 kB blok kullanarak test etmek anlamına gelir (= 4 MB). Bu yıkıcı bir rw testi olduğundan, sürekli bir döngüde kullanılırsa cihazı strese sokma konusunda muhtemelen evdeki bir test olarak iyi olurdu.

Ayrıca üzerinde bir dosya sistemi oluşturdum, 2 GB'lık bir dosyaya kopyaladım diff, dosyayı orijinaline karşı buldum ve daha sonra - .iso olduğundan - bir görüntü olarak monte ettim ve içindeki dosya sistemine göz attım.

Kart hala iyi durumda. Sonuçta, muhtemelen beklenen ...

;);)


Matematiğinizin doğru olduğunu düşünmüyorum. Sınıf 2 kart 2MB / s hıza ulaşmıştır, bu da yaklaşık 4 ayda 20 TB koyacağınız anlamına gelir. Tabii, sınıflanmamış bir kartınız olduğunu söylemiştiniz, ancak gerçekten büyüklük emirleri gibi görünüyorsunuz (terdon unix.stackexchange.com/questions/84902/… 'da işaret ettiği gibi ). Aksi takdirde slm ile tamamen katılıyorum.
peterph

Sıklıkla kaldırılacak şekilde tasarlanmış ve aynı zamanda veri yolundan beslenen medya için bir senkronizasyondan sonra önbelleğe almanın asgari düzeyde etkisi olabileceğinden makul şekilde emin olabileceğimize inanıyorum . Bu cihazların güvenilir bir şekilde "çıkarılacağı" ve çıkarılacağı şekilde tasarlandığını ve bir senkronizasyonun, bir işletim sisteminin gücünü kesmek dışında (mümkünse) bir cihaza yapabileceği mutlak son şey olduğunu düşünün. Örneğin bir USB sürücünün veya SD kartın senkronizasyondan sonra fiziksel olarak yazıldığını veya en azından yazma işleminin kapatıldıktan sonra çok kısa bir sürede yapılmasını taahhüt etmek mantıklıdır.
Jason C

Ayrıca, btw, badblocksflash bellekteki başarısız sayfaları göstermez. Bu iş için doğru araç değildir ve flaşta başarısız sayfaları bulmak için kullanamazsınız. Denetleyici bir hata algıladığında, sayfayı dahili olarak kötü olarak işaretler ve ayrılmış alandaki bir sayfaya yeniden eşler. Bütün bunlar kontrol cihazının arkasında gerçekleşir ve ham cihaz dökümünde bile sizin için görünmez . SMART destekleniyorsa denetleyiciden bazı bilgiler alabilirsiniz. Cihazdaki fiziksel veri sırası, cihazda IO yaparken gördüğünüz bayt sırasına uymuyor.
Jason C

Bir yorum daha, bir FYI'den daha fazlası: SanDisk 8GB MicroSD, tüketici sınıfı, tahsis birimi (yani sayfa boyutu), denetleyici tarafından bildirildiği gibi 4 MB'dir; yani karttaki 16 MB 4 sayfadır (hizalanmamışsa 5 sayfa). Karta 16 MB beslemek yerine birbirinden 4 MB ofsetlere 512 bayt yazarak bu testi hızlandırabilirsiniz. Bayt ve sayfa sayısı arasında bir ayrım yapmıyorsunuz, ancak örnekte bir SanDisk 8GB kart üzerindeyse, "16MB" kartta "2KB" ile aynı aşınmayı yapıyor olmalısınız. Sayfalar yerine baytlara başvurmak oldukça yanıltıcıdır.
Jason C

Yepyeni bir SanDisk 8GB MicroSD'de, yukarıda yazdığım test programında ~ 8.1mil yinelemeden (8 saatten fazla) sonra bir güç döngüsünden sonra, yazma hızı kalıcı olarak yaklaşık 450kB / sn ile sınırlıdır ddve 250MB hakkında yazı yazmadı işaret. Üçüncü dddenemede 250MB'ı geçti ve bir kez yapıldığında, bu alanlarda yazma performansı tekrar arttı. Kartın yok edildiğini söyleyemem ama kesinlikle% 100 değil.
Jason C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.