Когда я проверяю производительность SD-карт для случайной записи, я вижу, что производительность довольно плохая для размера записи 4 КБ (это неудивительно), но для некоторых карт она даже падает для больших размеров записи, прежде чем она увеличивается. Я измерил производительность произвольной записи с iozone v3.430 и протестировал несколько флеш-карт разных производителей. Это команда iozone, которую я использовал для измерения с размером файла 50 МБ:
iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile
Вот результаты с размером файла 50 МБ:
Вопрос: В чем причина того, что производительность произвольной записи с размером записи 8, 16, 32, 64 и 128 кБ ниже, чем при размере записи 4 кБ?
Питер Бриттейн предложил протестировать файл с большим размером, поэтому я попробовал его и с размером файла 500 МБ. Вот результаты:
Общая производительность ухудшилась, но явление все еще происходит.
Разделы выровнены по границам 4 МБ. Файловая система ext4 с размером блока 4 КБ. Используемый для тестов раздел - это mmcblk0p2.
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 953.7M 0 loop /mnt/sdb1
mmcblk0 179:0 0 14.9G 0 disk
├─mmcblk0p1 179:1 0 56M 0 part /boot
├─mmcblk0p2 179:2 0 7.8G 0 part /
└─mmcblk0p3 179:3 0 7G 0 part /mnt/mmcblk0p3
$ cat /etc/fstab | grep mmcblk0p2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
$ sudo fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes
4 heads, 16 sectors/track, 486192 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000981cb
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA)
/dev/mmcblk0p2 122880 16506879 8192000 83 Linux
/dev/mmcblk0p3 16506880 31115263 7304192 83 Linux
$ mount | grep ext4 | grep root
/dev/root on / type ext4 (rw,noatime,data=ordered)
# tune2fs -l /dev/mmcblk0p2 | grep Block
Block count: 2048000
Block size: 4096
Blocks per group: 32768
Обновление 1. Понятно, что производительность для произвольной записи, особенно для небольших размеров записи, значительно ниже по сравнению с последовательной записью. Ячейки памяти флэш-памяти NAND сгруппированы по страницам и так называемым блокам стирания. Типичные размеры страницы 4, 8 или 16 кБ. Хотя контроллер может записывать отдельные страницы, данные не могут быть перезаписаны без предварительного удаления, а блок стирания - это наименьшая единица, которую может стереть флэш-память NAND. Размер стираемого блока обычно составляет от 128 кБ до 2 МБ. В современных SD-картах небольшое количество стираемых блоков объединяется в более крупные единицы одинакового размера, которые называются группами выделения или единицами выделения или сегментами. Обычный размер сегмента составляет 4 МБ.Каждая операция записи в хранилище приводит к операции чтения-изменения-записи для всего сегмента. Например, на SD-карте с размером сегмента 4 МБ запись 4 КБ данных в случайные места приводит к коэффициенту усиления записи 1024. Контроллеры SD-карт реализуют уровень трансляции. Для любой операции ввода-вывода контроллер выполняет преобразование виртуального адреса в физический. Если данные внутри сегмента должны быть перезаписаны, уровень трансляции преобразует виртуальный адрес сегмента в другой стертый физический адрес. Старый физический сегмент помечен как грязный и помещен в очередь для удаления. Позже, когда он удален, его можно использовать повторно. Контроллеры SD-карт обычно кэшируют один или несколько сегментов для повышения производительности операций произвольной записи.Если на SD-картах хранится корневая файловая система, полезно, если контроллер карты может кэшировать сегмент (ы), в которых происходит операция записи, сегменты, в которых хранятся метаданные для файловой системы, и (если доступно) журнал файловой системы. Следовательно, производительность произвольной записи SD-карты зависит от размера стираемого блока, размера сегмента и количества сегментов, которые кэширует контроллер. Но все это не объясняет, почему производительность произвольной записи с размером записи 8, 16, 32, 64 и 128 кБ ниже, чем при размере записи 4 кБ.
Обновление 2 (ответ myaut): скриншот таблицы - моя собственная работа. В настоящее время я пишу статью / статью о кластерах одноплатных компьютеров, потому что они являются интересным вариантом для предоставления ресурсов для студенческих проектов и исследователей. В этом контексте я также исследовал производительность процессора, хранилища и сетевого интерфейса одного узла. Я купил все проверенные SD-карты. На одну из карт я установил (скопировал через dd) Raspian Wheezy (версия 2014-06-20). После того, как я настроил параметры сети и установил некоторые дополнительные пакеты (например, iozone), я скопировал всю SD-карту на все другие SD-карты.
Обновление 3 (ответ Габриэлю Саузерну): результаты от одиночных прогонов. Процедура была:
- Вставьте карту в Raspberry Pi Model B
- Загрузите систему
- Войти через SSH
- Начать тестовый запуск iozone
- Остановите систему и попробуйте с другой SD-картой
Некоторые из карт я несколько раз пытался перепроверить. Был только небольшой разброс. Такое явление происходит постоянно, за исключением двух карт Samsung и одной карты Verbatim.
Обновление 4: В данный момент я пытаюсь найти контакт с компанией, которая производит флеш-контроллеры NAND (Samsung, SanDisk, Toshiba ...), чтобы спросить там определенный ответ. У SanDisk есть форум. Я попросил объяснений. Я также отправил запрос в отдел технической поддержки Kingston.
Обновление 5: размер стираемого блока и размер единицы (сегмента) выделения не несут ответственности за это явление. Я проверил размер блока стирания всех SD карт с pritcsd.py кулака инструмента во внутреннем кард - ридер ноутбука ThinkPad X240 и , наконец , с Raspberry Pi Model B. Для всех карт выход составляет: Erase block size of mmcblk0 is 65536 bytes
. Также размер сегмента одинаков для всех протестированных SD-карт. Это 4 МБ. Эту информацию можно найти в файле /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size
. На мой взгляд, совершенно необычно, что все эти карты имеют одинаковый размер стираемого блока и размер сегмента. Тем временем я собрал идентификаторы продуктов / номера предметов из упаковок проверенных карт. Вот они.
Обновление 6: Техническая поддержка Kingston написала мне, что контроллеры протестированных карт Kingston (и, скорее всего, других карт) оптимизированы для файлов размером 4 КБ. Точная реализация контроллера является конфиденциальной. Ответ от Кингстона - лучший, который я получил. SanDisk никогда не отвечал на мой запрос в службу поддержки, и мне не удалось найти контакт от Sony, Samsung или Verbatim