Стрес-тестування SD-карт за допомогою Linux


19

Вчора я взяв дещо з кимось із дебатів щодо логіки та / або правдивості моєї відповіді тут , див., Що реєстрація та підтримка мета-даних fs на гідній (ГБ +) розмірі SD-картці ніколи не може бути достатньо вагомою для носіння карти. у розумну кількість часу (років і років). Суперечка зустрічного аргументу здавалася, що я маю помилку, оскільки в Інтернеті так багато історій людей, які носять SD-карти.

Оскільки у мене є пристрої зі SD-картами, що містять кореневі файлові системи rw, які залишились 24/7, я раніше перевіряв цю умову на власне задоволення. Я трохи переробив цей тест, повторив його (фактично використовуючи ту саму карту) і представляю його тут. У мене є два головних питання:

  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 годин, поки я не накопичив 2 мільйони + записів на початок /dev/sdb1розділу. 1 Я просто міг легко використовувати /dev/sdb(необроблений пристрій, а не розділ), але я не можу зрозуміти, яка різниця це призведе.

Потім я перевірив карту, намагаючись створити та змонтувати файлову систему /dev/sdb1. Це спрацювало, вказуючи, що конкретний блок, про який я писав цілу ніч, був здійсненним. Однак це не означає, що деякі регіони картки не були зношені та зміщені вирівнюванням зносу, а залишалися доступними.

Щоб перевірити це, я використав badblocks -v -wна перегородці. Це руйнівний тест читання-запису, але вирівнювання зносу чи ні, воно повинно бути чіткою ознакою доцільності картки, оскільки вона все ще повинна забезпечити місце для кожного прокрутки. Іншими словами, це буквальний еквівалент заповнення картки повністю, а потім перевірка, чи все з цим нормально. Кілька разів, оскільки я дозволив поганим блокам працювати через кілька моделей.

[У коментарях Contra Jason C нижче, немає нічого поганого або помилкового в тому, щоб використовувати погані блоки таким чином. Хоча це не було б корисно на самому справі виявлення поганих блоків з - за характеру SD карти, це прекрасно для виконання деструктивних тестів для читання і запису довільного розміру з використанням -bі -cперемикачів, який де переглянута тест пішов (див мій власний відповідь ). Ніяка кількість магії чи кешування контролером картки не може обдурити тест, за допомогою якого кілька мегабайт даних можуть бути записані на апаратне забезпечення та знову прочитані назад. Інші коментарі Джейсона, схоже, грунтуються на неправильному читанні - ІМО навмисне , тому я не намагаюся сперечатися. Піднявши голову, я залишаю читачеві вирішити, що має сенс, а що ні .]

1 На картці була стара 4 Гб карта Sandisk (на ній не вказано номер "класу"), яку я ледве використовував. Ще раз майте на увазі, що це не 2 мільйони записів буквально на одне фізичне місце; через вирівнювання зносу "перший блок" буде переміщуватися контролером постійно під час випробування, щоб, як стверджує термін, нівелювати знос.


Це ненадійний тест з причин, викладених нижче. Крім того, ви не можете використовувати badblocksдля відображення несправностей сторінки на флешці (і стверджувати, що це дуже вводить в оману). Вони обробляються контролером і відображаються для резервування місця при виявленні. Фізичне розташування даних на накопичувачі не те саме, що фізичне розташування, яке ви бачите при виконанні вводу-виводу, саме так вирівнювання зносу підтримує його прозорість. Нічого цього не видно під час вводу-виводу. Щонайбільше, якщо накопичувач підтримує SMART, ви можете отримати трохи інформації про збої та залишений зарезервований простір від контролера.
Джейсон C

Що стосується /dev/sdb1vs, /dev/sdbто це не має ніякої різниці для вашої програми, але те, що має значення (як описано нижче), полягає в тому, що стан невикористаних блоків на вашому пристрої невідомий і не врахований у вашому тесті, і якщо ви не заповнили весь пристрій (наприклад, /dev/sdb) за першими даними, величина змінного рівня зносу, з якою потрібно працювати, є основною змінною. Отже, хоча пристрій і розділ не мають значення для вашого тесту, це здебільшого є наслідком хибного тесту, оскільки після належного наповнення пристрою даними, розділ не буде доступним варіантом (якщо ви не відформатували після).
Джейсон C

Ще один момент, який робить ваш тест нереальним, - це те, що сторінка може (і, як правило, є) невдалою, але все ж залишає SD-карту на 100% зручною для використання після цього. У випадку, коли контролер виявляє і маскує контролер, але дані неможливо прочитати, дані файлової системи можуть стати пошкодженими, коли контролер намагається скопіювати блок.
Джейсон С

Я кажу вам , що - опиши мені в конкретних умовах на відтворений тест , який робить носити SD - карту, а потім я буду приймати вас всерйоз. Невідтворювані "претензії від влади" та особисті анекдоти - це саме те. Argumentum ab auctoritate
goldilocks

1
Я не знаю про цю конкретну карту, але більшість із них принаймні вже трохи мертві. Ці хлопці зламали мікроконтролер хоча б на одній марці SD-карти: bunniestudios.com/blog/?p=3554 Годинна розмова з цього приводу була досить хорошою.
mikeserv

Відповіді:


11

Я думаю, що стрес-тестування SD-карти в цілому проблематично, якщо врахувати 2 речі:

  1. вирівнювання зносу Немає гарантій, що одне записування до наступного фактично виконує ті ж фізичні місця на SD. Пам'ятайте, що більшість встановлених систем SD активно приймають блок, як ми його знаємо, і переміщуємо фізичне розташування, яке підтримує його навколо, на основі сприйнятого «зносу», якому піддалося кожне місце розташування.

  2. різні технології (MLC vs. SLC) Інша проблема, яку я бачу в цьому, - це різниця в технологіях. SLC типи SSD, я б очікував, що вони мають набагато довший термін служби порівняно з різноманітністю MLC. Також на MLC є набагато жорсткіші допуски, з якими вам просто не доводиться мати справу з SLC, або, принаймні, вони набагато толерантніші до відмов таким чином.

    • MLC - багаторівнева клітина
    • SLC - Одиничний рівень комірки

Проблема з MLC полягає в тому, що дана комірка може зберігати кілька значень, біти по суті складаються за допомогою напруги, а не просто фізичної + 5 В або 0 В, наприклад, це може призвести до набагато більшого потенціалу відмов, ніж їх SLC еквівалент.

Ймовірна тривалість життя

Я знайшов це посилання, яке трохи обговорює, як довго може тривати обладнання. Це під назвою: Знай свої SSD - SLC проти MLC .

SLC

SLC ssds можна порахувати, здебільшого, жити десь серед 49 років і 149 років, в середньому, за найкращими оцінками. Тестування пам’яті може підтвердити 128 Гбіт SSD, що має термін витривалості до запису понад 200 років із середнім записом 100 Гбіт на день.

MLC

Ось де дизайн mlc не вистачає. Поки ніхто не був звільнений. Ніхто насправді не досліджував, яка тривалість життя гарантується при mlc, окрім цього, вона буде значно нижчою. Я отримав кілька різних переконань, які в середньому складають від 10 до 1 тривалості життя на користь дизайну SLC. Консервативна здогадка полягає в тому, що більшість оцінок тривалості життя припаде на період між 7 та 10 роками, залежно від прогресування «алгоритмів вирівнювання зносу» в контролерах кожного виробника.

Порівняння

Для порівняння за допомогою циклів запису, термін slc матиме 100 000 повних циклів запису порівняно з mlc, який має 10 000 циклів запису. Це може значно збільшитися залежно від використовуваної конструкції "вирівнювання зносу".


1
Вирівнювання зносу WRT "Немає гарантій, що одне записування до наступного фактично виконує ті ж фізичні місця на SD" - це припущено у запитанні slm! Дуже явно, я думаю ... Без вирівнювання зносу я ніколи не очікую, що цей тест пройде, оскільки я виходжу за межі будь-якого заявленого максимуму тривалості циклу запису. Тест покликаний довести ефективність вирівнювання зносу , не ігнорувати його. Те, що я можу записати 2 мільйони разів на одне і те ж видиме місце, вказує на рівень зносу.
goldilocks

WRT №2, якість та технологія, звичайно, відрізнятимуть одну карту від іншої. Моя думка полягає в тому, що картка Sandapo із запущеною млином все ще триватиме довше, ніж комусь потрібна, якщо кількість даних, записаних на день, порівняно невелика.
goldilocks

@goldilocks - Гаразд, гаразд, не збивай мене з цього приводу. 8-), то, що ви говорите, це якщо я запишу достатньо велику кількість даних, щоб я ефективно усунув рівень зносу з рівняння і запустив на ньому неполадки, чи достатньо, щоб показати ефективність вирівнювання зносу?
slm

1
@goldilocks - я щойно відкрив скриньку пандори?
slm

1
(Наприклад: Якщо ви клонуєте SD-карту, записавши на неї зображення, а потім не можете / не можете fstrim, ви повністю відключили динамічне вирівнювання зносу [вам буде важко натиснути, щоб знайти SD-карту споживача зі статичним рівнем зносу] від маркування кожної сторінки як використано.)
Джейсон C

6

З вашим тестом є ряд питань, деякі нечіткі, деякі ні. Це також залежить від вашої мети. Два тонких, нечітких питань:

  • Ви не читаєте з тієї самої області, в яку ви пишете, ваш тест читання ефективно, тоді нічого не робить (якщо тільки контролер не читає корекцію порушення, і в цьому випадку він може періодично переміщувати сторінку, яку читають, кудись інше, але це все одно не впливає на ваш тест).
  • Ви припускаєте (і це, ймовірно, але не гарантується), що контролер виявляє та повідомляє про неправильне блокування читання / запису - ви хочете записати дані, прочитати їх назад і порівняти їх для гарантованої перевірки.

Однак це, мабуть, педантично. Більш серйозним є:

  • Ви не можете використовувати badblocksдля відображення провалених сторінок на флеш-пам’яті; усі виявлення несправностей і наступні відображення сторінок здійснюються контролером і є прозорими для ОС. Ви можете отримати деяку інформацію від SMART, якщо накопичувач підтримує її (я не знаю жодних SD-карт, які б її підтримували, можливо, є більш високі кінцеві накопичувачі, які це роблять).
  • Носіть вирівнювання, ускладнене вашим тестом, не враховуючи попередніх команд TRIM, вільний / використаний стан накопичувача під час тесту та відведене місце.

Вирівнювання зносу: Основне питання полягає в тому, що вирівнювання зносу є основною змінною у вашому тесті. Це відбувається на контролері (як правило), і в будь-якому випадку його прозорий для навіть прямого пристрою пошук + читання / запис. У вашому прикладі ви фактично не знаєте стану вирівнювання зносу (зокрема, нещодавно були видані команди TRIM для вільних блоків?) ...

Для динамічного вирівнювання зносу (наявного практично у всіх пристроях зберігання класів споживачів) на вашому пристрої це може бути в будь-якому стані: На одному крайньому етапі жодна сторінка не позначена як вільна, і тому єдині сторінки, з якими повинен працювати контролер з - це ті, що є у зарезервованому просторі (якщо вони є). Зверніть увагу , що якщо це зарезервоване простір на пристрої, він буде мати на провал повністю , перш ніж почати отримувати гарантовано не буде працювати на записи сторінок (припускаючи , немає інших сторінок позначаються як вільні інші). З іншого боку, кожна сторінка позначається як вільна, і в такому випадку теоретично вам доведеться відмовляти кожну сторінку на пристрої, перш ніж ви побачите помилки запису.

Для статичного вирівнювання зносу (якого, як правило, мають SSD, SD-карт, як правило, немає, а накопичувачі великих пальців відрізняються): Насправді цього немає, окрім багаторазового запису на кожну сторінку пристрою.

... Іншими словами, є деталі вирівнювання зносу, про які ви не можете знати, і, звичайно, ніяк не можна контролювати - особливо, застосовується чи ні динамічне вирівнювання зносу, чи використовується статичне вирівнювання зносу, чи кількість місця, відведеного на пристрої для вирівнювання зносу (яке не видно повз контролера [або драйвера в деяких випадках, як, наприклад, старий DiskOnChip M-Systems]).

SLC / MLC: Що стосується SLC проти MLC, це має дуже прямий вплив на межі, які ви могли б очікувати, але загальна процедура вирівнювання зносу та процедура випробування однакові для обох. Багато постачальників не публікують, чи є їхні пристрої SLC або MLC для їх дешевших споживчих товарів, хоча будь-яка флешка, що вимагає обмеження циклу 100 к + на сторінку, швидше за все, SLC (спрощений компроміс - SLC = витривалість, MLC = щільність).

Кешування: Щодо кешування, це трохи іфій. На рівні ОС, звичайно, fsync / fdatasync не гарантує, що дані фактично записані. Однак я думаю, що можна припустити, що це (або принаймні контролер зобов’язався це зробити, тобто запис не проковтнеться в кеші) у цьому випадку, оскільки знімні накопичувачі, як правило, розроблені для загальної моделі використання "вийняти" (відключити> синхронізувати), потім видалити (вимкнути живлення). Хоча ми точно не знаємо, освічена здогадка говорить про те, що з впевненістю можна припустити, що синхронізація гарантує, що запис повністю відбудеться, особливо при записі -> синхронізації -> читанні назад (якби не такі, накопичувачі були б ненадійними після викидання). Не існує іншої команди, окрім "синхронізації", яка може бути видана при вилученні.

У контролері все можливе, але вище припущення також включає припущення, що принаймні контролер не робить нічого "складного", щоб ризикувати втратою даних після синхронізації. Можливо, що контролер може, скажімо, буферувати і групувати записи, або не записувати дані, якщо ті самі дані переписуються (в обмеженій мірі). У нижченаведеній програмі ми чергуємо два різних блоки даних і виконуємо синхронізацію перед зчитуванням, зокрема, щоб перемогти розумний механізм кешування керування. Але, звичайно, немає жодних гарантій і жодного способу знати, але ми можемо зробити обґрунтовані припущення, засновані на нормальному використанні цих пристроїв та нормальних / звичайних механізмів кешування.

Тестування:

На жаль, правда полягає в тому, що якщо ви не знаєте, що пристрій не має зарезервованого простору і не робить статичне вирівнювання, то немає можливості остаточно перевірити обмеження циклу певної сторінки. Однак найближчим до вас є наступне (не допускайте статичного вирівнювання зносу):

Перше , що вам потрібно зробити , це заповнити всю карту з даними. Це важливо і є основною змінною, яка залишилась у вашому оригінальному тесті. Це позначає якомога більше блоків, що використовуються, окрім будь-якого зарезервованого місця (до якого у вас немає способу доступу). Зауважте, що ми працюємо з усім пристроєм (що це знищить усі дані про), оскільки робота з одним розділом впливає лише на одну конкретну область пристрою:

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

Редагувати: Для карт із блоками стирання 4 МБ спробуйте це для швидшого запису:

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

Потім ви можете написати програму тестування циклу наступним чином, використовуючи O_DIRECTта O_SYNC(і, можливо, параноїдальне, надмірне використання fsync()), щоб вирізати якомога більше буферизації ОС та кешування з картинки, наскільки це можливо, і теоретично записати безпосередньо на контролер і зачекайте, поки він повідомить, що операція закінчена:

#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 байт, вирівняні записи, добре, що дасть вам стерти та переписати одну цілу сторінку. Ви можете значно пришвидшити тест, використовуючи більший розмір блоку, але тоді стає складним досягти конкретних результатів.

В даний час я тестую на досить побитий дисковий накопичувач великого пальця 4 Гб, який я знайшов вчора на тротуарі (здавалося, що залишилося від http://www3.pny.com/4GB-Micro-Sleek-Attach-- -Purple-P2990C418.aspx ).

Вищеописана програма по суті є обмеженою версією, badblocksі ви не побачили б збоїв, поки не буде вичерпано весь зарезервований простір. Тому сподівання (з 1 сторінкою, написаною за ітерацію), полягає в тому, що вищезазначена процедура в середньому повинна провалюватися в ітераціях зарезервованої сторінки_питання * write_cycle_limit (знову ж таки, рівень зносу є основною змінною). Надто погані накопичувачі великого пальця і ​​SD-картки зазвичай не підтримують SMART, який має можливість повідомляти про зарезервований розмір місця.

До речі, fsyncvs fdatasyncдля цього тесту немає значення для блокового запису пристрою, який ви робите. Ваші open()режими важливі.

Якщо вам цікаво технічних деталей; ось усе, що ви можете знати (плюс більше) про внутрішню роботу SD-карт: https://www.sdcard.org/downloads/pls/simplified_specs/part1_410.pdf

Редагувати: Байти проти Сторінок: У контексті цих типів тестів важливо думати про речі на сторінках, а не на байтах. Зробити зворотне може бути дуже оманливим. Наприклад, на 8-сантиметровому SD-диску SanDisk розмір сторінки за даними контролера (доступний через /sys/classes/mmc_host/mmc?/mmc?:????/preferred_erase_size) становить повний 4 Мб. Написання 16 Мб (вирівняне за межами 4 МБ), потім стерти / записати 4 сторінки. Однак запис чотирьох одиничних байтів на відстані 4 Мб один від одного також стирає / записує 4 сторінки.

Точно сказати "я тестував з 16 МБ записує", оскільки це така ж кількість зносу, як і "я тестував з 4 байтними записами". Точніше, "я перевірив з написанням 4 сторінок".


Я додав коментар щодо байтів проти сторінок.
Джейсон C

PNY видається незнищенним. Однак після ~ 8,1 імітацій (понад 8 годин) на абсолютно новому MicroDD SanDisk 8GB MicroSD з подальшим циклом потужності максимальна швидкість запису (спочатку 4 Мб / сек) назавжди знизилася до ~ 410 кБ / сек і ddне виходить після запису 250 МБ . Пошкодження з’явились лише після закінчення циклу живлення. Палець PNY не змінюється після ~ 30мл ітерацій. Я змінив вищевказану програму (не відображена в коді вище), щоб кожен раз писати у випадкові місця з 16 кБ, а не однакові, але я це зробив після ~ 4мл ітера на SD. Повториться з новою карткою.
Джейсон C

Третя спроба ddна цій картці пройшла мимо позначки 250 Мб, а продуктивність запису знову зросла до повних 4 Мб / сек до областей після цієї точки. Я очікую, що ефективність буде непередбачуваною, оскільки блоки продовжують перемішуватися. Я б не сказав, що карта знищена, але вона, безумовно, не на 100%.
Джейсон C

5

Просто додайте деякі моменти до відповіді slm - зауважте, що вони більше мають місце для SSD, ніж для "німих" SD-карт, оскільки SSD грає набагато брудніші хитрощі з вашими даними (наприклад, дедуплікація):

  • ви пишете 64 Кб на початок пристрою - у цього самого є дві проблеми:

    1. флеш-комірки зазвичай мають стираючі блоки розміром від 16 КБ (швидше, хоча в діапазоні 128-512 КБ). Що означає, що йому потрібен кеш принаймні такого розміру. Отже, написання 64 КБ мені здається недостатньою.

    2. для низькопробних (читайте "непідприємницьких") рішень (і я б очікував, що це навіть більше для карт SD / CF, ніж для SSD-дисків), виробники можуть вирішити зробити пристрій більш стійким до зносу, ніж решта з часу там знаходяться важливі структури - таблиця розділів і FAT на одному розділі пристрою (більшість карт пам'яті використовує цю установку). Таким чином, тестування початку картки може бути упередженим.

  • fdatasync() насправді не гарантує, що дані записуються на фізичний носій (хоча це, мабуть, найкраще, що знаходиться під контролем ОС) - дивіться сторінку man:

    Виклик блокується, поки пристрій не повідомить, що передача завершена

    Я би не надто здивувався, якби виявилося, що є невеликий конденсатор, який здатний забезпечити енергією для запису кешованих даних у флеш-пам'ять у разі втрати зовнішнього живлення.

    У будь-якому випадку, за припущенням, що на картці присутній кеш (див. Мою відповідь на ваше запитання щодо SU ), написання 64 КБ та синхронізація (з fdatasync()) здається недостатньо переконливою для цієї мети. Навіть без будь-якого "резервного копіювання живлення" мікропрограмне забезпечення все-таки може відтворювати його небезпечно і зберігати дані, ненаписані трохи довше, ніж можна було очікувати (оскільки в типових випадках використання це не повинно створювати проблем).

  • ви можете прочитати дані перед тим, як написати новий блок і порівняти їх, просто щоб переконатися, що вони справді працюють (і використовувати очищений буфер для читання, якщо у вас є параноїк).


+1 Для виділення можливості кешування та значення блоку стирання в цьому. Але ...
goldilocks

"Тестування початку картки може бути упередженим" Пам'ятайте, через рівень зносу (який повинен бути в грі - я перевищив будь-яку розумну кількість циклів запису на даний момент) - це лише очевидно перший блок. Тобто це перший віртуальний блок, а не перший фізичний блок.
goldilocks

"fdatasync () насправді не гарантує, що дані записуються на фізичний носій" IMO, пристрій, який повідомляє, що передача завершився, вказує, що запис повинен відбутися, якщо пристрій також пройшов тести читання-запису (він не ще не вдалося). Кешування може ускладнити це, але якщо ми використовуємо досить великий шматок, щоб обійти це, просто неможливо "помилкових записів", коли пристрій повідомив про успіх. Було б марно, якби це зробило.
goldilocks

1
@goldilocks ні, читання даних із пристрою нічого не гарантує. Це розумно , щоб очікувати , що дані , щоб бути на фізичному носії, і він , ймовірно , буде в більшості випадків, але це не гарантовано - по крайней мере , якщо ви не вийти за межі розміру кеша.
петерф

1
@goldilocks peterph - це ще одна річ, яку я хотів зазначити; readв тесті не потрібен, він не додає ніякої інформації і не відноситься до циклічного випробуванню записи. Для справжнього тесту ви хочете прочитати назад написаний вами блок і перевірити його, якщо ви точно не знаєте, що контролер може виявити і повідомити про всі режими відмови.
Джейсон C

2

Відповідь Петерфа змусила мене ще більше розглянути питання можливого кешування. Після копання я все одно не можу точно сказати, чи це роблять якісь, деякі чи всі SD-карти, але я думаю, що це можливо.

Однак я не вірю, що кешування залучатиме дані, що перевищують блок стирання. Щоб бути справді впевненим, я повторив тест, використовуючи шматочок розміром 16 Мб замість 64 кБ. Це 1/250-й загальний обсяг картки 4 Гб. На це пішло ~ 8 годин, щоб зробити це 10000 разів. Якщо вирівнювання зносу робить все можливе, щоб розподілити навантаження навколо, це означає, що кожен фізичний блок був би використаний 40 разів.

Це не так багато, але початковим моментом тесту було продемонструвати ефективність вирівнювання зносу , показавши, що я не міг легко пошкодити карту через неодноразові записи скромних обсягів даних в одне і те ж (очевидне) місце. IMO попередній тест на 64 кБ був, ймовірно, реальним - але 16 Мбайт повинен бути. Система передала дані в апаратне забезпечення, і апаратне забезпечення повідомило про запис без помилок. Якби це був обман, карта не була б корисною для нічого, і вона не може кешувати 16 Мб ніде, а не в первинному сховищі, що саме тест має наголосити.

Сподіваємось, 10 000 записів по 16 Мб кожної достатньо, щоб продемонструвати, що навіть на найменшій картці фірмового найменування (вартість: 5 доларів CDN) запуск кореневої файлової системи rw 24/7, яка щодня записує скромну кількість даних , не зносить карту в розумний проміжок часу. 10000 днів - це 27 років ... а карта все ще добре ...

Якби мені платили за розробку систем, які працювали важче, ніж це, я хотів би зробити хоча б кілька тестів, щоб визначити, як довго може тривати карта . Моя думка полягає в тому, що при такому подібному, який має низьку швидкість запису, це може зайняти тижні, місяці або роки безперервного запису з максимальною швидкістю (факт, що немає онлайн-порівняльних тестів такого роду, говорить про це факт, що це була б дуже тривала справа).

Що стосується підтвердження картки, все ще гаразд, я більше не думаю, що використання badblocksв налаштуваннях за замовчуванням є доцільним. Натомість я зробив це так:

badblocks -v -w -b 524288 -c 8

Що означає тестування з використанням блоку 512 кБ, повтореного 8 разів (= 4 МБ). Оскільки це руйнівний тест rw, можливо, це було б добре, як мій домотканий, що стосується напруження пристрою, якщо він використовується в безперервному циклі.

Я також створив на ній файлову систему, скопіювавши її у 2 ГБ файл, diffа файл проти оригіналу, а потім - оскільки файл був .iso - встановив його як зображення та переглянув файлову систему всередині цього.

Картка все ще добре. Що, мабуть, варто очікувати, зрештою ...

;);)


Я не думаю, що ваша математика є правильною. Картка класу 2 забезпечила пропускну здатність 2 Мб / с, це означає, що ви поставите 20 ТБ приблизно за 4 місяці. Звичайно, ви згадали, що у вас є некласифікована карта, але вам здається, що на замовлення вимкнено (як Тердон вказував у unix.stackexchange.com/questions/84902/… ). В іншому випадку я цілком погоджуюся зі слм.
peterph

Я вважаю , що ми можемо бути досить впевнені , що кешування має мінімальний, якщо такі є, вплив після синхронізації для засобів масової інформації , яка призначена для часто видаляються , а також є харчування від шини. Вважайте, що ці пристрої розроблені так, щоб їх надійно «викидали» та видаляли, а синхронізація - це абсолютно останнє, що ОС може зробити для іншого пристрою, крім того, щоб знизити потужність (якщо це можливо). Доцільно припустити, що, наприклад, USB-накопичувач або SD-карта записана фізично після синхронізації, або, як мінімум, зобов’язана зробити запис у надзвичайно короткий проміжок часу після відключення живлення.
Джейсон C

Також, btw, badblocks не відображатиме сторінки, які ви пройшли на флеш-пам’яті. Це не правильний інструмент для цієї роботи, і ви не можете використовувати його для пошуку невдалої сторінки на флеш. Коли контролер виявить помилку, він внутрішньо позначить сторінку як погану та переставить її на сторінку у відведеному місці. Все це відбувається позаду контролера і зовсім не видно вам, навіть у сирому демпінговому пристрої . Ви можете отримати інформацію від контролера, якщо підтримується SMART. Фізичний порядок даних на пристрої не відповідає порядку байтів, які ви бачите при виконанні IO на пристрої.
Джейсон C

Ще один коментар, більше FYI: на MicroDD SanDisk 8 ГБ MicroSD, клас споживача, одиниця розподілу (тобто розмір сторінки) становить 4 МБ, як повідомляється контролером; це означає, що 16 Мб на цій картці - 4 сторінки (5, якщо вони не вирівняні). Ви можете пришвидшити цей тест, записавши 512 байтів при зміщенні 4 Мб один від одного замість того, щоб подати на карту 16 Мб. Ви не робите різниці між байтами та кількістю сторінок, але ви повинні бути - у вашому прикладі, якби це було на картці 8 Гб SanDisk, "16 Мб" ставить такий самий знос на карту, що і "2 КБ". Надзвичайно оманливим є посилання на байти замість сторінок.
Джейсон C

Після ~ 8.1 мільйонів ітерацій (понад 8 годин) в тестовій програмі, про яку я писав вище, а потім цикл живлення, на абсолютно новому MicroSD SanDisk 8 ГБ швидкість запису назавжди обмежена приблизно 450 кБ / сек і ddне вдалося записати минулу інформацію про 250 МБ позначка. З третьої ddспроби це зробило минулий 250 Мб, і як тільки це вдалося, продуктивність запису знову збільшилась у цих областях. Я б не сказав, що карта знищена, але вона, безумовно, не на 100%.
Джейсон C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.