Недавно в продаже появилась новая модель Российского одноплатного микрокомпьютера - Repka Pi 4 Optimal, в котором множество улучшений по сравнению с первой моделью Repka Pi 3, появившейся на российском рынке два года назад. Попробовали его в нескольких своих проектах и уверенно можем констатировать - новый одноплатник оказался хорош по производительности и стабильности в работе.

При этом интересно, что теперь можно устанавливать в Repka Pi4 Optimal модуль eMMC (Embedded MultiMediaCard), чтобы использовать его вместо карты памяти SD как для хранения данных, так и для загрузки операционной системы. Этот модуль намного надежнее в работе, чем карта SD и что особенно приятно, примерно в 2,5 раза быстрее, чем самые быстрые SD карты. Удобным оказалось и то, что eMMC модули подходят от Orange Pi и от Rock Pi и их можно приобретать как на сайте производителя, так и на АлиЭкспресс. Repka Pi4 Optimal теперь доступна не только с возможностью установки этих eMMC модулей, а так же стали доступными модели с установленными на них микросхемами eMMC, это дешевле чем суммарно купить одноплатник и модуль eMMC к нему, но это не так гибко, так как в случае выхода из строя модуля eMMC придётся менять весь одноплатник или применять его только работая с SD картой, такой вариант интересен для применения в условиях вибраций и тряски (кому то актуально и так, видимо), так как распаянная на плате микросхема eMMC конечно будет надёжнее в работе.

Но и это оказалось не самой главной “фишкой” новой модели Repka Pi - вскоре появилась версия платы этого одноплатника с интерфейсом PCIe 2.0 1x (Peripheral Component Interconnect Express) полностью совместимый с аналогичным PCIe у Raspberry Pi 5 и соответственно все платы расширения (“шляпы“ или “шилды“) для него будут работать и на Repka Pi 4 Optimal.

А вот это уже по настоящему интересно, захотелось попробовать всё это в деле. Забегая вперёд для самых нетерпеливых сразу покажем, какие результаты получены при сравнении скоростей чтения и записи для всех типов устройств хранения данных, доступных на одноплатном компьютере.

Что и сказать - PCIe на одноплатнике - это сила. Дальше всё по порядку и подробно - про Repka Pi 4 Optimal и что ещё можно с ней сделать эдакого, про то, какие платы расширения устанавливать и как их подключать, какая методика тестирования и какие результаты - со всеми подробностями. Итак, погнали.

Содержание этой статьи

Какую версию Repka Pi 4 Optimal берём и что она ещё может

Версией платы Репки с доступным PCIe стала версия платы Repka Pi 4 Optimal v.2.1, а так же ещё чуть ранее платы v.1.1 с наличием на плате серийного номера (S/N), т.е. версии Repka Pi 4 Optimal на платах v.1.1 без серийного номера на них такой возможностью работы с PCIe не обладают. Ниже приведены фото того, как это выглядит. На момент написания данной статьи платы Repka Pi 4 с PCIe были доступны для покупки только в интернет-магазине производителя, возможно, когда Вы читаете данную статью, будет доступно уже и на других площадках.

Рис. 1.1. Отличия плат версий 1.1 и 2.1 с работающим PCIe (справа и в середине) и без работающего PCIe - разница в наличии или отсутствии на плате S/N.
Рис. 1.1. Отличия плат версий 1.1 и 2.1 с работающим PCIe (справа и в середине) и без работающего PCIe - разница в наличии или отсутствии на плате S/N.

Более того, с помощью дополнительного шилда, подключенного к интерфейсу PCIe 2.0 1x, нетрудно подключить к Repka Pi4 Optimal быстродействующий диск NVMe SSD M.2 (Non-Volatile Memory Express). Интерфейс PCIe 2.0 1x способен очень быстро передавать данные между периферийными устройствами и микрокомпьютером. Скорость передачи данных может достигать 500 MB/s. Вот это и разберём в данной статье.

Помимо дисков NVMe, к этому интерфейсу можно подключить сетевые карты, дополнительные контроллеры для дисков, карты захвата видео и другое оборудование. Можно так же подключать и платы расширения с NPU (аппаратные нейро-ускорители), на момент написания данной статьи нам удалось уже проверить работу платы расширения Hailo 8L (ссылка на Али, если интересно, что за модуль) для Raspberry Pi 5. Вот такой бенчмарк внутри клиентского софта этой платы на модели yolo8s в 4 потока показал скорость 44 fps (!!!!!!!), но об этом расскажем, если будут пожелания в комментариях, в отдельной статье.

Рис. 1.2. NPU от Raspberry Pi 5 на Repka Pi 4 - полёт успешный!
Рис. 1.2. NPU от Raspberry Pi 5 на Repka Pi 4 - полёт успешный!

В этой статье далее расскажем о том, как перенести Repka OS с карты SD на модуль eMMC, подключенный к Repka Pi4 Optimal, а также как подключить дополнительный диск NVMe SSD и сравним производительность дисковых операций со всеми этими системами памяти и диском, просто подключенным к разъему USB микрокомпьютера (ах да, тут, наверное, стоит добавить, что в Repka Pi 4 появился так же USB 3.0).

Установка модуля eMMC на плату Repka Pi4 Optimal

На плате Repka Pi4 Optimal предусмотрены разъем для подключения модуля eMMC, а также разъем PCIe (рис.2).

Рис. 2. Разъемы eMMC и PCIe на плате микрокомпьютера Repka Pi4 Optimal
Рис. 2. Разъемы eMMC и PCIe на плате микрокомпьютера Repka Pi 4 Optimal

Микрокомпьютер Repka Pi 4 Optimal можно приобрести с установленным модулем eMMC или купить это модули отдельно для самостоятельной установки (рис.3).

Рис. 3. Модули eMMC для установки на плату Repka Pi4 Optimal
Рис. 3. Модули eMMC для установки на плату Repka Pi4 Optimal

Перенос Repka OS на модуль eMMC

Итак, вы приобрели Repka Pi4 Optimal с уже установленным модулем eMMC или купили этот модуль отдельно и установили самостоятельно в предназначенный для этого разъем платы микрокомпьютера.

Теперь займемся установкой Repka OS сначала на карту SD, а затем перенесем ее на модуль eMMC.

Скачайте прошивку с сайта Repka. Вам нужен вариант прошивки «Прошивка для печатной платы ver. 1.1 Optimal с максимальной частотой работы процессора 2 ГГц».

Далее с помощью программы balenaEtcher или Rufus запишите образ прошивки на карту SD. Мы использовали карту объемом 32 Гбайт.

Загрузив Repka OS с карты SD, запустите в консольном приглашении команду repka-config, и выберите строку Системные настройки ОС (рис.4).

Рис. 4. Выбор системных настроек ОС
Рис. 4. Выбор системных настроек ОС.

Далее в меню системных настроек выберите строку Копирование ОС с одного накопителя на другой (рис.5).

Рис. 5. Выбор функции копирования ОС
Рис. 5. Выбор функции копирования ОС.

Появится панель, где вам нужно выбрать устройство, на которое будет копироваться образ системы (рис.6).

Рис. 6. Выбор устройства для записи образа системы
Рис. 6. Выбор устройства для записи образа системы.

Здесь вам нужно выбрать устройство /dev/mmcblk1, и воспользоваться кнопкой Ок.

Начнется процесс переноса файлов, на который может уйти несколько минут (рис.7).

Рис. 7. Идет процесс копирования файлов Repka OS
Рис. 7. Идет процесс копирования файлов Repka OS.

После завершения процесса появится сообщение об удачном клонировании (рис.8).

Рис. 8. Сообщение об удачном клонировании Repka OS
Рис. 8. Сообщение об удачном клонировании Repka OS.

Теперь вы можете выйти из программы repka-config. Завершите работу Repka OS, выключите питание микрокомпьютера, а затем удалите карту SD.

Если теперь включить питание Репка-Pi, операционная система Repka OS будет загружена с диска eMMC.

После загрузки Repka OS посмотрите список блочных устройств при помощи команды lsblk:

# lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk1      179:0    0  28,9G  0 disk
└─mmcblk1p1  179:1    0  28,6G  0 part /
mmcblk1boot0 179:32   0     4M  1 disk
mmcblk1boot1 179:64   0     4M  1 disk

Здесь устройство mmcblk1 — это диск eMMC. На нем имеется раздел mmcblk1p1, смонтированный в корневой каталог файловой системы.

Команда df с параметром -h выведет список файловых систем, их размер, сколько на них использовано и сколько свободно места, а также в какие каталоги эти файловые системы смонтированы:

# df -h
Файл.система   Размер Использовано  Дост Использовано% Cмонтировано в
/dev/root         28G         7,3G   20G           28% /
tmpfs            962M            0  962M            0% /dev/shm
tmpfs            385M         1,5M  384M            1% /run
tmpfs            5,0M         4,0K  5,0M            1% /run/lock
tmpfs            962M          16K  962M            1% /tmp
tmpfs            962M            0  962M            0% /var/tmp
tmpfs            193M          92K  193M            1% /run/user/0

В корневой файловой системе диска eMMC доступно 20 Гбайт пространства.

Подключение диска NVMe SSD

Диск NVMe SSD, подключенный к разъему PCIe, расположенному на плате Repka Pi4 Optimal, позволит достичь заметно лучших результатов в тестах производительности.

Прежде всего, вам потребуется один из доступных на Алиэкспресс шилдов. На рис.9 показан такой шилд производства компании Waweshare с установленным на нем диском NVMe SSD объемом 128 Гбайт.

Рис. 9. Шилд компании Waweshare с установленным на нем диском NVMe SSD
Рис. 9. Шилд компании Waweshare с установленным на нем диском NVMe SSD.

Именно такой шилд был использован автором этой статьи для проведения тестов.

Вы также можете подключить к Repka Pi4 Optimal и другие шилды аналогичного назначения (рис.10).

Рис. 10. Различные шилды для подключения NVMe SSD M.2
Рис. 10. Различные шилды для подключения NVMe SSD M.2

Для сравнительных тестов производительности мы будем использовать такой NVMe SSD, как показан на рис.9.

Для подключения диска завершите работу Repka OS и отключите питание Repka Pi4 Optimal.

Далее нужно открыть замок разъема PCIe, потянув вверх за выступающие по бокам края замка (рис.11).

Рис. 11. Замок разъема PCIe в закрытом состоянии.
Рис. 11. Замок разъема PCIe в закрытом состоянии.

На рис.12 показан замок разъема PCIe в открытом состоянии.

Рис. 12. Замок разъема PCIe в открытом состоянии.
Рис. 12. Замок разъема PCIe в открытом состоянии.

Теперь нужно вставить шлейф до упора в разъем (рис.13) и закрыть замок.

Рис. 13. Шлейф шилда вставлен в разъем.
Рис. 13. Шлейф шилда вставлен в разъем.

Аккуратно вставьте разъем шилда в гребенку контактов микроконтроллера и закрепите шилд винтами (рис.14).

Рис. 14. На Repka Pi4 Optimal установлен шилд с диском NVMe.
Рис. 14. На Repka Pi4 Optimal установлен шилд с диском NVMe.

Теперь подключите все необходимые провода и загрузите Repka OS. Если загрузка OS зависла, перезапишите из образа диск SD и загрузитесь уже с него.

Проверим, что вставленный диск NVME определился:

# lspci
00:00.0 PCI bridge: Synopsys, Inc. DWC_usb3 / PCIe bridge (rev 01)
01:00.0 Non-Volatile memory controller: Device 1f40:2263 (rev 03)

Команда lspci выводит на консоль список всех устройств PCI, подключенных к системе. Первая строка сообщает, что был обнаружен мост PCI bridge, а вторая — контроллер памяти, содержимое которой сохраняется при выключении питания.

Также проверьте вывод команды dmesg, отфильтрованный по строке «nvme»:

# dmesg | grep nvme
[    1.019993] sun50i_cpufreq_nvmem: Using CPU speed bin speed0
[    9.532129] nvme nvme0: pci function 0000:01:00.0
[    9.532175] nvme 0000:01:00.0: enabling device (0000 -> 0002)
[    9.535923] nvme nvme0: missing or invalid SUBNQN field.
[    9.545105] nvme nvme0: allocated 64 MiB host memory buffer.
[    9.554550] nvme nvme0: 4/0/0 default/read/poll queues
[    9.561624]  nvme0n1: p1

Строка nvme0n1: p1 означает первый раздел на первом логическом диске, который управляется NVMe-контроллером nvme0.

С помощью команды lsblk вы можете получить информацию о дисках, разделах, точках монтирования и других аспектах блочных устройств:

# lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk1      179:32   0  28,9G  0 disk
mmcblk1boot0 179:64   0     4M  1 disk
mmcblk1boot1 179:96   0     4M  1 disk
nvme0n1      259:0    0 119,2G  0 disk

Здесь обнаружены следующие устройства:

  • mmcblk1 — диск eMMC, установленный на плате Repka Pi4 Optimal;

  • nvme0n1 — диск NVMe

Выявленные особенности и ограничения, которые нужно учитывать при работе

При записи на PCI NVMe SSD M.2 диск мышку, клавиатуру и USB Flash нужно подключать в USB 3.0 (так как порт USB 3.0 на Repka-Pi 4 Optimal один, то через дополнительный внешний хаб), а вот Web-камеры можно оставлять подключенными к USB 2.0 непосредственно на Репке. В анонсированной версии Repka-Pi 4 PRO будут только порты USB 3.0 и, возможно, что таких ограничений при работе с устройствами по PCIe интерфейсу не будет. Но и так, как есть сейчас на Repka-Pi 4 Optimal это небольшая цена за получаемые новые возможности. Судя по отзывам пользователей Raspberry Pi 5, работающих с PCIe, там так же есть свои особенности и ограничения при работе с PCIe.

Итак, диск NVMe подключен к PCIe интерфейсу Repka Pi 4 и всё определяется и работает. Есть смысл сказать о выявленных особенностях и ограничениях при работе с PCIe устройствами на Repka Pi 4 Optimal:

  1. При тестах PCIe на Repka-Pi 4 Optimal замечено, что подключенные в порты USB 2.0 такие устройства, как мышь и клавиатура, могут “отваливаться” одновременно или часть из них, а вот любые устройства подключенные к порту USB3.0 работают стабильно без каких бы то ни было проблем, т.е. не "отваливаются".

  2. При этом такие устройства как Web камеры работали стабильно не зависимо от того, подключены они в USB 2.0 или в USB 3.0. Если в один порт USB 2.0 вставлена камера, а в другой USB2.0 порт мышь или клавиатура, то и камера может “отвалиться”. То есть по какой то причине такой класс устройств как мышь и клавиатура вызывают проблемы в работе порта USB 2.0 и даже в работе других устройств в соседних USB2.0 портах.

  3. Если в порт USB 2.0 вставить флэшку и начать переносить с неё данные на NVMe диск, то возникают сбои, если же флэшку вставить в порт USB 3.0, то всё работает отлично.

  4. Причём это фиксируется только в случаях передачи по PCIe больших объёмов данных и только при записи на NVMe, при чтении с него таких эффектов не замечено.

Обратившись к разработчикам Репки, удалось выяснить, что такая проблема известна и есть даже аналогичное признание проблемы производителем Orange Pi на аналогичном Repka Pi 4 процессоре AllWinner H6.

Скрин документации Orange Pi с описанием аналогичного ограничения на устройстве с аналогичным процессором.
Скрин документации Orange Pi с описанием аналогичного ограничения на устройстве с аналогичным процессором.

Это описывается в документе по работе с Orange Pi 3, его можно посмотреть по ссылке, вот перевод:

При использовании интерфейса PCIE следует учитывать, что если используется интерфейс PCIE, интерфейс USB2.0 использовать нельзя. Если использовать одновременно, это вызовет системную ошибку.

Разработчики Repka Pi так же сообщили, что считают, что проблема может быть связана и как с аппаратной ошибкой контроллера PCIe интерфейса в CPU, и так может быть связана с ошибками в каких то драйверах и что они планируют изучить данный вопрос более детально и в случае, если проблема будет связана с драйверами, то исправят её в драйверах, входящих в состав “родной“ для Репки операционной системы Repka OS.

Чтобы было удобно работать и не сталкиваться с этой проблемой, то лучше всего мышь и клавиатуру включать через USB-хаб в порт USB 3.0, а в порт USB 2.0 подключать Web камеры и/или флэшки. В процессе работы с PCIe на Repka Pi 4 поступил именно так и избавился от данного досадного и мешающего нормальной работе глюка. Надеюсь, что разработчики в ближайшее время в обновлениях операционной системы предоставят патч, исправляющий этот недостаток. Но пока же просто знаем про это (а кто информирован, тот вооружён) и работаем так, как описано выше, чтобы избежать эту накладку.

В бочку мёда ложка дёгтя добавлена :-) и можно смело двигаться дальше и проводить оценку и сравнение производительности в операциях чтения/записи.

Методика сравнения производительности дисков

Мы будем сравнивать скорость чтения и записи, а также определять IOPS для карты SD, дисков eMMC и NVMe, а также флеш-диска, подключенного к порту USB микрокомпьютера. Есть смысл оговориться, что использован eMMC емкостью на 32 Гб и если применять модули большего размера, то скорость чтения и записи будет пропорционально увеличиваться, так как в них применяется параллелизм, так что если Вы проведёте свои тесты на модулях большего размера, то будут отличия в данных.

Подготовка к тестированию

Завершите работу Repka OS, отключите питание и вставьте в разъемы микрокомпьютера карту SD и Flash диск USB (рис.15).

Рис. 15. Дополнительно подключен Flash диск USB.
Рис. 15. Дополнительно подключен Flash диск USB.

После подключения дисков выполните команду lsblk:

# lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda            8:0    1  14,8G  0 disk /media/root/C835-D968
mmcblk0      179:0    0  28,8G  0 disk
└─mmcblk0p1  179:1    0  28,8G  0 part /
mmcblk1      179:32   0  28,9G  0 disk
└─mmcblk1p1  179:33   0  28,6G  0 part
mmcblk1boot0 179:64   0     4M  1 disk
mmcblk1boot1 179:96   0     4M  1 disk
nvme0n1      259:0    0 119,2G  0 disk

Здесь обнаружены следующие устройства:

  • sda — Flash диск, подключенный к USB;

  • mmcblk0 — карта SD;

  • mmcblk1 — диск eMMC;

  • nvme0n1 — диск NVMe

Так как при включении Repka Pi4 Optimal была вставлена карта SD, с нее и произошла загрузка Repka OS.

Для сравнения производительности дисков мы будем использовать команду dd, а также программы hdparm и fio.

Установите необходимые программы:

# apt update
# apt install hdparm

Измерение скорости чтения

Команда dd позволяет измерять скорость чтения и записи при помощи блочных операций. Сначала измерим скорость чтения. Размер блока будет равен 4 Мбайт, количество блоков — 256.

Выдаем по очереди такие команды для всех дисковых устройств, подключенных к микрокомпьютеру:

# dd if=/dev/sda of=/dev/null bs=4M count=256 status=progress
# dd if=/dev/mmcblk0 of=/dev/null bs=4M count=256 status=progress
# dd if=/dev/mmcblk1 of=/dev/null bs=4M count=256 status=progress
# dd if=/dev/nvme0n1 of=/dev/null bs=4M count=256 status=progress

Первая из этих команд читает данные с Flash диска  USB, вторая с карты SD, третья — с диска eMMC, и, наконец третья — с диска NVMe.

Приведем далее данные, полученные для карты SD и для диска NVMe.

Для SD карты:

# dd if=/dev/mmcblk0 of=/dev/null bs=4M count=256 status=progress
1056964608 байт (1,1 GB, 1008 MiB) скопирован, 44 s, 23,9 MB/s
256+0 записей получено
256+0 записей отправлено
1073741824 байт (1,1 GB, 1,0 GiB) скопирован, 44,8734 s, 23,9 MB/s

Для диска NVMe:

# dd if=/dev/nvme0n1 of=/dev/null bs=4M count=256 status=progress
801112064 байт (801 MB, 764 MiB) скопирован, 2 s, 399 MB/s
256+0 записей получено
256+0 записей отправлено
1073741824 байт (1,1 GB, 1,0 GiB) скопирован, 2,67976 s, 401 MB/s

Результат говорит сам за себя! Скорость чтения для карты SD составила 23,9 Мбайт/сек, а для диска NVMe — 401 Мбайт/сек.

В следующем разделе статьи мы приведем полные итоги тестирования.

Другой способ тестирования в режиме чтения основан на использовании программы hdparm:

# hdparm -tT /dev/sda
# hdparm -tT /dev/mmcblk0
# hdparm -tT /dev/mmcblk1
# hdparm -tT /dev/nvme0n1

Здесь параметр t измеряет скорость последовательного чтения, а параметр T — скорость доступа к кэшу.

Проведем измерения для карты SD и диска NVMe.

Для SD карты:

# hdparm -tT /dev/mmcblk0

/dev/mmcblk0:
 Timing cached reads:   1826 MB in  2.00 seconds = 913.20 MB/sec
 Timing buffered disk reads:  68 MB in  3.01 seconds =  22.62 MB/sec
root@Repka-Pi:~# hdparm -tT /dev/nvme0n1

Для диска NVMe:

/dev/nvme0n1:
 Timing cached reads:   1852 MB in  2.00 seconds = 925.34 MB/sec
 Timing buffered disk reads: 1036 MB in  3.01 seconds = 344.74 MB/sec

Как видите, скорость чтения данных из кэша для карты SD составляет 913,20 Мбайт/сек., а скорость чтения данных непосредственно с диска с использованием буферизации намного ниже — 22,62 Мбайт/сек.

Для диска NVMe скорость чтения из кэша увеличилась не намного — до 925,34 Мбайт/сек., а вот скорость чтения данных с диска намного выше — 344,74 Мбайт/сек.

Измерение скорости записи

Мы будем измерять скорость записи в файлы, размещенные на разных дисках. Если в микрокомпьютер вставлена карта SD и Flash диск USB, то будет смонтирован каталог, такой как /media/root/C835-D968, а также корневой каталог карты SD:

# lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda            8:0    1  14,8G  0 disk /media/root/C835-D968
mmcblk0      179:0    0  28,8G  0 disk
└─mmcblk0p1  179:1    0  28,8G  0 part /
mmcblk1      179:32   0  28,9G  0 disk
└─mmcblk1p1  179:33   0  28,6G  0 part
mmcblk1boot0 179:64   0     4M  1 disk
mmcblk1boot1 179:96   0     4M  1 disk
nvme0n1      259:0    0 119,2G  0 disk

Для выполнения тестов на запись нам нужно смонтировать еще диски eMMC и NVMe.

Сначала создайте каталоги /mnt/mmcblk1p1 и /mnt/nvme0n1p1:

# mkdir /mnt/mmcblk1p1
# mkdir /mnt/nvme0n1p1

Создайте раздел nvme0n1p1 на диске nvme0n1, если его нет, с помощью утилиты parted:

# parted /dev/nvme0n1
GNU Parted 3.4
Используется /dev/nvme0n1
Добро пожаловать в GNU Parted! Наберите 'help' для просмотра списка команд.
(parted) mklabel gpt
(parted) mkpart primary ext4 0% 100%
(parted) quit
Информация: Не забудьте обновить /etc/fstab.

Созданный раздел нужно проверить командой fdisk:

# fdisk -l /dev/nvme0n1
Диск /dev/nvme0n1: 119,24 GiB, 128035676160 байт, 250069680 секторов
Disk model: Netac NVMe SSD 128GB
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: gpt
Идентификатор диска: 7189737C-892B-4E78-A1EE-5EB5BE81C068
Устр-во        начало     Конец   Секторы Размер Тип
/dev/nvme0n1p1   2048 250068991 250066944 119,2G Файловая система Linux

Создайте в этом разделе файловую систему:

# mkfs.ext4 /dev/nvme0n1p1

Смонтируйте разделы mmcblk1p1 и nvme0n1p1 в созданные каталоги:

# mount /dev/mmcblk1p1 /mnt/mmcblk1p1
# mount /dev/nvme0n1p1 /mnt/nvme0n1p1

Проверьте, что разделы смонтировались:

# df -h
Файл.система   Размер Использовано  Дост Использовано% Cмонтировано в
/dev/root         29G         6,2G   21G           23% /
tmpfs            962M            0  962M            0% /dev/shm
tmpfs            385M         1,5M  384M            1% /run
tmpfs            5,0M         4,0K  5,0M            1% /run/lock
tmpfs            962M          16K  962M            1% /tmp
tmpfs            962M            0  962M            0% /var/tmp
tmpfs            193M          96K  193M            1% /run/user/0
/dev/sda          15G          60M   15G            1% /media/root/C835-D968
/dev/mmcblk1p1    28G         7,3G   20G           28% /mnt/mmcblk1p1
/dev/nvme0n1p1   117G          24K  111G            1% /mnt/nvme0n1p1

Для того чтобы раздел диска NVMe монтировался автоматически при загрузке ОС, вы можете после завершения тестов и загрузки с диска eMMC добавить следующую запись в конец файла /etc/fstab, например, с помощью редактора vim:

/dev/nvme0n1p1 /mnt/nvme0n1p1 ext4 defaults 0 2

После выполнения всех описанных выше действий по монтированию проверьте точки монтирования командой lsblk:

# lsblk
NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda            8:0    1  14,8G  0 disk /media/root/C835-D968
mmcblk0      179:0    0  28,8G  0 disk
└─mmcblk0p1  179:1    0  28,8G  0 part /
mmcblk1      179:32   0  28,9G  0 disk
└─mmcblk1p1  179:33   0  28,6G  0 part /mnt/mmcblk1p1
mmcblk1boot0 179:64   0     4M  1 disk
mmcblk1boot1 179:96   0     4M  1 disk
nvme0n1      259:0    0 119,2G  0 disk
└─nvme0n1p1  259:2    0 119,2G  0 part /mnt/nvme0n1p1

Чтобы избежать разрушения файловой системы в процессе тестирования на запись, будем создавать временные файлы в этих разделах - при использовании утилиты dd нужно писать в файл, а не просто указать диск, иначе будет повреждена файловая система:

# dd if=/dev/zero of=/media/root/C835-D968/testfile bs=4M count=100 oflag=direct
# dd if=/dev/zero of=/mnt/mmcblk0p1/testfile bs=4M count=100
# dd if=/dev/zero of=/mnt/mmcblk1p1/testfile bs=4M count=100 oflag=direct
# dd if=/dev/zero of=/mnt/nvme0n1p1/testfile bs=4M count=100 oflag=direct

Если измерить скорость записи на карту SD и на диск NVMe, то получим значения 25,4 Мбайт/сек и 352 Мбайт/сек, соответственно:

# dd if=/dev/zero of=/mnt/mmcblk0p1/testfile bs=4M count=100
100+0 записей получено
100+0 записей отправлено
419430400 байт (419 MB, 400 MiB) скопирован, 16,5454 s, 25,4 MB/s

# dd if=/dev/zero of=/mnt/nvme0n1p1/testfile bs=4M count=100 oflag=direct
100+0 записей получено
100+0 записей отправлено
419430400 байт (419 MB, 400 MiB) скопирован, 1,19287 s, 352 MB/s

При тестировании на запись диска eMMC получились такие результаты:

# dd if=/dev/zero of=/mnt/mmcblk1p1/testfile bs=4M count=100
100+0 записей получено
100+0 записей отправлено
419430400 байт (419 MB, 400 MiB) скопирован, 9,58353 s, 43,8 MB/s

Хуже всего получились результаты тестирования Flash диска USB:

# dd if=/dev/zero of=/media/root/C835-D968/testfile bs=4M count=100
100+0 записей получено
100+0 записей отправлено
419430400 байт (419 MB, 400 MiB) скопирован, 30,85 s, 13,6 MB/s

Тестирование ввода-вывода с помощью fio

Утилита fio предназначена для нагрузочного тестирования дисковой подсистемы и может выполнять разнообразные тесты, в т.ч. позволяя проверять не только скорость чтения/записи данных непосредственно для основного носителя данных рассматриваемых устройств, но и в т.ч. скорости чтения/записи для кэша этих устройств, данные по перцентилям латентности, по времени синхронизации и много чего ещё.

Наверное это уже более тонкие и не всем интересные данные и результаты, так что скроем их в элементе “спойлер” ниже, кому будет интересно, можно посмотреть.

Раскрываем, если интересно посмотреть как собрать данные и результаты тестирования с помощью утилиты fio

Установите эту утилиту:

# apt install fio

Запустите из консоли команду тестирования карты SD, с которой мы загрузили Repka OS. Она выведет довольно обширную информацию:

# fio --rw=write --ioengine=sync --fdatasync=1 --directory=/ --size=22m --bs=2300 --name=mytest_mmcblk0p1

mytest_mmcblk0p1: (g=0): rw=write, bs=(R) 2300B-2300B, (W) 2300B-2300B, (T) 2300B-2300B, ioengine=sync, iodepth=1
fio-3.28
Starting 1 process
mytest_mmcblk0p1: Laying out IO file (1 file / 22MiB)
Jobs: 1 (f=1): [W(1)][97.1%][w=664KiB/s][w=296 IOPS][eta 00m:01s]
mytest_mmcblk0p1: (groupid=0, jobs=1): err= 0: pid=3166: Thu Dec  5 14:09:25 2024
  write: IOPS=287, BW=646KiB/s (661kB/s)(22.0MiB/34871msec); 0 zone resets
    clat (usec): min=10, max=678, avg=39.94, stdev=19.36
     lat (usec): min=10, max=678, avg=40.87, stdev=19.41
    clat percentiles (usec):
     |  1.00th=[   23],  5.00th=[   31], 10.00th=[   32], 20.00th=[   32],
     | 30.00th=[   33], 40.00th=[   34], 50.00th=[   35], 60.00th=[   37],
     | 70.00th=[   42], 80.00th=[   46], 90.00th=[   51], 95.00th=[   57],
     | 99.00th=[  151], 99.50th=[  174], 99.90th=[  219], 99.95th=[  231],
     | 99.99th=[  326]
   bw (  KiB/s): min=  570, max=  673, per=100.00%, avg=646.17, stdev=18.91, samples=69
   iops        : min=  254, max=  300, avg=287.96, stdev= 8.45, samples=69
  lat (usec)   : 20=0.97%, 50=86.82%, 100=10.72%, 250=1.47%, 500=0.02%
  lat (usec)   : 750=0.01%
  fsync/fdatasync/sync_file_range:
    sync (usec): min=728, max=46607, avg=3424.35, stdev=2369.13
    sync percentiles (usec):
     |  1.00th=[  824],  5.00th=[  840], 10.00th=[  840], 20.00th=[  865],
     | 30.00th=[ 1385], 40.00th=[ 3556], 50.00th=[ 3621], 60.00th=[ 4113],
     | 70.00th=[ 4146], 80.00th=[ 4490], 90.00th=[ 7242], 95.00th=[ 7308],
     | 99.00th=[ 8094], 99.50th=[11338], 99.90th=[16057], 99.95th=[18220],
     | 99.99th=[36963]
  cpu          : usr=0.58%, sys=4.09%, ctx=21280, majf=0, minf=27
  IO depths    : 1=200.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,10029,0,0 short=10029,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=646KiB/s (661kB/s), 646KiB/s-646KiB/s (661kB/s-661kB/s), io=22.0MiB (23.1MB), run=34871-34871msec

Disk stats (read/write):
  mmcblk0: ios=0/21155, merge=0/11184, ticks=0/32558, in_queue=32558, util=93.69%

Эта команда вывела на консоль основные параметры, данные по перцентилям латентности, по времени синхронизации и много чего еще. Подробнее о формате параметров и выдаче команды вы можете почитать в ее описании.

Чтобы получить метрики всех дисков (SD, eMMC, NVMe и Flash USB)  запустите по очереди команды:

# fio --rw=write --ioengine=sync --fdatasync=1 --directory=/mnt/mmcblk0p1/ --size=22m --bs=2300 --name=mytest
# fio --rw=write --ioengine=sync --fdatasync=1 --directory=/mnt/mmcblk1p1 --size=22m --bs=2300 --name=mytest_mmcblk1p1
# fio --rw=write --ioengine=sync --fdatasync=1 --directory=/mnt/nvme0n1p1 --size=22m --bs=2300 --name=mytest_nvme0n1p1
# fio --rw=write --ioengine=sync --fdatasync=1 --directory=/media/root/C835-D968 --size=22m --bs=2300 --name=mytest_usb

Итоговые результаты тестирования

Далее представлены данные с итогами тестирования дисков, установленных в микрокомпьютере и подключенных к нему, напомним, что это

  • USB Flash,

  • SD карта,

  • eMMC диск и

  • NVMe SSD M.2.

На рис.16 показаны результаты тестирования скорости чтения и записи с помощью команды dd.

Рис.16. Результаты тестирования скорости чтения/записи с помощью команды dd.
Рис.16. Результаты тестирования скорости чтения/записи с помощью команды dd.

Далее идёт результата с помощью утилиты fio, этих данных больше, они более сложные для изучения и как и описание сбора для fio так же скроем результаты в “спойлер“ ниже.

Результаты тестирования утилитой fio

На рис.17 показаны основные метрики, собранные для объема данных 22 Мбайт программой fio.

Рис.17. Метрики, собранные для объема данных 22 Мбайт программой fio.
Рис.17. Метрики, собранные для объема данных 22 Мбайт программой fio.

Как видите, диск eMMC, установленный на плате Repka Pi4 Optimal, показал самые высокие результаты по пропускной способности. Вслед за ним идет диск NVMe, подключенный через интерфейс PCIe.

Что касается IOPS (количество операций ввода/вывода в секунду), тут снова лидирует eMMC, а вслед за ним идет диск NVMe.

Диски SD и диск Flash, подключенный через USB, ожидаемо занимает последние две позиции.

На рис.18 показаны результаты измерений латентности. Это время, затраченное на отправку запроса и выполнение операции диском.

Рис. 18. Латентность.
Рис. 18. Латентность.

Видно, что по параметру максимальной латентности и среднему отклонению латентности первое место занимает диск NVMe. Что же касается диска eMMC, то у него лучше всего средняя латентность.

Карта SD и Flash диск USB сильно уступают по всем параметрам.

На рис.19 приведены перцентили латентности — статистические метрики, показывающие распределение времени выполнения операций ввода-вывода (I/O). На графике не показаны данные по латентности для очень медленного диска Flash USB.

Рис.19. Перцентили латентности.
Рис.19. Перцентили латентности.

По результатам анализа видно, что диски NVMe и eMMC демонстрируют значительно лучшую производительность по сравнению с картой SD и диском Flash USB.

Параметр IOPS на NVMe и eMMC также значительно с SD и тем более, с диском Flash USB.

Также было установлено, что латентность намного ниже для NVMe и eMMC. Перцентили задержки показывают, что большинство операций ввода-вывода выполняются за разумное время, с редкими всплесками задержки.

В целом результаты тестирования с помощью dd коррелируют с результатами измерений программой fio.

Основной результат - по скорости записи в файл и по скорости чтения файла — диск NVMe SSD M.2 показал, как и ожидалось, самые лучшие результаты - и это лучше/быстрее не в разы, а почти ровно на один на порядок (т.е. в 10 раз) лучше, даже чем для eMMC.

А вот что оказалось интересным и весьма неожиданным - запись файла на SD карту проходит немного быстрее, чем запись файла на диск eMMC, а вот чтение файла с диска eMMC ожидаемо в несколько раз быстрее, чем с SD-карты (но тут стоит учитывать, что с увеличением объёмов eMMC дисков, скорость чтения и записи на них возрастает кратно). И ещё любопытными оказались данные по скорости чтения из кэша SD-карты, что показывает, что если SD карты не использовать как хранилища больших данных и не работать на них с БД, то вот для работы с задачами операционной системы они могут справляться вполне успешно.

Выводы

Появление в продаже Российского микрокомпьютера Repka Pi 4 Optimal, способного работать как с диском eMMC, установленном на его плате, так и с дисками NVMe SSD M.2, подключенными через интерфейс PCIe — знаменательное событие.

Теперь можно увеличить скорость и надежность работы микрокомпьютера, переписав образ Repka OS с карты SD на диск eMMC. При этом Repka OS будет загружаться с более надежного в работе диска eMMC.

Подключив быстродействующий диск NVMe, можно не только увеличить объем доступной дисковой памяти, но и повысить скорость работы микрокомпьютера в целом.

Проведенные в ходе работы над этой статьей исследования показали заметное превосходство дисков eMMC и NVMe над картами SD и диском Flash, подключенным к порту USB.

Теперь микрокомпьютер Repka Pi4 Optimal можно использовать даже в качестве десктопа (например для образования, обучения информатике и работе с Linux или для простых офисных задач), а также для создания быстродействующей системы хранения данных.

Учитывая, что Repka Pi4 Optimal внесен в реестр Минпромторга, с дисками eMMC и NVMe он вполне пригоден и для промышленного применения.

Одним словом это оказалось интересной новостью для проектов со встроенным одноплатниками. Так же это явно качественно новый горизонт возможности применения относительно недавно появившихся Российских одноплатников Repka Pi (особенно для новой модели Repka Pi 4 Optimal в сравнении в их первой моделью Repka Pi 3, вышедшей два года назад).

Всем добра и Успехов в проектах!

Эта статья создана на основе материалов статьи "Работа с PCIe на одноплатнике Repka Pi 4. Сравниваем на Repka Pi 4 скорости: SD-карты, eMMC-модуля, внешнего USB Flash-диска и SSD NVME M.2 дисков". В оригинальной статье есть ссылки на используемые при написании платы расширения для слотов M.2 и SSD NVME диски, тут нельзя, правила площадки.

Полезные ссылки

Комментарии (6)


  1. merkel
    14.01.2025 07:39

    Спасибо. Еще один кандидат на хэндмейд-NAS.


    1. copycat11
      14.01.2025 07:39

      со 100-мегабитным ethernet портом.


  1. Kill_Voice
    14.01.2025 07:39

    вполне пригоден и для промышленного применения

    Как-то слабо вяжется с

    При использовании интерфейса PCIE следует учитывать, что если используется интерфейс PCIE, интерфейс USB2.0 использовать нельзя. Если использовать одновременно, это вызовет системную ошибку

    Да и по опыту с платами от Orange это далеко не единственная проблем этого процесса, WiFi там тоже отлетает по любому чиху


    1. RyabovA Автор
      14.01.2025 07:39

      В случае промышленного применения как правило используется в качестве встроенного решения и вообще не подключаются USB 2.0 порты для клавиатуры и мыши, управление и вывод информации как правило идут по SSH, SPI, UAST, I2C. Но если такое промышленное решение, что требуется в процессе работы подключение устройств ввода данных по USB, то вполне нормальное решение с подключение USB 3.0.


  1. Dynasaur
    14.01.2025 07:39

    А с нейроускорителями какими-нибудь тестировали?


    1. RyabovA Автор
      14.01.2025 07:39

      Да, в статье, в начале, указано, что уже проверили работу с Hailo 8L.


      1. Dynasaur
        14.01.2025 07:39

        Да, спасибо, пропустил. Да, да, расскажите в отдельной статье! :-)