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