Тестер 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