Почему производительность произвольной записи на SD-карту для размера записи 8-128 кБ ниже производительности записи на 4 кБ?

15

Когда я проверяю производительность 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 МБ:

Падение производительности SD-карт для случайной записи при тестировании с iozone и размером файла 50 МБ

Вопрос: В чем причина того, что производительность произвольной записи с размером записи 8, 16, 32, 64 и 128 кБ ниже, чем при размере записи 4 кБ?

Питер Бриттейн предложил протестировать файл с большим размером, поэтому я попробовал его и с размером файла 500 МБ. Вот результаты:

Падение производительности SD-карт для случайной записи при тестировании с iozone и размером файла 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 (ответ Габриэлю Саузерну): результаты от одиночных прогонов. Процедура была:

  1. Вставьте карту в Raspberry Pi Model B
  2. Загрузите систему
  3. Войти через SSH
  4. Начать тестовый запуск iozone
  5. Остановите систему и попробуйте с другой 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

Neverland
источник
1
Это интересный вопрос. Являются ли результаты, о которых вы сообщили, в среднем за несколько прогонов или только за один прогон? Мне было бы любопытно узнать, насколько сильно варьируются результаты.
1
В результате логического переназначения и выравнивания износа это утверждение в вопросе «Например, на SD-карте с размером сегмента 4 МБ запись 4 КБ данных в случайные места приводит к коэффициенту усиления записи 1024». ложно
Бен Фойгт
1
По моему опыту тестирования производительности вы выполняете все виды оптимизаций и кэширования при тестах меньшего масштаба. В частности, я мог бы полагать, что производителям с более медленной флэш-памятью понадобятся эти оптимизации для эффективной обработки обновлений файловой системы, но я не могу доказать это из-за отсутствия общедоступной документации для всех контроллеров. Тем не менее, я заметил, что вы используете только 50 МБ файл. Вы пробовали гораздо большие файлы (согласно «правилам запуска» в iozone.org/docs/IOzone_msword_98.pdf ), чтобы попытаться противостоять этому?
1
Предполагая, что вы не найдете никакой разницы, я искал любые другие данные по этому вопросу. Похоже, что Linaro org провела подобное исследование . В частности, очень большой кэш SLC может объяснить ваши очень быстрые результаты. И оптимизация FAT32 будет нацелена специально на небольшие записи.
1
Да - уже заметили эту проблему на странице ... Я думаю, что вы можете что-то упустить с FAT32, хотя: карты оптимизированы "для шаблонов доступа, которые наблюдаются на FAT32", а не только для FAT32. Типичным шаблоном доступа в FAT будет запись нового файла, который требует потоковой передачи данных файла и обновления FAT. Обновление FAT обычно включает небольшое количество блоков. Если бы я писал FTL, я бы планировал оптимизировать любые записи, которые были меньше, чем размер моей страницы, чтобы повысить производительность FAT.

Ответы:

4

SD-карты Ячейки Структура:

В твердотельной электронике ячейка является элементом памяти, способным хранить один или несколько битов информации, количество бит на ячейку зависит от используемой технологии. (SLC / MLC / TLC)

Производители используют различные технологии во флэш-памяти для управления ее структурой, наиболее используемой структурой являются TLC и MLC из-за более низкой стоимости, связанной с этими технологиями, особенно TLC.

Эту техническую информацию трудно получить для SD-карт и USB-накопителей, так решили производители в отношении других технологий, подобных флэш-памяти, как SSD, где эта информация предоставляется почти всегда.

Это напрямую влияет на срок службы оборудования, а также на скорость.

SLC, одноуровневая ячейка (1 бит)

Generally 100000 write erase cycles
Erase time: 1-2.5ms

MLC, многоуровневая ячейка (2 или более бит)

Anywhere from 3000 to 15000 write erase cycles
Erase time: 2.5-3.5ms

TLC, трехуровневая ячейка (3 бита)

Anywhere from 1000 to 5000 write/erase cycles
Erase time: 4-5ms

Замечания :

Поскольку ячейки могут содержать 1, 2 или 3 бита, в некоторых случаях вашему чипу контроллера SD-карты потребуется выполнить больше циклов доступа в зависимости от размера записи и емкости ячейки.

Ваши карты Samsung, вероятно, используют технологию SLC или имеют мощный чип контроллера.

Заметка 2 :

Я попробовал некоторые тесты, как вы делаете с разделами ext4 размером блока 4 КБ и 1 КБ, но без большой разницы

intika
источник
Карты Samsung и Verbatim являются потребительскими товарами, и в последние годы память SLC не была распространена в таких устройствах. Платы Samsung - это MB-MP16D и MB-MS16D, а точная карта номер артикула 44007 .
Неверленд
Возможно спецификации некоторых контроллеров доступны. Я могу открыть карты SD и проверить, какие контроллеры содержат эти карты, но я не могу открыть карты microSD. Есть ли возможность с помощью программного обеспечения считывать идентификатор продукта / номер контроллера SD-карт?
Неверленд