SD
Началась эта история с того, что я заказал на Aliexpress карточку microSD на 200 гигов, потому как по сравнению с SanDisk дешевле получалось примерно раза в два. Приехала ко мне чудесная карточка, и ничего не предвещало беды, но мне на ней нужна была файловая система APFS, а не штатный exFAT, ну и система разделов, соответственно, GPT.
Разбил и отформатировал я это всё под маком, после чего начались адовы тормоза. Пишет карта нормально, примерно как и обещали, а читает настолько медленно, что с неё даже фильм не проиграть — всё время затыкается. Померил и прослезился: какие-то жалкие килобайты в секунду получаются. В общем, курнул я форумов с мануалами, а потом посмотрел на то, что делает по умолчанию дисковая утилита под маком, и открылось мне.
Итак. Все современные flash-накопители работают со страницами и блоками. Страницу можно за раз прочитать и записать на место пустой (не любой другой, а именно пустой), а блок можно за раз стереть (сделать все страницы в нём пустыми). Блок состоит из множества страниц.
Про всякие секторы размером как 512, так и 4096 байт нужно сразу и навсегда забыть, чтобы не наводили туман в мозгу. SSD-накопители мы рассматривать не будем - они во-первых слишком умные (хороший контроллер), а во-вторых имеют по несколько гигабайт буферной памяти, позволяющей практически полностью свести на нет все обсуждаемые эффекты.
А вот на USB-, а тем более на microSD-накопителях контроллеры стоят попроще, да и места для буферной памяти почти нет. И вот тут нужно понять и выполнить ровно одно правило: всё должно быть выровнено по границам 65536 байт, ибо именно такой размер страницы встречается чаще всего при объёмах накопителя от 32 гигабайт. Желательно также, чтобы и блок файловой системы тоже был равен (или кратен) тем же самым 64 килобайтам. Потому что всё железо по стандарту оптимизировано под exFAT, а у неё при размерах более 32 гигабайт спецификация советует кластер размером аж 128 килобайт.
- Если нужны разделы (MBR или GPT) — все они должны начинаться и заканчиваться по границам 64 килобайт. Во FreeBSD у gpart есть удобный ключ –a64k, делающий это автоматически.
Если файловая система FAT32 — как она сама, так и её область данных после обеих FAT должны начинаться по границам 64 килобайт (это автоматически правильно делают новые версии dosfstools под Linux, но не под MacOS), а также размер кластера должен быть строго 128 секторов.
Если файловая система ufs или apfs, её нужно создавать с ключом -b65536.
Если файловая система ext4, у которой размер "кластера" не делается больше 4 килобайт, её нужно создавать с опцией stripe-width=16, чтобы минимизировать тормоза.
Размер блока, кстати, скорее всего, выяснить никогда не удастся. Накопители могут его сообщать, но чаще всего, по историческим причинам, сообщают не реальный размер, а 4 мегабайта. Есть советы выравнивать разделы по границам именно блока, а не страницы (4, 8 или 16 мегабайт, поскольку блоки в современных накопителях не маленькие), но на практике это больше паранойя, и далеко не обязательно.