Чому продуктивність запису на випадковій карті 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-карт для випадкового запису при тестуванні на іозон та розмір файлу 50 Мб

Запитання: Яка причина того, що продуктивність випадкового запису з розміром запису 8, 16, 32, 64 та 128 кБ повільніше, ніж при розмірі запису 4 кБ?

Пітер Бріттейн запропонував протестувати з більшим розміром файлу, тому я спробував це також з розміром файлу 500 Мб. Це результати:

Падіння продуктивності SD-карт для випадкового запису при тестуванні на іозон та розмір файлу 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. Почніть іозонний тест
  5. Зупиніть систему та спробуйте з іншою SD-карткою

Деякі картки я кілька разів намагався перевірити. Варіантів було мало. Це явище відбувається постійно, за винятком двох карт Samsung та однієї карти Verbatim.

Оновлення 4: На даний момент я намагаюся знайти контакт з компанією, яка виробляє NAND флеш-clontrollers (Samsung, SanDisk, Toshiba ...), щоб попросити там однозначну відповідь. У SanDisk є форум. Я попросив там пояснення. Я також направив запит у відділ технічної підтримки Кінгстона.

Оновлення 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


1
Це цікаве питання. Чи є результати, про які ви повідомляли, в середньому за кілька циклів чи просто за один пробіг? Мені було б цікаво дізнатись, скільки варіацій є в результатах.

1
В результаті логічного переоформлення та вирівнювання зносу ця претензія у запитанні "Наприклад, на SD-картці розміром сегмента 4 Мб, записуючи дані 4 кБ у випадкові місця, утворюється коефіцієнт посилення запису 1024." неправдиво.
Бен Войгт

1
З мого досвіду тестування ефективності, ви потрапляєте на всілякі оптимізації та кеші при менших масштабних тестах. Зокрема, я можу вважати, що виробникам із повільнішим спалахом знадобляться ці оптимізації для ефективної обробки оновлень файлової системи, але не можуть цього довести через відсутність публічної документації для всіх контролерів. Однак я помічаю, що ви використовуєте лише файл 50MB. Ви спробували протистояти цьому набагато більші файли (згідно з "правилами запуску" в 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 кб, але без великої різниці


Карти Samsung та карта Verbatim є споживчими продуктами, і в останні роки пам'ять SLC не була поширеною у таких пристроях. Картками Samsung є MB-MP16D та MB-MS16D, а номер дослівної картки - номер статті 44007 .
Neverland

Можливо, специфікації деяких контролерів доступні. Я можу відкрити карти SD і перевірити, які контролери містять ці карти, але я не можу відкрити карти microSD. Чи є шанс прочитати ідентифікатор продукту / номер контролерів SD-карт за допомогою програмного забезпечення?
Neverland
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.