Тестер SD карт

Тестер SD карт

Семён сохраняет полезное_)

Всем привет! 

Сегодня расскажу о том как написал инструмент для валидации MicroSD будущего PTP GM и попутно проверил три модели карт от компании Netac которая последнее время активно заваливает российский рынок бюджетными решениями(Спойлер, не всё так грустно).

Что же такое MicroSD?

Если не копировать определение из Wiki то это запоминающее устройство крайне малых размеров. Отмечу ряд важных понятий и нюансов.

1.Объем

Стандарт microSD. Они объемом до 2-4ГБ.

Стандарт microSDHC. Они объемом 4–32 ГБ

Стандарт microSDXC. Они объемом 64 ГБ – 2 ТБ

Стандарт microSDUC. Они объемом 2–128 ТБ 

2.Скорость

2.1. Speed Class (устаревающий)

Class 2 / 4 / 6 / 10 → минимум MB/s записи

2. UHS Speed Class

U1 = ≥10 MB/s

U3 = ≥30 MB/s

3. Video Speed Class (актуально)

V30 / V60 / V90 → гарантированная запись для видео

V30 → 4K

V60/V90 → 8K / RAW

4. Application Class (важно для SBC/Android)

A1 → ~1500 IOPS read / 500 write

A2 → быстрее, но требует поддержки хоста

Для Raspberry Pi / embedded — смотрим именно A1/A2 + random I/O, а не только MB/s.

3.Интерфейсы (шина)

Default / High Speed: до 25 MB/s

UHS-I: до ~104 MB/s (самый распространённый)

UHS-II/III: до 312+ MB/s (вторая линия контактов, редко в microSD)

4.Внутренности 

Контроллер (wear leveling, bad block management)

Тип NAND:

SLC с циклами PE 10 000 – 100 000

MLC с циклами PE 3 000 – 10 000

TLC с циклами PE 500 – 1 000

QLC (дешёвые карты) с циклами PE 100 – 300

DRAM cache обычно нет в картах. Что бывает критично для быстрого чтения большого количества маленьких файлов.

Как программа тестирует MicroSD?

1. Pre-conditioning (если --precondition)

Перед тестом пишет sequential'ом через 95% свободного места, чтобы выгнать карту из SLC write cache и перевести в steady state. Без этого fio первые итерации измеряет скорость кэша (быструю), а не реальной NAND.

sequential'ом - это запись данных последовательно, блок за блоком, от начала до конца, без прыжков по адресам.

Большинство дешёвых карт имеют SLC write cache — небольшая быстрая область (несколько GB), куда сначала попадают данные. Пока кэш не заполнен — карта пишет быстро.

Когда sequential запись проходит через весь кэш и дальше — карта вынуждена писать напрямую в медленную TLC/QLC NAND. Тут и видна реальная скорость.

2. Заполнение карты

Заполняет FILL_RATIO (70%) свободного места нулями — чтобы FTL был вынужден делать erase перед записью, как в реальной эксплуатации.

FILL_RATIO — это доля свободного места на карте, которую программа заполняет перед тестом.

3. Основной цикл (~35 сек на итерацию)

Каждую итерацию:

Random 4K (run_fio) — основная нагрузка:

4 потока, 50/50 чтение/запись, direct=1, fsync=1

собирает: bw, iops, read_iops, p99, p999

Что ещё собираем?

Температура (get_temperature):

читает из /sys/class/thermal/, отслеживает min/max/avg

Деградация через EMA:

если bw < EMA_bw × 0.7 → фиксируется degradation_event

bw — bandwidth (пропускная способность). Это скорость записи данных на карту, в KB/s.

GC-детекция:

если p999 > p99 × 5 → фиксируется gc_event

GC - Garbage Collection (сборка мусора). Это внутренний процесс контроллера карты, который происходит скрытно во время записи.

MD5 check — читает 3 файла, проверяет что они читаются без ошибок

Kernel errors — считает только новые строки "error" в dmesg с прошлой итерации

SD Association compliance (если --sd_class):

сравнивает read_iops и write_iops с порогами A1/A2

Пороги

Прогноз отказа (predict_failure):

score по tail_ratio, latency_drift, абсолютному p99 → LOW/MEDIUM/HIGH/CRITICAL

Каждые 5 итераций (по умолчанию, --verify_interval):

CRC32C верификация (run_fio_verify):

fio пишет 32MB с CRC32C checksums, затем читает и верифицирует побайтово

ловит silent data corruption (bit flip) — то, что md5_check пропустит

Каждые 10 итераций (по умолчанию, --seq_interval):

Sequential 128K write (run_fio_sequential):

имитирует нагрузку камеры / dashcam / логирования

если seq_bw падает, а random bw стабилен → деградирует SLC write cache

Между итерациями происходит сброс write-back кэша на карту и очистка page cache ядра.

FAIL если:

md5_errors > 0 ошибка чтения файлов

verify_errors > 0 CRC32C выявил corruption

kernel_errors > 10 аппаратные сбои

bw_min < avg_bw × 0.7 деградация производительности

p999_max > p99_max × 10 критические задержки GC

I/O error в исключении значит что карта умерла.

О картах Netac

Все карты о которых идет речь были на 32 ГБ.

На тестах у меня были карты P500 Standard и P500 Extreme Pro.

P500 Extreme Pro показал за 72 часа в среднем 390,75 iops. Сбоев не обнаружено. Карта мне понравилась. 

P500 Standard показал в среднем 576. Но посыпался по ошибкам контроллера. Данных карт у меня было 3 из разных мест и они показали похожие результаты.

Ну и для примера бренд SmartBuy со своей картой показал в среднем 149 iops. 

Чем же хочется закончить?

Карты я ещё продолжу тестировать исходя из требований своего девайса(те что тестировал ранее я брал из-за привлекательной цены в 400 рублей и для отладки ПО). 

Код доступен на моем Gitflic - https://gitflic.ru/project/sdivcom/sd_card_tester  



Report Page