使用Linux对SD卡进行压力测试


19

昨天,我与某人就我的回答的逻辑和/或准确性进行了一次小辩论,即,在体面(GB +)大小的SD卡上记录和维护fs元数据可能永远不足以使卡磨损在合理的时间内(数年和数年)。反驳的理由似乎是我一定错了,因为网上有很多关于SD卡磨损的故事。

由于我的设备中确实装有SD卡,其中包含24/7保留的rw根文件系统,因此我之前对前提条件进行了测试,令我感到满意。我对测试进行了一些调整,重复了一下(实际上是使用同一张卡片),并在这里进行介绍。我有两个核心问题:

  1. 是我曾经试图破坏该卡可行的,记住它的目的是不断重现的影响,重新编写方法数据量?
  2. 我用来验证卡的方法仍然可行吗?

我将问题而不是SO或SuperUser放在这里,因为对第一部分的异议可能必须断言我的测试并未真正按照我确定的方式写入卡,并且断言这需要一些时间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;
}                                 

我将其运行了大约8个小时,直到我对该分区的开头累积了200万次以上的写入/dev/sdb11 我可以很容易地使用它/dev/sdb(原始设备而不是分区),但是我看不到这会有什么用。

然后,我尝试通过在上创建并安装文件系统来检查卡/dev/sdb1。这项工作奏效了,表明我整夜都在写的特定代码块是可行的。但是,这并不意味着该卡的某些区域没有因磨损平整而被磨损和移位,而是可以访问的。

为了测试这一点,我badblocks -v -w在分区上使用了。这是一个破坏性的读写测试,但是无论是否磨损均衡,它都应强烈表明该卡的可行性,因为它仍必须为每次滚动写入提供空间。换句话说,这实际上是完全填充卡,然后检查所有这些都可以。几次,因为我让坏块通过几种模式工作。

[下面是Contra Jason C的评论,以这种方式使用Badblocks没有错是非。虽然由于SD卡的性质,它实际上不能识别坏块,但可以使用-b-c开关进行任意大小的破坏性读写测试,这是很好的选择,这是修改后的测试的去向(请参阅我自己的回答) )。卡的控制器无法进行任何魔术或缓存操作,因此无法通过测试将几兆字节的数据写入硬件并正确地再次读取。杰森(Jason)的其他评论似乎是基于一种误读-国际海事组织(IMO)是有意为之的,这就是为什么我不愿意争论。抬起头来,我让读者来决定什么有意义,什么没有。]

1该卡是旧的4 GB Sandisk卡(上面没有“类”号),我几乎没用过。再次提醒您,实际上不是在同一物理位置写入200万个字;由于磨损平衡,在测试过程中,控制器将不断移动“第一个滑块”以平衡磨损。


由于以下原因,这是不可靠的测试。同样,您不能badblocks用来显示闪存驱动器上的页面失败(并声称这是非常误导的)。这些由控制器处理,并在检测到时映射为保留空间。驱动器上数据的物理布局与执行I / O时看到的物理布局不同,这就是损耗均衡保持透明性的方式。没有这个过程中I / O是对你可见。如果驱动器最多支持SMART,则可以从控制器获取有关故障和剩余保留空间的一些信息。
杰森·C

至于/dev/sdb1vs,/dev/sdb这对您的程序没有影响,但确实有所不同(如下所述)的是,设备上未使用块的状态是未知的,并且在测试中无法解释,除非您填满整个设备(例如,/dev/sdb)首先要获得数据,必须要处理的空间损耗平衡量是一个主要变量。因此,尽管设备与分区之间的关系与您的测试无关,这主要是测试有缺陷的结果,因为在用数据正确填充设备后,按分区将是不可用的选项(除非您格式化之后)。
杰森C

使测试不切实际的另一点是,页面可能会(并且通常会失败)失败,但之后仍会使SD卡100%可用。如果控制器检测到故障并掩盖了故障,但无法读取数据,则当控制器尝试复制该块时,文件系统数据可能会损坏。
杰森C

我告诉你什么-用特定的术语向我描述一个可重现的测试,该测试确实会使SD卡磨损,然后我将认真对待您。不可复制的“权威要求”和个人轶事就是这样。ab
acutoritate的

1
我不知道那张特定的牌,但是无论如何,它们中的大多数至少已经有点死了。这些家伙至少在一种品牌的SD卡上入侵了微控制器:bunniestudios.com/blog/?p=3554他们在这个话题上进行的时光对话非常好。
mikeserv

Answers:


11

我认为对SD卡进行压力测试通常存在以下两个问题:

  1. 不能保证一次写入下一个实际上在SD上行使相同的物理位置。请记住,我们所知道的大多数SD系统都在积极地采取封锁措施,并根据每个位置遭受的“磨损”移动支持它的物理位置。

  2. 不同的技术(MLC与SLC)我看到的另一个问题是技术上的差异。我希望SLC类型的SSD与MLC品种相比具有更长的使用寿命。此外,您不必在SLC上处理更严格的MLC容限,或者至少它们更容忍这种故障。

    • MLC-多级电池
    • SLC-单级电池

MLC的问题是给定单元可以存储多个值,位实际上是使用电压堆叠的,而不是例如物理地+ 5V或0V,因此这可能导致故障率比其SLC高得多当量。

预期寿命

我发现此链接讨论了有关硬件可以使用多长时间的信息。标题为:了解您的SSD-SLC与MLC

SLC

根据最佳估计,可以平均估计SLC ssds的平均寿命为49年至149年。Memoright测试可以验证128Gb SSD的写入寿命超过200年,平均每天写入100Gb。

多层板

这就是mlc设计的不足之处。到目前为止,还没有人发布。没有人真正检查过mlc可以确保什么样的预期寿命,除了,寿命会大大降低。我收到了几种不同的信念,这些想法平均可以支持slc设计,使用寿命为10到1。保守的猜测是,大多数寿命估计会在7到10年之间,具体取决于每个制造商控制器内部“平均磨损算法”的发展。

比较

为了通过写周期进行比较,与具有10,000个写周期的mlc相比,slc的生存期为100,000个完整写周期。根据使用的“磨损平衡”的设计,这可能会显着增加。


1
WRT损耗均衡“不能保证一个写入下一个实际上在SD上行使相同的物理位置” –这是问题slm中假定的!非常明确地说,我认为...如果没有损耗平衡,我将永远不会期望该测试通过,因为我将超出任何规定的写周期最大寿命。该测试旨在证明磨损平衡的功效,而不是忽略它。我可以在相同的外观上写入200万次这一事实表明磨损均衡已生效。
goldilocks 2013年

WRT#2,质量和技术当然将一张卡与另一张卡区分开。我的观点是,如果每天写入的数据量相对较小,那么廉价的Sandisk卡的使用寿命将比任何人真正需要的更长。
goldilocks 2013年

@goldilocks-好吧,好吧,别为我吵架。8-),因此,您要说的是,如果我编写了足够多的数据,从而有效地从方程式中消除了磨损平衡,并对其进行了坏块测试,是否足以证明磨损平衡的功效?
slm

1
@goldilocks-我刚打开潘朵拉的盒子吗?
slm

1
(例如:如果您通过向其中写入图像来克隆SD卡,并且fstrim以后没有/不能这样做,则完全禁用了动态磨损平衡[将很难找到具有静态磨损平衡的消费级SD卡],方法是:将每个页面都标记为已使用。)
Jason C

6

您的测试有很多问题,有些是模糊的,有些不是。这也取决于您的目标。两个模糊的模糊问题是:

  • 您不是从正在写入的同一区域进行读取,而是有效地进行了读取测试,然后什么也不做(除非控制器进行了读取干扰纠正,在这种情况下,它有时可能会将正在读取的页面移到其他地方,但这仍然可以不会影响您的测试)。
  • 您假设(并且有可能,但不能保证)控制器已检测到并报告了对坏块的读/写操作-您可能要写数据,读回数据并进行比较以进行有保证的检查。

但是,这些可以说是书呆子。更严重的是:

  • 您不能用来badblocks在闪存中显示失败的页面;所有故障检测和后续页面映射均由控制器完成,并且对操作系统透明。如果驱动器支持,您可以从SMART获取一些信息(我知道没有支持它的SD卡,也许有高端的拇指驱动器可以支持)。
  • 磨损平衡,由于测试时未考虑先前的TRIM命令,测试过程中驱动器的空闲/使用状态以及预留空间而变得复杂。

磨损平衡:主要问题是磨损平衡是测试中的主要变量。它通常在控制器上发生,并且在任何情况下甚至对于直接的设备搜寻+读/写都是透明的。在您的示例中,您实际上并不知道损耗平衡状态(特别是最近是否已向可用块发出了TRIM命令?)...

对于设备上的动态耗损均衡(实际上存在于所有消费级存储设备中),它可以处于任何状态:在一个极端情况下,没有页面被标记为空闲,因此控制器必须工作的唯一页面保留空间中的(如果有)。请注意,如果在设备上预留空间,这让你开始得到保证之前,完全失败的页面写入失败(假设有标记为空闲,没有剩余的其他网页)。在另一个极端,每个页面都被标记为空闲,在这种情况下,从理论上讲,您必须先使设备上的每个页面都失败,然后才能开始看到写入失败。

对于静态损耗平衡(SSD往往具有这种损耗,SD卡往往没有,而拇指驱动器则有所不同):除了重复写入设备上的每个页面之外,实际上没有办法解决。

...换句话说,存在一些您无法了解且肯定无法控制的磨损平衡细节,尤其是是否正在使用动态磨损平衡,是否正在使用静态磨损平衡以及设备上用于磨损均衡的预留空间量(在控制器[或驱动程序,在某些情况下,例如M-Systems旧DiskOnChip]上看不到)。

SLC / MLC:与SLC与MLC一样,这对您希望看到的限制有非常直接的影响,但是一般的磨损平衡步骤和测试步骤对于两者来说是相同的。尽管任何声称每页周期限制为100k +的闪存驱动器都可能是SLC(简化的权衡方法是SLC =耐用性,MLC =密度),但许多供应商并未发布其便宜的消费类产品的设备是SLC还是MLC。

缓存:关于缓存,它有些跷。当然,在一般情况下,在OS级别,fsync / fdatasync不保证实际写入数据。但是,在这种情况下,我认为可以肯定的是(或者至少控制器已承诺这样做,即不会在高速缓存中吞噬写入内容),因为通常将可移动驱动器设计为“弹出”(卸载>同步),然后删除(断电)。虽然我们不确定,但有根据的猜测是可以假设同步可以保证写入将绝对发生,这是安全的,尤其是在write-> sync-> read back(如果不是这样的话,驱动器将是不可靠的)弹出后)。在弹出时除了发出“ sync”命令外没有其他命令。

在控制器上,一切皆有可能,但是上面的假设还包括这样的假设,即控制器至少没有做任何“复杂”的事情来冒同步后数据丢失的风险。可以想象,如果相同的数据(在一定程度上)正在被重写,则控制器可以说是缓冲写入和组写入,或者不写入数据。在下面的程序中,我们在两个不同的数据块之间交替进行,并在回读之前执行同步,以专门破坏合理的控制器缓存机制。当然,我们仍然不能保证也不知道,但是我们可以根据这些设备的正常使用情况和合理/通用的缓存机制做出合理的假设。

测试:

不幸的是,事实是,除非您知道设备没有保留空间并且没有进行静态调平,否则无法确定地测试特定页面的周期限制。但是,您可以获得的最接近值如下(假定没有静态磨损平衡):

您需要做的第一件事是用数据填充整个卡。这很重要,它是原始测试中剩下的主要变量。除了任何保留空间(您无法访问)之外,这会标记尽可能多的已使用块。请注意,我们正在使用整个设备(这将销毁所有数据),因为使用单个分区只会影响设备上的一个特定区域:

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_DIRECTO_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字节的对齐写入是可以的,这将使您擦除并重写整个一页。您可以通过使用更大的块大小来显着加快测试速度,但是要获得具体结果却变得很复杂。

我目前正在对昨天在人行道上发现的看上去相当破旧的4GB PNY拇指驱动器进行测试(似乎是http://www3.pny.com/4GB-Micro-Sleek-Attach剩下的东西- -Purple-P2990C418.aspx)。

上面的程序本质上是的受限版本,只有badblocks在所有保留空间都用完之后,您才会看到失败。因此,期望(每次迭代写1页)平均来说,上述过程应该在reserved_pa​​ge_count * write_cycle_limit迭代中失败(再次,损耗平衡是一个主要变量)。实在太糟糕了,拇指驱动器和SD卡通常不支持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页。

说“我用16MB写入测试过”是不准确的,因为它的损耗与“我用4字节写入测试过”相同。更准确地说,“我测试了4页写入”。


我添加了有关字节与页面的注释。
杰森C

PNY看起来坚不可摧。但是,在全新的SanDisk 8GB MicroSD上进行了约810万次迭代(约8个小时以上)后,重新启动后,最大写入速率(最初为4MB /秒)永久降至410kB /秒,dd写入250MB后失败。直到电源关闭后才出现损坏。经过约3000万次迭代,PNY拇指驱动器仍然不受影响。我修改了上面的程序(但是没有反映在上面的代码中),每次都写入与16kB对齐的随机位置,而不是每次写入,但是我在SD上进行了大约4百万次迭代后才这样做。将使用新卡重新测试。
詹森·C

dd在该卡上进行的第三次尝试使它超过了250MB标记,此后,写入性能再次提高到全4MB /秒。我希望性能会变幻莫测,因为块会继续被拖曳。我不会说这张卡被破坏了,但是肯定不是100%。
詹森·C

5

只是在slm的答案上增加了一些要点-请注意,对于SSD来说,这些要比对“笨拙的” SD卡更多,因为SSD 会对您的数据起到脏的作用(例如,重复数据删除):

  • 您正在将64KB写入设备的开头-这本身有两个问题:

    1. 闪存单元通常具有从16KB到更大的擦除块(尽管更可能在128-512KB范围内)。这意味着它需要至少此大小的缓存。因此,对我来说,编写64KB似乎还不够。

    2. 对于低端(读取“非企业”)解决方案(我希望SD / CF卡比SSD更能解决此问题),制造商可能会选择使设备的开始比其他设备更具耐磨性,因为重要结构-分区表和设备单个分区上的FAT(大多数存储卡正在使用此设置)位于此处。因此,测试卡的开头可能会有偏差。

  • fdatasync() 不能真正保证将数据写入物理介质(尽管在操作系统的控制下,它可能做得最好)-请参见手册页:

    呼叫将阻塞,直到设备报告传输已完成

    如果发现有一个小电容器,在失去外部电源的情况下能够提供将缓存的数据写入闪存的能量,我也不会感到惊讶。

    无论如何,假设卡上存在高速缓存(请参阅我对SU问题的回答),写入64KB并进行同步(与fdatasync())似乎不足以令人信服。即使没有任何“电源备份”,固件也可能会起到不安全的作用,并且使数据写入的时间长于预期的时间(因为在典型的使用情况下,它不会造成任何问题)。

  • 您可能想在写入新块并进行比较之前先读取数据,以确保它确实有效(如果您足够偏执,请使用已清除的缓冲区进行读取)。


+1在此强调缓存的可能性和擦除块的重要性。但是...
goldilocks

“测试卡的开头可能有偏差”请记住,由于损耗平衡(必须起作用-这时我已经超过了任何合理的写入周期数)- 显然,这只是第一步。即,它是第一个虚拟块,而不是第一个物理块。
goldilocks 2013年

IMO,“ fdatasync()并不能真正保证将数据写入物理介质”,报告传输已完成的设备确实指示如果设备还通过了读写测试,则肯定已经发生了写操作(未通过)失败了之一)。缓存可能会使情况复杂化,但是如果我们使用一个相当大的块来解决这个问题,那么当设备报告成功时,就不可能出现“错误写入”。如果那样做将是无用的。
2013年

1
@goldilocks不,从设备读回数据并不能保证任何事情。可以预期数据在物理介质上是合理的,并且在大多数情况下可能会存在,但是不能保证-至少除非超出缓存大小。
彼得

1
@goldilocks peterph提出了我想指出的另一件事;将read在您的测试是不必要的,它没有增加的信息和不相关的写周期的考验。对于真正的测试,除非您确定控制器可以检测并报告所有故障模式,否则您将需要读回刚刚编写的块并对其进行验证。
詹森·C

2

Peterph的回答确实使我考虑了进一步缓存的问题。深入研究之后,我仍然不能确定是否有任何,部分或全部SD卡可以执行此操作,但我确实认为有可能。

但是,我不认为缓存所涉及的数据大于擦除块。可以肯定的是,我使用16 MB块而不是64 kB重复了该测试。这是4 GB卡总容量的1/250。大约花了8个小时才完成10,000次。如果平均磨损尽其所能来分散负载,则意味着每个物理块将被使用40次。

这虽然不多,但是测试的原始目的是通过证明我无法通过重复写入少量数据到相同(明显)位置来轻易损坏卡来证明损耗均衡的功效。IMO先前的64 kB测试可能是真实的-但必须是16 MB。系统已将数据刷新到硬件,并且硬件已报告写入而没有错误。如果这是一种欺骗,那么该卡将无济于事,并且只能在主存储中高速缓存16 MB,这正是测试的重点。

希望每笔10,000次写入16 MB,足以证明即使在最底端的品牌卡(价值:5加元)上,运行每天写入少量数据的rw根文件系统24/7 也不会磨损该卡。一段合理的时间。 10,000天是27年...并且卡还可以...

如果我得到了开发工作量更大的系统的报酬,那么我将至少要进行一些测试以确定卡可以使用多长时间。我的直觉是,这样的写入速度很慢,以最大速度可能需要数周,数月甚至数年的连续写入(事实是,在线上没有此类比较测试的内容对事实上,这将是一个很长的事情)。

关于确认卡仍然可以,我不再认为使用badblocks其默认配置是合适的。相反,我这样做是这样的:

badblocks -v -w -b 524288 -c 8

这意味着要使用512 kB块重复8次(= 4 MB)进行测试。由于这是一项破坏性的rw测试,如果在连续循环中使用该设备,则在压力测试该设备方面可能是我的家常做法。

我还创建了一个文件系统,将其复制到2 GB的文件中,diff然后将文件与原始文件相对应,然后-由于该文件是.iso文件,因此将其安装为映像并浏览其中的文件系统。

该卡还是可以的。毕竟这可能是可以预期的...

;);)


我认为您的数学不正确。2类卡具有2MB / s的持续吞吐量,这意味着您将在4个月内投入20TB的存储空间。当然,您提到您有一张未分类的卡,但实际上确实比它低了几个数量级(正如terdon在unix.stackexchange.com/questions/84902/…中指出的那样)。否则,我完全同意slm。
彼得

我相信我们可以合理地确定,对于旨在被频繁删除并且也是由总线供电的媒体,在进行同步之后,缓存具有最小的影响(如果有的话)。请考虑将这些设备设计为可靠地“弹出”并卸下,并且同步是OS可以对设备进行的最后一件事,而不是切断其电源(如果可能)。可以合理地假设,例如USB驱动器或SD卡要么在同步后进行物理写入,要么至少致力于在掉电后的极短时间内进行写入。
詹森·C

另外,顺便说一句,badblocks不会在闪存中显示失败的页面。它不是此作业的正确工具,因此无法使用它在Flash上​​查找失败的页面。当控制器检测到故障时,它将在内部将页面标记为不良,并将其重新映射到保留空间中的页面。所有这些都发生在控制器后面,即使在原始设备转储中,您也不可见。如果支持SMART,则可以从控制器中获取一些信息。设备上数据的物理顺序与在设备上进行IO时看到的字节顺序不匹配。
詹森·C

再说一遍,更多的是FYI:在SanDisk 8GB MicroSD(消费者级别)上,分配单元(即页面大小)为4MB(如控制器报告的那样)。表示该卡上的16MB为4页(如果未对齐,则为5页)。您可以通过以彼此4MB的偏移量写入512个字节而不是向卡提供16MB的速度来加快测试速度。您并没有在字节数和页数之间进行区分,但是应该-在您的示例中,如果它在SanDisk 8GB卡上,则“ 16MB”在卡上的磨损与“ 2KB”相同。引用字节而不是页面是高度误导的。
杰森C

在我上面编写的测试程序中,经过约810万次迭代(历时8小时以上),然后重新上电,然后在全新的SanDisk 8GB MicroSD上,写入速度被永久限制为大约450kB / sec,并且dd无法写入超过250MB标记。在第三次dd尝试时,它超过了250MB,并且一旦写入,这些区域的写入性能再次提高。我不会说这张卡被销毁了,但肯定不是100%。
詹森·C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.