Александр Фролов
Александр Фролов
694 просмотров0 комментариев

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

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

Более того, с помощью дополнительного шилда, подключенного к интерфейсу 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 (!!!!!!!), но об этом расскажем, если будут пожелания в комментариях, в отдельной статье.

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

Итак, теперь можно переходить к сути :-)

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

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

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

Перенос 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).

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

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

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

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

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

Теперь вы можете выйти из программы 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 Гбайт.

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

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

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

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

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

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

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

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

Рис. 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

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

  1. При тестах PCIe на Repka-Pi4 замечено, что подключенные в порты USB 2.0 такие устройства, как мышь и клавиатура, могут “отваливаться” одновременно или часть из них, а вот любые устройства подключенные к порту USB3.0 работают стабильно без каких бы то ни было проблем, т.е. не "отваливаются".
  2. При этом такие устройства как Web камеры работали стабильно не зависимо от того, подключены они в USB 2.0 или в USB 3.0. Если в один порт USB 2.0 вставлена камера, а в другой USB2.0 порт мышь или клавиатура, то и камера может “отвалиться”. То есть по какой то причине такой класс устройств как мышь и клавиатура вызывают проблемы в работе порта USB 2.0 и даже в работе других устройств в соседних USB2.0 портах.
  3. Причём это фиксируется только в случаях передачи по PCIe больших данных и только при записи на NVMe, при чтении с него такого эффекта не замечено.

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

Скрин документации 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 микрокомпьютера.

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

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

Рис. 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 Мбайт/сек, а для диска NVMe401 Мбайт/сек.

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

Другой способ тестирования в режиме чтения основан на использовании программы 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.Далее идёт результата с помощью утилиты fio, этих данных больше, они более сложные для изучения и как и описание сбора для fio так же скроем результаты в “спойлер“ ниже.

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

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

Рис.17. Метрики, собранные для объема данных 22 Мбайт программой fio.Как видите, диск eMMC, установленный на плате Repka Pi4 Optimal, показал самые высокие результаты по пропускной способности. Вслед за ним идет диск NVMe, подключенный через интерфейс PCIe.

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

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

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

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

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

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

Рис.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 устройств с разъёмом M.2:

  1. “PCIE M.2 NVME 2280 2230 2242” (на выбор с креплением под разной длинны устройств), ссылка АлиЭкспресс.
  2. Оригинальный адаптер "Raspberry Pi 5 официальная PCIe на M.2 NVMe SSD", ссылка АлиЭкспресс.
  3. Компактный вариант (меньше мешает охлаждению процессора) "Raspberry Pi5 PCIe на M.2 MINI поддержка SSD Gen2 и Gen3 2230 2242 Raspberry Pi 5 NVMe HAT", ссылка АлиЭкспресс.
  4. "Raspberry Pi 5 PCIe на M.2 HAT NVME", ссылка на ссылка АлиЭкспресс.

SSD M.2 MVME диски

Диск размером "2242", идеален для коротких адаптеров, Netac 128 ГБ Внутренний SSD-диск N930ES (N930ES), ссылка на ОЗОН.

Диск размером "2280", подойдет для длинного адаптера, Netac 128 ГБ Внутренний SSD-диск N930E Pro (NT01N930E-128G-E4X), ссылка на ОЗОН и ссылка на Ситилинк.

Применяемая Repka Pi Optimal PCIe

Ссылка на товар в каталоге интернет-магазина производителя.

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


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

Для участия в обсуждении Вы должны быть авторизованным пользователем

Новые посты



Темы

Навигация

ВойтиРегистрация