RISC-V P4

PDF

Постановка задачи

Для выполнения перспективных работ возникла задача проверки работоспособности приложений P4 и компилятора P4C на аппаратной платформе с процессором RISC-V. В качестве платформы была выбрана плата HiFive Unleashed производства компании SiFive. Для этой платформы имеется ряд SDK, основанных на ОС Linux и доступных в исходном коде. После ряда экспериментов было выбрано в качестве основы решение SiFive Freedom Unleashed SDK на основе среды разработки OpenEmbedded (Yocto, OE). Репозиторий исходных кодов включает компоненты, оптимизированные для платы HiFive Unleashed, что позволило сразу же перейти к созданию образа с нужными компонентами P4. Создание и установка базового образа с компонентами P4 были описаны ранее. Здесь же более подробно рассматривается текущее состояние использованных компонент, возникшие проблемы и возможные способы их решения. Сборка образа выполнялась в среде Mageia Linux v7.1.

Набор компонент

Для экспериментов были выбраны модель BMV2 с библиотекой PI и компилятор P4C. Все эти компоненты зависят от библиотеки Judy, поэтому работа началась со сборки этой библиотеки, отсутствующей в репозитории meta-sifive.

Библиотека Judy

Judy представляет собой библиотеку функций C для работы с динамическими массивами. Эти функции широко используются компонентами и приложениями P4. После загрузки исходного кода было создано задание для сборки пакета в системе OE. Настройка конфигурации для сборки проблем не вызвала, но при компиляции возникли ошибки.

В процессе компиляции пакета создаются два исполняемых файла (JudyLTablesGen и Judy1TablesGen), которые запускаются для генерации таблиц (файлы C), применяемых далее в процессе компиляции. Проблема заключается в том, что создаются исполняемые файлы для процессора RISC-V, а запускаются они в среде кросс-компиляции и, естественно, не могут работать. Эта проблема известна уже давно (см., например, https://sourceforge.net/p/judy/bugs/21/ и https://www.linuxquestions.org/questions/linux-software-2/cross-compiling-libjudy-608455/), но решения найти не удалось, поэтому был выбран другой подход, представляющийся более реальным.

Библиотека была собрана непосредственно на платформе HiFive Unleashed1 и созданные таблицы были перенесены в среду кросс-компиляции, а запуск программ генерации таблиц был исключен из соответствующих файлов Makefile. Собранная в результате библиотека Judy работает при загрузке образа на платформе HiFive Unleashed.

Недостатком решения является необходимость повторения переноса файлов и правки Makefile при каждом изменении конфигурации Judy. Но в любом случае это многократно быстрее повторения сборки непосредственно на платформе.

Библиотека PI

PI представляет собой набор API (исходный код) для взаимодействия с объектами, определенными в программах P4 (таблицы, счетчики, измерители). Для сборки и работы требуется выполнить ряд зависимостей, включая пакет behavioral-model (bmv2). Но для сборки этого пакета требуется наличие PI. В результате образуется циклическая зависимость, которая не позволяет собрать пакеты в среде OE. Приходиться отказаться от поддержки BMV2. Остальная часть настройки и сборки проходит без проблем и пакет удается включить в образ.

Пакет BMV2

Этот пакет (исходный код) включает прототипы коммутаторов и маршрутизатора, работающих на основе кода P4. Некоторые фрагменты кода P4 представлены в примерах. Настройка и сборка пакета серьезных проблем не вызвали, пока не была предпринята попытка включить библиотеку Apache Thrift, без которой собирались лишь библиотеки, но не исполняемые программы (simple_switch и др.), что нас явно не устроило.

Когда была включена опция работы с Thrift2, настройка конфигурации для сборки завершалась ошибкой.

| checking dynamic linker characteristics... (cached) GNU/Linux ld.so 
| checking how to hardcode library paths into programs... immediate 
| checking whether riscv64-oe-linux-g++    -fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+
gitAUTOINC+9a331b900c-r0/recipe-sysroot supports C++11 features by default... yes 
| checking for thrift... no 
| checking thrift/Thrift.h usability... no 
| checking thrift/Thrift.h presence... no 
| checking for thrift/Thrift.h... no 
| configure: error: Thrift headers not found. Install Thrift from http://thrift.apache.org/docs/install/ 
| WARNING: /OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+gitAUTOINC+9a331b900c-r0/temp/run.do_configure.3659:1 exit 1 from 'exit 1' 
ERROR: Task (/OE/sifive-new/meta-poPingUI/recipes-p4/bm/bm_git.bb:do_configure) failed with exit code '1'

Явное добавление в файл задания зависимости от thrift и thrift-native проблему не решило.

| checking for thrift... /OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+gitAUTOINC+9a331b900c-r0/recipe-sysroot-native/usr/bin/thrift 
| checking thrift/Thrift.h usability... yes 
| checking thrift/Thrift.h presence... yes 
| checking for thrift/Thrift.h... yes 
| checking thrift/stdcxx.h usability... no 
| checking thrift/stdcxx.h presence... no 
| checking for thrift/stdcxx.h... no 
| checking for thrift version... configure: error: in `/OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+gitAUTOINC+9a331b900c-r0/build': 
| configure: error: cannot run test program while cross compiling 
| See `config.log' for more details 
| WARNING: /OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+gitAUTOINC+9a331b900c-r0/temp/run.do_configure.9810:1 exit 1 from 'exit 1'

При просмотре журнала настройки конфигурации сборки (config.log) подтвердилось, что кросс-компиляция пакета не поддерживается.

configure:16615: error: cannot run test program while cross compiling

Таким образом, создание полноценного пакета BMV2 в среде кросс-компиляции оказалось невозможным и остается лишь собирать пакет непосредственно на платформе HiFive Unleashed.

Компилятор P4C

Пакет P4C представляет собой прототип компилятора, поддерживаюзий спецификации P414 и P416. При попытке собрать пакет в кросс-среде OE возникли проблемы, аналогичные ситуации с библиотеков Judy, описанной выше. Здесь также генерируется ряд файлов исходного кода с помощью созданной в процессе компиляции программы. Путем переноса файлов, созданных при сборке на платформе HiFive Unleashed и исключения одной строки из файла build.ninja, управляющего сборкой, проблему удалось решить.

Заключение

Проведенные эксперименты показывают, что собрать образ Linux для платы HiFive Unleashed (это справедливо и для других плат) с поддержкой P4 в среде кросс-компиляции OpenEmbedded на сегодняшний день не представляется возможным. Для решения этой задачи требуется внести достаточно серьезные изменения в исходный код ряда компонент и библиотек.

Работа выполнена в рамках проекта «Орион».

Николай Малых

nmalykh@protocols.ru

1Может возникнуть резонный вопрос — почему не собрать все компоненты непосредственно на платформе, коль скоро имеется набор инструментальных средств. Ответ достаточно прост и безрадостен — сборка P4C на платформе занимает больше 10 часов, поэтому оказалось проще перенести файлы в среду сборки, где производительность во много раз выше.

2Она включена по умолчанию и для отключения нужна опция —without-thrift.




SiFive-OE-poPingUI-P4

PDF

Для экспериментов с применением языка P4 (p4.org) в сетевых устройствах была предпринята попытка сборки прототипа компилятора P4C на платформе HiFive Unleashed U540 компании SiFive. В качестве среды разработки использовалась система OpenEmbedded (www.yoctoproject.org) и базовый репозиторий SiFive (github.com/sifive/meta-sifive/tree/master). Для работы также требуется пакет repo, установка которого описана по ссылке.

Для сборки образов потребуется достаточно большое пространство на диске (после сборки образа на диске было занято 94 Гбайт), а сам диск должен быть быстрым (SSD или SAS).

  1. Создаем пустой каталог и переходим в него

    mkdir sifive-master
    cd sifive-master

    Далее в тексте этот каталог будет именоваться корневым и все ссылки на каталоги и файлы будут отсчитываться от него.

  2. Создаем и заполняем репозиторий

    $ repo init -u git://github.com/sifive/meta-sifive -b master -m tools/manifests/sifive.xml
    $ repo sync
  3. Создаем уровень meta-poPingUI

    $ bitbake-layers create-layer meta-poPingUI
    NOTE: Starting bitbake server... 
    Add your new layer with 'bitbake-layers add-layer meta-poPingUI'
    $ bitbake-layers add-layer meta-poPingUI
    NOTE: Starting bitbake server... 
    Unable to find bblayers.conf
  4. Копируем файл установки окружения из каталога meta-sifive

    $ cp meta-sifive/setup.sh meta-poPingUI/setup.sh
  5. Редактируем созданную копию, добавляя строку

    $ bitbake-layers add-layer ../meta-poPingUI
  6. Из строки DISTRO_FEATURES_append = » largefile opengl ptest multiarch pam systemd vulkan » удаляем opengl и vulkan и получаем в результате

    DISTRO_FEATURES_append = " largefile ptest multiarch pam systemd "
  7. В начале файла меняем имя создаваемого образа, как показано ниже

    BITBAKEIMAGE="coreip-cli"
  8. В конце файла помещаем символ комментария в показанные ниже строки

    # Add r600 drivers for AMD GPU 
    #PACKAGECONFIG_append_pn-mesa = " r600" 
    
    # Add support for modern AMD GPU (e.g. RX550 / POLARIS) 
    #PACKAGECONFIG_append_pn-mesa = " radeonsi" 
    #PACKAGECONFIG_append_pn-mesa = " gallium-llvm"
  9. Копируем каталог meta-sifive/conf в meta-poPingUI/conf

  10. Редактируем файл meta-poPingUI/conf/layer.conf, заменяя sifive на poPingUI, а также устанавливаем для уровня высокий приоритет, чтобы при совпадении имен задания выбирались из нашего уровня

    BBFILE_PRIORITY_meta-poPingUI = "9"
  11. Копируем каталог meta-sifive/recipes-sifive/images в meta-poPingUI/recipes-poPingUI/images

    Поскольку планируется работа лишь с платой HiFive без модулей расширения удаляем файлы с поддержкой графического интерфейса (demo-coreip-xfce4.bb и demo-coreip-xfce4-debug.bb), а файлы demo-coreip-cli.bb и demo-coreip-cli-debug.bb переименовываем в coreip-cli.bb и coreip-cli-debug.bb. Это позволит избежать путаницы и при необходимости воспользоваться образами уровня meta-sifive.

  12. Переходим в корневой каталог репозитория и вводим команду

    $ . ./meta-poPingUI/setup.sh
    Init OE 
    You had no conf/local.conf file. This configuration file has therefore been 
    created for you with some default values. You may wish to edit it to, for 
    example, select a different MACHINE (target hardware). See conf/local.conf 
    for more information as common configuration options are commented. 
    
    You had no conf/bblayers.conf file. This configuration file has therefore been 
    created for you with some default values. To add additional metadata layers 
    into your configuration please add entries to conf/bblayers.conf. 
    
    The Yocto Project has extensive documentation about OE including a reference 
    manual which can be found at: 
       http://yoctoproject.org/documentation 
    
    For more information about OpenEmbedded see their website: 
       http://www.openembedded.org/ 
    
    
    ### Shell environment set up for builds. ### 
    
    You can now run 'bitbake <target>' 
    
    Common targets are: 
       core-image-minimal 
       core-image-sato 
       meta-toolchain 
       meta-ide-support 
    
    You can also run generated qemu images with a command like 'runqemu qemux86'. 
    
    Other commonly useful commands are: 
    - 'devtool' and 'recipetool' handle common recipe tasks 
    - 'bitbake-layers' handles common layer tasks 
    - 'oe-pkgdata-util' handles common target package tasks 
    Adding layers 
    NOTE: Starting bitbake server... 
    NOTE: Starting bitbake server... 
    NOTE: Starting bitbake server... 
    NOTE: Starting bitbake server... 
    NOTE: Starting bitbake server... 
    NOTE: Starting bitbake server... 
    NOTE: Starting bitbake server... 
    NOTE: Starting bitbake server... 
    NOTE: Starting bitbake server... 
    Creating auto.conf 
    --------------------------------------------------- 
    MACHINE=freedom-u540 bitbake coreip-cli 
    --------------------------------------------------- 
    
    Buildable machine info 
    --------------------------------------------------- 
    * freedom-u540: The SiFive HiFive Unleashed board 
    * qemuriscv64: The 64-bit RISC-V machine 
    --------------------------------------------------- 
    
  13. Запускаем сборку образа командой

    $ MACHINE=freedom-u540 bitbake coreip-cli
    Parsing recipes: 100% |#############################################################################################################################################################################| Time: 0:00:18 
    Parsing of 2346 .bb files complete (0 cached, 2346 parsed). 3445 targets, 174 skipped, 0 masked, 0 errors. 
    NOTE: Resolving any missing task queue dependencies 
    
    Build Configuration: 
    BB_VERSION           = "1.46.0" 
    BUILD_SYS            = "x86_64-linux" 
    NATIVELSBSTRING      = "mageia-7" 
    TARGET_SYS           = "riscv64-oe-linux" 
    MACHINE              = "freedom-u540" 
    DISTRO               = "nodistro" 
    DISTRO_VERSION       = "nodistro.0" 
    TUNE_FEATURES        = "riscv64" 
    meta                 = "HEAD:57ccf1e3bb320bd28a2d106c98f4706434c3075a" 
    meta-oe               
    meta-python           
    meta-multimedia       
    meta-networking       
    meta-gnome            
    meta-xfce            = "HEAD:920161113533074d27dc93c521815380fdf20275" 
    meta-riscv           = "HEAD:8bd3402c76f897189842f65e521f1388777660ca" 
    meta-sifive          = "HEAD:4c97a625e70558fbca9dc210616b13115e22dbee" 
    meta-poPingUI        = "<unknown>:<unknown>"
    
    
  14. Процесс загрузки исходных кодов1 и сборки компонент достаточно долог и можно заняться другими делами. В моей системе Mageia 7.1 процесс завершается ошибкой

    virtual:native:/OE/sifive-master/openembedded-core/meta/recipes-devtools/perl/libxml-parser-perl_2.46.bb:do_configure

    Для решения этой проблемы создаем в каталоге уровня файл meta-poPingUI/recipes-devtools/libxml-parser-perl/libxml-parser-perl_2.46.bbappend, показанный ниже

    do_configure_prepend_class-native () { 
       cd ${S} 
       ${HOSTTOOLS_DIR}/perl Makefile.PL 
       cd - 
    }
  15. Проблема с networkmanager решается командой LC_ALL=C ../recipe-sysroot-native/usr/bin/intltool-merge -x -u -c ./po/.intltool-merge-cache ../NetworkManager-1.22.10/po data/org.freedesktop.NetworkManager.policy.in data/org.freedesktop.NetworkManager.policy из каталога build/tmp-glibc/work/riscv64-oe-linux/networkmanager/1.22.10-r0/build и создания символьной ссылки /usr/bin/nativeperl на локальный перл хоста2

  16. На этом первичные правки завершаются и образ собирается нормально. Можно начинать внесение своих правок.

  17. Сначала добавим Judy, поскольку от этого пакета зависит p4c и связанные пакеты.

    $ devtool add https://github.com/multiSnow/judy.git
    $ bitbake judy

    Процесс завершается ошибкой /lib/ld-linux-riscv64-lp64d.so.1: No such file or directory. Это связано с попыткой запуска двоичного файла генерации таблиц, собранного для RISCV, из среды сборки x86. Найти способ обхода этой проблемы мне не удалось, поэтому были просто взяты файлы, созданные на платформе HiFive Unleashed, и помещены в каталоги исходного кода judy. При этом запуск программы генерации (JudyLTablesGen и Judy1TablesGen) из Makefile был удален путем простого редактирования.

    Копируем файл JudyLTables.c в каталог build/tmp-glibc/work/riscv64-oe-linux/judy/1.0.5+git999-r0/judy-1.0.5+git999/src/JudyL и удаляем конец строки 7953 ./JudyLTablesGen. Затем повторяем команду bitbake judy и выполняем аналогичные процедуры в каталоге Judy1 с файлом Judy1Tables.c. Следующий запуск команды bitbake judy обеспечивает сборку пакета без ошибок.

  18. Добавляем созданное задание на уровень meta-poPingUI командой

    $ devtool finish -f judy meta-poPingUI/recipes-devtools

    из корневого каталога системы сборки. В результате готовое задание помещается на нужный уровень в каталог recipes-devtools. После этого следует повторить сборку задания, поскольку при переносе внесенные изменения теряются (см. 14). Операции выполняются с файлами в каталоге build/tmp-glibc/work/riscv64-oe-linux/judy/1.0.5+gitAUTOINC+a5971f3ee4-r0/build/src.

  19. Следующим добавляем пакет PI

    $ devtool add https://github.com/p4lang/PI.git

    В файле задания pi_git.bb меняем строку DEPENDS, как показано ниже

    DEPENDS = "readline judy nanomsg protobuf protobuf-c"
    

    И добавляем опции настройки

    EXTRA_OECONF = " --with-fe-cpp --with-proto=Protobuf --with-internal-rpc --with-cli "

    Между пакетами PI и bmv2 имеются циклические зависимости, поэтому PI придется собрать дважды без поддержки bmv2 (без опции —with-bmv2). Включаем задание на уровень meta-poPingUI командами из корневого каталога

    $ mkdir meta-poPingUI/recipes-p4
    $ devtool finish pi meta-poPingUI/recipes-p4
    $ bitbake pi
    
  20. Затем добавляем пакет bmv2 (behavioral model version 2), содержащий прототип коммутатора P4.

    $ devtool add https://github.com/p4lang/behavioral-model.git

    Система сборки создает для него задание с именем bm. Редактируем в файле задания bm_git.bb приведенные ниже строки

    DEPENDS = "gmp judy nanomsg libpcap pi boost"
    EXTRA_OECONF = " --with-nanomsg --with-pi --enable-modules --disable-dependency-tracking --without-thrift "
    

    Затем переносим задание на уровень meta-poPingUI командой из корневого каталога

    $ devtool finish bm meta-poPingUI/recipes-p4
  21. Начинаем сборку компилятора P4C

    $ devtool add https://github.com/p4lang/p4c.git

    Файл задания корректируем как показано ниже

    DEPENDS = "flex-native bison-native boost protobuf protobuf-native protobuf-c protobuf-c-native doxygen bm bdwgc gmp judy" 
    EXTRA_OECMAKE = "-DENABLE_GC=OFF -DENABLE_EBPF=OFF -DENABLE_PROTOBUF_STATIC=OFF "

    Сборка завершается ошибкой, связанной с запуском исполняемого файла RISCV (tools/irgenerator) в среде сборки x86. Для решения проблемы помещаем символ комментария в начало строки с вызовом команды irgenerator (строка 3194) в файле build.ninja каталога build/workspace/sources/p4c/oe-workdir/p4c-1.0+git999. Затем нужно скопировать в каталог build/workspace/sources/p4c/oe-workdir/p4c-1.0+git999/ir заранее подготовленные на целевой платформе файлы, перечисленные ниже

    gen-tree-macro.h 
    gen-tree-macro.h.fixup 
    gen-tree-macro.h.tmp 
    ir-generated.cpp 
    ir-generated.cpp.fixup 
    ir-generated.cpp.tmp 
    ir-generated.h 
    ir-generated.h.fixup 
    ir-generated.h.tmp 
    libir.a

    Копируем задание на уровень meta-poPingUI командой из корневого каталога

    $ devtool finish bm meta-poPingUI/recipes-p4

    После чего повторяем сборку и после получения ошибки внесим описанные выше правки в каталоге build/tmp-glibc/work/riscv64-oe-linux/p4c/1.0+gitAUTOINC+f79af56ea9-r0/build и еще раз собираем пакет командой

    $ bitbake p4c
  22. Сборка завершается без ошибок и можно внести задание в образ, редактируя файл meta-poPingUI/recipes-poPingUI/images/coreip-cli.bb. Для этого добавляем строку в конце переменной IMAGE_INSTALL, как показано ниже

       p4c \ 
       ${CORE_IMAGE_EXTRA_INSTALL} \ 
       " 
    
    IMAGE_INSTALL_append_freedom-u540 = "\ 
       unleashed-udev-rules \ 
       "
  23. Далее создаем образ командой

    $ MACHINE=freedom-u540 bitbake coreip-cli

    и по завершении его создания переносим на SD-карту командой

    $ zcat build/tmp-glibc/deploy/images/freedom-u540/coreip-cli-freedom-u540.wic.gz | sudo dd of=/dev/sdX bs=512K iflag=fullblock oflag=direct conv=fsync status=progress

    где sdX — имя устройства (SD-карта).

  24. По завершении записи можно отмонтировать SD-карту и перенести ее на плату HiFive Unleased. Для входа в систему служит имя пользователя root с паролем sifive.

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

Работа выполнена в рамках проекта «Орион».


Николай Малых

nmalykh@protocols.ru


1Время от времени при загрузке кода могут возникать ошибки, связанные с недоступностью сетевых ресурсов Internet. В таких случаях следует просто повторить команду.

2Попытка выполнить команду из файла дополнения дает ошибку «You must have XML::Parser installed to run ../recipe-sysroot-native/usr/bin/intltool-merge». Добавление зависимостей проблему не решает.

3Номер строки может отличаться, поэтому лучше воспользоваться контекстным поиском в файле.

4Можно найти строку по контексту Generating IR class files. Искомая строка будет предыдущей.




Измерение производительности для трафика UDP

PDF

В прошлой публикации было рассмотрено измерение производительности сетевых операций для платы HiFive Unleashed с операционной системой Linux на базе ядра 5.2.9 с помощью программы iperf3 и заданного по умолчанию протокола TCP. Измерения показали, что скорость сетевого обмена в значительной мере определяется не возможностями платы и ядра Linux, а параметрами управления потоком данных в реализации протокола TCP. Поскольку для нас основной интерес представляют возможности процессоров Freedom U540, установленных на плате HiFive Unleashed и собранного специально для этой платы ядра Linux 5.2.9, было принято решение провести измерения скорости сетевого обмена по протоколу UDP.

В этом случае активного сетевого обмена между участвующими в тесте хостами не происходит. Хост-клиент генерирует трафик UDP с заданной в командной строке скоростью, а хост-сервер определяет скорость получения пакетов, а также число потерянных пакетов и по завершению каждого теста передает результаты клиенту по протоколу TCP. Трафик TCP невелик и существенного влияния на измерение производительности не оказывает.

В тесте применялась плата HiFive Unleashed с ОС Linux на базе специально собранного ядра версии 5.2.9 и хост x86_64 с двумя процессорами Xeon (суммарно 40 ядер). Сначала измерения проводились с клиентом HiFive и сервером x86_64, затем хосты менялись ролями

Клиент HiFive

Принятая по умолчанию скорость (1 Мбит/с)

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 52003 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   1.00-2.00   sec   127 KBytes  1.04 Mbits/sec  90   
[  5]   2.00-3.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   3.00-4.00   sec   127 KBytes  1.04 Mbits/sec  90   
[  5]   4.00-5.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   5.00-6.00   sec   127 KBytes  1.04 Mbits/sec  90   
[  5]   6.00-7.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   7.00-8.00   sec   127 KBytes  1.04 Mbits/sec  90   
[  5]   8.00-9.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   9.00-10.00  sec   127 KBytes  1.04 Mbits/sec  90   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  1.25 MBytes  1.05 Mbits/sec  0.000 ms  0/905 (0%)  sender 
[  5]   0.00-10.00  sec  1.25 MBytes  1.05 Mbits/sec  0.014 ms  0/905 (0%)  receiver 

iperf Done.

2 Мбит/с

Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 45936 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   1.00-2.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   2.00-3.00   sec   243 KBytes  1.99 Mbits/sec  172   
[  5]   3.00-4.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   4.00-5.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   5.00-6.00   sec   243 KBytes  1.99 Mbits/sec  172   
[  5]   6.00-7.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   7.00-8.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   8.00-9.00   sec   243 KBytes  1.99 Mbits/sec  172   
[  5]   9.00-10.00  sec   245 KBytes  2.00 Mbits/sec  173   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  2.38 MBytes  2.00 Mbits/sec  0.000 ms  0/1727 (0%)  sender 
[  5]   0.00-10.00  sec  2.38 MBytes  2.00 Mbits/sec  0.019 ms  0/1727 (0%)  receiver 

iperf Done.

4 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 4M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 42367 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec   488 KBytes  3.99 Mbits/sec  345   
[  5]   1.00-2.00   sec   489 KBytes  4.01 Mbits/sec  346   
[  5]   2.00-3.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   3.00-4.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   4.00-5.00   sec   489 KBytes  4.01 Mbits/sec  346   
[  5]   5.00-6.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   6.00-7.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   7.00-8.00   sec   489 KBytes  4.01 Mbits/sec  346   
[  5]   8.00-9.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   9.00-10.00  sec   488 KBytes  4.00 Mbits/sec  345   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  4.77 MBytes  4.00 Mbits/sec  0.000 ms  0/3453 (0%)  sender 
[  5]   0.00-10.00  sec  4.77 MBytes  4.00 Mbits/sec  0.029 ms  0/3453 (0%)  receiver 

iperf Done.

8 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 8M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 41812 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec   976 KBytes  7.98 Mbits/sec  690   
[  5]   1.00-2.00   sec   976 KBytes  7.99 Mbits/sec  690   
[  5]   2.00-3.00   sec   977 KBytes  8.00 Mbits/sec  691   
[  5]   3.00-4.00   sec   976 KBytes  7.99 Mbits/sec  690   
[  5]   4.00-5.00   sec   977 KBytes  8.00 Mbits/sec  691   
[  5]   5.00-6.00   sec   977 KBytes  8.00 Mbits/sec  691   
[  5]   6.00-7.00   sec   976 KBytes  7.99 Mbits/sec  690   
[  5]   7.00-8.00   sec   977 KBytes  8.00 Mbits/sec  691   
[  5]   8.00-9.00   sec   976 KBytes  7.99 Mbits/sec  690   
[  5]   9.00-10.00  sec   977 KBytes  8.00 Mbits/sec  691   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  9.54 MBytes  8.00 Mbits/sec  0.000 ms  0/6905 (0%)  sender 
[  5]   0.00-10.00  sec  9.54 MBytes  8.00 Mbits/sec  0.063 ms  0/6905 (0%)  receiver 

iperf Done.

16 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 16M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 52891 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  1.90 MBytes  15.9 Mbits/sec  1377   
[  5]   1.00-2.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   2.00-3.00   sec  1.91 MBytes  16.0 Mbits/sec  1382   
[  5]   3.00-4.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   4.00-5.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   5.00-6.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   6.00-7.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   7.00-8.00   sec  1.91 MBytes  16.0 Mbits/sec  1382   
[  5]   8.00-9.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   9.00-10.00  sec  1.91 MBytes  16.0 Mbits/sec  1381   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  19.1 MBytes  16.0 Mbits/sec  0.000 ms  0/13808 (0%)  sender 
[  5]   0.00-10.00  sec  19.1 MBytes  16.0 Mbits/sec  0.074 ms  0/13808 (0%)  receiver 

iperf Done.

32 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 32M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 34927 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  3.81 MBytes  31.9 Mbits/sec  2760   
[  5]   1.00-2.00   sec  3.81 MBytes  32.0 Mbits/sec  2762   
[  5]   2.00-3.00   sec  3.82 MBytes  32.0 Mbits/sec  2763   
[  5]   3.00-4.00   sec  3.81 MBytes  32.0 Mbits/sec  2762   
[  5]   4.00-5.00   sec  3.82 MBytes  32.0 Mbits/sec  2763   
[  5]   5.00-6.00   sec  3.82 MBytes  32.0 Mbits/sec  2763   
[  5]   6.00-7.00   sec  3.81 MBytes  32.0 Mbits/sec  2762   
[  5]   7.00-8.00   sec  3.81 MBytes  32.0 Mbits/sec  2762   
[  5]   8.00-9.00   sec  3.82 MBytes  32.0 Mbits/sec  2763   
[  5]   9.00-10.00  sec  3.81 MBytes  32.0 Mbits/sec  2761   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  38.1 MBytes  32.0 Mbits/sec  0.000 ms  0/27621 (0%)  sender 
[  5]   0.00-10.00  sec  38.1 MBytes  32.0 Mbits/sec  0.060 ms  0/27621 (0%)  receiver 

iperf Done.

64 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 64M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 39289 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  7.62 MBytes  63.9 Mbits/sec  5516   
[  5]   1.00-2.00   sec  7.62 MBytes  64.0 Mbits/sec  5521   
[  5]   2.00-3.00   sec  7.62 MBytes  63.9 Mbits/sec  5516   
[  5]   3.00-4.00   sec  7.65 MBytes  64.1 Mbits/sec  5538   
[  5]   4.00-5.00   sec  7.64 MBytes  64.1 Mbits/sec  5531   
[  5]   5.00-6.00   sec  7.63 MBytes  64.0 Mbits/sec  5522   
[  5]   6.00-7.00   sec  7.62 MBytes  64.0 Mbits/sec  5521   
[  5]   7.00-8.00   sec  7.64 MBytes  64.1 Mbits/sec  5532   
[  5]   8.00-9.00   sec  7.61 MBytes  63.8 Mbits/sec  5509   
[  5]   9.00-10.00  sec  7.65 MBytes  63.9 Mbits/sec  5539   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  76.3 MBytes  64.0 Mbits/sec  0.000 ms  0/55245 (0%)  sender 
[  5]   0.00-10.00  sec  76.3 MBytes  64.0 Mbits/sec  0.073 ms  0/55245 (0%)  receiver 

iperf Done.

128 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 128M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 49324 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  10.6 MBytes  88.6 Mbits/sec  7650   
[  5]   1.00-2.00   sec  10.6 MBytes  88.7 Mbits/sec  7658   
[  5]   2.00-3.00   sec  10.6 MBytes  89.1 Mbits/sec  7689   
[  5]   3.00-4.00   sec  10.6 MBytes  88.6 Mbits/sec  7645   
[  5]   4.00-5.00   sec  10.5 MBytes  88.3 Mbits/sec  7623   
[  5]   5.00-6.00   sec  10.5 MBytes  87.9 Mbits/sec  7590   
[  5]   6.00-7.00   sec  10.4 MBytes  87.6 Mbits/sec  7563   
[  5]   7.00-8.00   sec  10.4 MBytes  87.4 Mbits/sec  7549   
[  5]   8.00-9.00   sec  10.7 MBytes  90.0 Mbits/sec  7766   
[  5]   9.00-10.00  sec  10.7 MBytes  90.0 Mbits/sec  7771   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec   106 MBytes  88.6 Mbits/sec  0.000 ms  0/76504 (0%)  sender 
[  5]   0.00-10.00  sec   106 MBytes  88.6 Mbits/sec  0.077 ms  0/76504 (0%)  receiver 

iperf Done.

256 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 256M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 50317 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  10.6 MBytes  88.6 Mbits/sec  7650   
[  5]   1.00-2.00   sec  10.6 MBytes  88.7 Mbits/sec  7660   
[  5]   2.00-3.00   sec  10.6 MBytes  88.9 Mbits/sec  7676   
[  5]   3.00-4.00   sec  10.7 MBytes  89.4 Mbits/sec  7718   
[  5]   4.00-5.00   sec  10.6 MBytes  89.0 Mbits/sec  7687   
[  5]   5.00-6.00   sec  10.6 MBytes  88.9 Mbits/sec  7673   
[  5]   6.00-7.00   sec  10.6 MBytes  88.9 Mbits/sec  7678   
[  5]   7.00-8.00   sec  10.7 MBytes  89.8 Mbits/sec  7752   
[  5]   8.00-9.00   sec  10.7 MBytes  89.7 Mbits/sec  7741   
[  5]   9.00-10.00  sec  10.7 MBytes  89.5 Mbits/sec  7725   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec   106 MBytes  89.1 Mbits/sec  0.000 ms  0/76960 (0%)  sender 
[  5]   0.00-10.00  sec   106 MBytes  89.1 Mbits/sec  0.083 ms  0/76960 (0%)  receiver 

iperf Done.

512 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 512M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 44858 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  8.35 MBytes  70.0 Mbits/sec  6046   
[  5]   1.00-2.00   sec  8.50 MBytes  71.3 Mbits/sec  6152   
[  5]   2.00-3.00   sec  8.45 MBytes  70.9 Mbits/sec  6122   
[  5]   3.00-4.00   sec  7.75 MBytes  65.0 Mbits/sec  5615   
[  5]   4.00-5.00   sec  7.66 MBytes  64.3 Mbits/sec  5548   
[  5]   5.00-6.00   sec  7.64 MBytes  64.1 Mbits/sec  5530   
[  5]   6.00-7.00   sec  7.62 MBytes  63.9 Mbits/sec  5517   
[  5]   7.00-8.00   sec  7.77 MBytes  65.2 Mbits/sec  5627   
[  5]   8.00-9.00   sec  7.77 MBytes  65.1 Mbits/sec  5624   
[  5]   9.00-10.00  sec  7.72 MBytes  64.8 Mbits/sec  5594   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  79.2 MBytes  66.5 Mbits/sec  0.000 ms  0/57375 (0%)  sender 
[  5]   0.00-10.00  sec  79.2 MBytes  66.5 Mbits/sec  0.021 ms  0/57375 (0%)  receiver 

iperf Done.

1000 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 1000M  
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 56734 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  7.69 MBytes  64.5 Mbits/sec  5571   
[  5]   1.00-2.00   sec  7.69 MBytes  64.5 Mbits/sec  5570   
[  5]   2.00-3.00   sec  7.69 MBytes  64.6 Mbits/sec  5572   
[  5]   3.00-4.00   sec  7.67 MBytes  64.3 Mbits/sec  5554   
[  5]   4.00-5.00   sec  7.67 MBytes  64.3 Mbits/sec  5555   
[  5]   5.00-6.00   sec  7.63 MBytes  64.0 Mbits/sec  5527   
[  5]   6.00-7.00   sec  7.62 MBytes  63.9 Mbits/sec  5520   
[  5]   7.00-8.00   sec  7.68 MBytes  64.5 Mbits/sec  5565   
[  5]   8.00-9.00   sec  7.65 MBytes  64.2 Mbits/sec  5540   
[  5]   9.00-10.00  sec  7.63 MBytes  64.0 Mbits/sec  5522   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  76.6 MBytes  64.3 Mbits/sec  0.000 ms  0/55496 (0%)  sender 
[  5]   0.00-10.00  sec  76.6 MBytes  64.3 Mbits/sec  0.033 ms  0/55496 (0%)  receiver 

iperf Done.

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

Из приведенных результатов и графика (Рисунок 1) видно, что в диапазоне скоростей передачи трафика клиентом HiFive между 64 и 128 Мбит/с наступает насыщение, а затем даже некоторое снижение определяемой iperf3 скорости и числа переданных дейтаграмм. Исследуем интервал скоростей 64-256 Мбит/с более подробно.


Рисунок 1. Зависимость измеренной скорости от значения опции iperf3 -b.

Поведение в интервале скоростей 64 — 128 Мбит/с

При скорости 70 Мбит/с скорость передачи, заданная в iperf3 еще совпадает с измеренной скоростью, как можно видеть из приведенного ниже вывода

root@freedom-u540:~# iperf3 -c 192.168.0.10 -u -b 70M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 39737 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  8.33 MBytes  69.8 Mbits/sec  6030   
[  5]   1.00-2.00   sec  8.33 MBytes  69.9 Mbits/sec  6032   
[  5]   2.00-3.00   sec  8.34 MBytes  70.0 Mbits/sec  6043   
[  5]   3.00-4.00   sec  8.36 MBytes  70.2 Mbits/sec  6055   
[  5]   4.00-5.00   sec  8.35 MBytes  70.0 Mbits/sec  6049   
[  5]   5.00-6.00   sec  8.34 MBytes  70.0 Mbits/sec  6040   
[  5]   6.00-7.00   sec  8.32 MBytes  69.8 Mbits/sec  6027   
[  5]   7.00-8.00   sec  8.35 MBytes  70.0 Mbits/sec  6044   
[  5]   8.00-9.00   sec  8.37 MBytes  70.2 Mbits/sec  6059   
[  5]   9.00-10.00  sec  8.35 MBytes  70.1 Mbits/sec  6048   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  83.4 MBytes  70.0 Mbits/sec  0.000 ms  0/60427 (0%)  sender 
[  5]   0.00-10.00  sec  83.4 MBytes  70.0 Mbits/sec  0.072 ms  0/60427 (0%)  receiver 

iperf Done.

Заметное насыщение начинается в интервале скоростей 71 — 72 Мбит/с. Не будем загромождать текст подробным выводом измерений в диапазоне и покажем лишь график усредненных по нескольким измерениям значений скорости в зависимости параметра -b в команде iperf3. Отметим, что при скорости передачи выше 70 Мбит/с утилита top показывала близкую к 100% загрузку процессора, поэтому результаты iperf3 отличались от измерения к измерению и на графике (Рисунок 2) приведены усредненные значения.


Рисунок 2. Насыщение скорости передачи трафика UDP.

С момента насыщения, как можно видеть из приведенного выше вывода для скоростей выше 64 Мбит/с измеренная скорость в каждом интервале iperf3 колеблется в значительных пределах. Это обусловлено тем, что генерация пакетов iperf3 практически полностью загружает процессоры, поэтому реальная скорость генерации зависит от текущей загрузки процессоров фоновыми задачами с высоким приоритетом (системные процессы).

Сервер HiFive

Принятая по умолчанию скорость (1 Мбит/с)

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 42358 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   1.00-2.00   sec   127 KBytes  1.04 Mbits/sec  90   
[  5]   2.00-3.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   3.00-4.00   sec   127 KBytes  1.04 Mbits/sec  90   
[  5]   4.00-5.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   5.00-6.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   6.00-7.00   sec   127 KBytes  1.04 Mbits/sec  90   
[  5]   7.00-8.00   sec   129 KBytes  1.05 Mbits/sec  91   
[  5]   8.00-9.00   sec   127 KBytes  1.04 Mbits/sec  90   
[  5]   9.00-10.00  sec   129 KBytes  1.05 Mbits/sec  91   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  1.25 MBytes  1.05 Mbits/sec  0.000 ms  0/906 (0%)  sender 
[  5]   0.00-10.00  sec  1.25 MBytes  1.05 Mbits/sec  0.005 ms  0/906 (0%)  receiver 

iperf Done.

2 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 2M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 37942 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   1.00-2.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   2.00-3.00   sec   243 KBytes  1.99 Mbits/sec  172   
[  5]   3.00-4.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   4.00-5.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   5.00-6.00   sec   243 KBytes  1.99 Mbits/sec  172   
[  5]   6.00-7.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   7.00-8.00   sec   245 KBytes  2.00 Mbits/sec  173   
[  5]   8.00-9.00   sec   243 KBytes  1.99 Mbits/sec  172   
[  5]   9.00-10.00  sec   245 KBytes  2.00 Mbits/sec  173   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  2.38 MBytes  2.00 Mbits/sec  0.000 ms  0/1727 (0%)  sender 
[  5]   0.00-10.00  sec  2.38 MBytes  2.00 Mbits/sec  0.006 ms  0/1727 (0%)  receiver 

iperf Done.

4 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 4M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 54584 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   1.00-2.00   sec   489 KBytes  4.01 Mbits/sec  346   
[  5]   2.00-3.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   3.00-4.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   4.00-5.00   sec   489 KBytes  4.01 Mbits/sec  346   
[  5]   5.00-6.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   6.00-7.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   7.00-8.00   sec   489 KBytes  4.01 Mbits/sec  346   
[  5]   8.00-9.00   sec   488 KBytes  4.00 Mbits/sec  345   
[  5]   9.00-10.00  sec   488 KBytes  4.00 Mbits/sec  345   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  4.77 MBytes  4.00 Mbits/sec  0.000 ms  0/3453 (0%)  sender 
[  5]   0.00-10.00  sec  4.77 MBytes  4.00 Mbits/sec  0.023 ms  0/3453 (0%)  receiver 

iperf Done.

8 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 8M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 42485 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec   976 KBytes  7.99 Mbits/sec  690   
[  5]   1.00-2.00   sec   977 KBytes  8.00 Mbits/sec  691   
[  5]   2.00-3.00   sec   977 KBytes  8.00 Mbits/sec  691   
[  5]   3.00-4.00   sec   976 KBytes  7.99 Mbits/sec  690   
[  5]   4.00-5.00   sec   977 KBytes  8.00 Mbits/sec  691   
[  5]   5.00-6.00   sec   977 KBytes  8.00 Mbits/sec  691   
[  5]   6.00-7.00   sec   976 KBytes  7.99 Mbits/sec  690   
[  5]   7.00-8.00   sec   977 KBytes  8.00 Mbits/sec  691   
[  5]   8.00-9.00   sec   976 KBytes  7.99 Mbits/sec  690   
[  5]   9.00-10.00  sec   977 KBytes  8.00 Mbits/sec  691   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  9.54 MBytes  8.00 Mbits/sec  0.000 ms  0/6906 (0%)  sender 
[  5]   0.00-10.00  sec  9.54 MBytes  8.00 Mbits/sec  0.005 ms  0/6906 (0%)  receiver 

iperf Done.

16 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 16M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 51701 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  1.91 MBytes  16.0 Mbits/sec  1380   
[  5]   1.00-2.00   sec  1.91 MBytes  16.0 Mbits/sec  1382   
[  5]   2.00-3.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   3.00-4.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   4.00-5.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   5.00-6.00   sec  1.91 MBytes  16.0 Mbits/sec  1382   
[  5]   6.00-7.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   7.00-8.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   8.00-9.00   sec  1.91 MBytes  16.0 Mbits/sec  1381   
[  5]   9.00-10.00  sec  1.91 MBytes  16.0 Mbits/sec  1381   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  19.1 MBytes  16.0 Mbits/sec  0.000 ms  0/13811 (0%)  sender 
[  5]   0.00-10.00  sec  19.1 MBytes  16.0 Mbits/sec  0.027 ms  0/13811 (0%)  receiver 

iperf Done.

32 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 32M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 59259 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  3.81 MBytes  32.0 Mbits/sec  2761   
[  5]   1.00-2.00   sec  3.81 MBytes  32.0 Mbits/sec  2762   
[  5]   2.00-3.00   sec  3.81 MBytes  32.0 Mbits/sec  2762   
[  5]   3.00-4.00   sec  3.82 MBytes  32.0 Mbits/sec  2763   
[  5]   4.00-5.00   sec  3.81 MBytes  32.0 Mbits/sec  2762   
[  5]   5.00-6.00   sec  3.82 MBytes  32.0 Mbits/sec  2763   
[  5]   6.00-7.00   sec  3.81 MBytes  32.0 Mbits/sec  2762   
[  5]   7.00-8.00   sec  3.82 MBytes  32.0 Mbits/sec  2763   
[  5]   8.00-9.00   sec  3.81 MBytes  32.0 Mbits/sec  2762   
[  5]   9.00-10.00  sec  3.81 MBytes  32.0 Mbits/sec  2762   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  38.1 MBytes  32.0 Mbits/sec  0.000 ms  0/27622 (0%)  sender 
[  5]   0.00-10.00  sec  38.1 MBytes  32.0 Mbits/sec  0.058 ms  0/27622 (0%)  receiver 

iperf Done.

64 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 64M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 54983 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  7.62 MBytes  63.9 Mbits/sec  5521   
[  5]   1.00-2.00   sec  7.63 MBytes  64.0 Mbits/sec  5525   
[  5]   2.00-3.00   sec  7.63 MBytes  64.0 Mbits/sec  5524   
[  5]   3.00-4.00   sec  7.63 MBytes  64.0 Mbits/sec  5525   
[  5]   4.00-5.00   sec  7.63 MBytes  64.0 Mbits/sec  5525   
[  5]   5.00-6.00   sec  7.63 MBytes  64.0 Mbits/sec  5525   
[  5]   6.00-7.00   sec  7.63 MBytes  64.0 Mbits/sec  5525   
[  5]   7.00-8.00   sec  7.63 MBytes  64.0 Mbits/sec  5525   
[  5]   8.00-9.00   sec  7.63 MBytes  64.0 Mbits/sec  5524   
[  5]   9.00-10.00  sec  7.63 MBytes  64.0 Mbits/sec  5525   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  76.3 MBytes  64.0 Mbits/sec  0.000 ms  0/55244 (0%)  sender 
[  5]   0.00-10.00  sec  76.3 MBytes  64.0 Mbits/sec  0.066 ms  0/55244 (0%)  receiver 

iperf Done.

128 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 128M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 47960 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  15.2 MBytes   128 Mbits/sec  11041   
[  5]   1.00-2.00   sec  15.3 MBytes   128 Mbits/sec  11049   
[  5]   2.00-3.00   sec  15.3 MBytes   128 Mbits/sec  11050   
[  5]   3.00-4.00   sec  15.3 MBytes   128 Mbits/sec  11051   
[  5]   4.00-5.00   sec  15.3 MBytes   128 Mbits/sec  11049   
[  5]   5.00-6.00   sec  15.3 MBytes   128 Mbits/sec  11050   
[  5]   6.00-7.00   sec  15.3 MBytes   128 Mbits/sec  11049   
[  5]   7.00-8.00   sec  15.3 MBytes   128 Mbits/sec  11050   
[  5]   8.00-9.00   sec  15.3 MBytes   128 Mbits/sec  11049   
[  5]   9.00-10.00  sec  15.3 MBytes   128 Mbits/sec  11051   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec   153 MBytes   128 Mbits/sec  0.000 ms  0/110489 (0%)  sender 
[  5]   0.00-10.00  sec   153 MBytes   128 Mbits/sec  0.080 ms  0/110489 (0%)  receiver 

iperf Done.

256 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 256M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 48766 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  30.5 MBytes   256 Mbits/sec  22084   
[  5]   1.00-2.00   sec  30.5 MBytes   256 Mbits/sec  22100   
[  5]   2.00-3.00   sec  30.5 MBytes   256 Mbits/sec  22099   
[  5]   3.00-4.00   sec  30.5 MBytes   256 Mbits/sec  22099   
[  5]   4.00-5.00   sec  30.5 MBytes   256 Mbits/sec  22098   
[  5]   5.00-6.00   sec  30.5 MBytes   256 Mbits/sec  22100   
[  5]   6.00-7.00   sec  30.5 MBytes   256 Mbits/sec  22098   
[  5]   7.00-8.00   sec  30.5 MBytes   256 Mbits/sec  22100   
[  5]   8.00-9.00   sec  30.5 MBytes   256 Mbits/sec  22101   
[  5]   9.00-10.00  sec  30.5 MBytes   256 Mbits/sec  22101   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec   305 MBytes   256 Mbits/sec  0.000 ms  0/220980 (0%)  sender 
[  5]   0.00-10.00  sec   219 MBytes   183 Mbits/sec  0.127 ms  62608/220852 (28%)  receiver 

iperf Done.

Вывод сервера

----------------------------------------------------------- 
Server listening on 5201 
----------------------------------------------------------- 
Accepted connection from 192.168.0.10, port 60266 
[  5] local 192.168.0.3 port 5201 connected to 192.168.0.10 port 48766 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-1.00   sec  21.9 MBytes   183 Mbits/sec  0.104 ms  6152/21982 (28%)   
[  5]   1.00-2.00   sec  21.9 MBytes   184 Mbits/sec  0.094 ms  6237/22078 (28%)   
[  5]   2.00-3.00   sec  21.9 MBytes   183 Mbits/sec  0.101 ms  6293/22117 (28%)   
[  5]   3.00-4.00   sec  21.8 MBytes   183 Mbits/sec  0.083 ms  6273/22092 (28%)   
[  5]   4.00-5.00   sec  21.8 MBytes   183 Mbits/sec  0.090 ms  6298/22099 (28%)   
[  5]   5.00-6.00   sec  21.9 MBytes   184 Mbits/sec  0.099 ms  6269/22110 (28%)   
[  5]   6.00-7.00   sec  21.9 MBytes   183 Mbits/sec  0.114 ms  6274/22098 (28%)   
[  5]   7.00-8.00   sec  21.9 MBytes   183 Mbits/sec  0.093 ms  6259/22100 (28%)   
[  5]   8.00-9.00   sec  21.8 MBytes   183 Mbits/sec  0.114 ms  6288/22099 (28%)   
[  5]   9.00-10.00  sec  21.8 MBytes   183 Mbits/sec  0.109 ms  6265/22076 (28%)   
[  5]  10.00-10.00  sec  1.41 KBytes  17.8 Mbits/sec  0.127 ms  0/1 (0%)   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec   219 MBytes   183 Mbits/sec  0.127 ms  62608/220852 (28%)  receiver

512 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 512M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 40006 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec  61.0 MBytes   512 Mbits/sec  44179   
[  5]   1.00-2.00   sec  61.0 MBytes   512 Mbits/sec  44195   
[  5]   2.00-3.00   sec  61.0 MBytes   512 Mbits/sec  44192   
[  5]   3.00-4.00   sec  61.0 MBytes   512 Mbits/sec  44197   
[  5]   4.00-5.00   sec  61.0 MBytes   512 Mbits/sec  44198   
[  5]   5.00-6.00   sec  61.0 MBytes   512 Mbits/sec  44207   
[  5]   6.00-7.00   sec  61.0 MBytes   512 Mbits/sec  44205   
[  5]   7.00-8.00   sec  61.0 MBytes   512 Mbits/sec  44194   
[  5]   8.00-9.00   sec  61.0 MBytes   512 Mbits/sec  44198   
[  5]   9.00-10.00  sec  61.0 MBytes   512 Mbits/sec  44194   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec   610 MBytes   512 Mbits/sec  0.000 ms  0/441959 (0%)  sender 
[  5]   0.00-10.02  sec   209 MBytes   175 Mbits/sec  0.075 ms  290265/441703 (66%)  receiver 

iperf Done.

Вывод сервера

----------------------------------------------------------- 
Server listening on 5201 
----------------------------------------------------------- 
Accepted connection from 192.168.0.10, port 60312 
[  5] local 192.168.0.3 port 5201 connected to 192.168.0.10 port 40006 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-1.00   sec  20.9 MBytes   175 Mbits/sec  0.131 ms  28013/43126 (65%)   
[  5]   1.00-2.00   sec  20.9 MBytes   175 Mbits/sec  0.068 ms  29032/44139 (66%)   
[  5]   2.00-3.00   sec  20.9 MBytes   175 Mbits/sec  0.077 ms  29134/44249 (66%)   
[  5]   3.00-4.00   sec  20.9 MBytes   175 Mbits/sec  0.123 ms  29107/44240 (66%)   
[  5]   4.00-5.00   sec  20.9 MBytes   175 Mbits/sec  0.100 ms  29067/44191 (66%)   
[  5]   5.00-6.00   sec  20.9 MBytes   175 Mbits/sec  0.085 ms  29008/44141 (66%)   
[  5]   6.00-7.00   sec  20.9 MBytes   175 Mbits/sec  0.129 ms  29117/44232 (66%)   
[  5]   7.00-8.00   sec  20.9 MBytes   175 Mbits/sec  0.129 ms  29130/44240 (66%)   
[  5]   8.00-9.00   sec  20.9 MBytes   175 Mbits/sec  0.119 ms  29083/44196 (66%)   
[  5]   9.00-10.00  sec  20.9 MBytes   175 Mbits/sec  0.077 ms  29024/44133 (66%)   
[  5]  10.00-10.02  sec   376 KBytes   172 Mbits/sec  0.075 ms  550/816 (67%)   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.02  sec   209 MBytes   175 Mbits/sec  0.075 ms  290265/441703 (66%)  receiver

1000 Мбит/с

[root@Lhotze ~]# iperf3 -c 192.168.0.3 -u -b 1000M 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 50966 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Total Datagrams 
[  5]   0.00-1.00   sec   114 MBytes   956 Mbits/sec  82540   
[  5]   1.00-2.00   sec   114 MBytes   956 Mbits/sec  82564   
[  5]   2.00-3.00   sec   114 MBytes   956 Mbits/sec  82560   
[  5]   3.00-4.00   sec   114 MBytes   956 Mbits/sec  82564   
[  5]   4.00-5.00   sec   114 MBytes   956 Mbits/sec  82564   
[  5]   5.00-6.00   sec   114 MBytes   956 Mbits/sec  82564   
[  5]   6.00-7.00   sec   114 MBytes   956 Mbits/sec  82560   
[  5]   7.00-8.00   sec   114 MBytes   956 Mbits/sec  82571   
[  5]   8.00-9.00   sec   114 MBytes   956 Mbits/sec  82567   
[  5]   9.00-10.00  sec   114 MBytes   956 Mbits/sec  82563   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec  1.11 GBytes   956 Mbits/sec  0.000 ms  0/825617 (0%)  sender 
[  5]   0.00-10.02  sec   209 MBytes   175 Mbits/sec  0.097 ms  673764/825232 (82%)  receiver 

iperf Done.

Вывод сервера

----------------------------------------------------------- 
Server listening on 5201 
----------------------------------------------------------- 
Accepted connection from 192.168.0.10, port 60354 
[  5] local 192.168.0.3 port 5201 connected to 192.168.0.10 port 50966 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-1.00   sec  20.9 MBytes   175 Mbits/sec  0.172 ms  65460/80582 (81%)   
[  5]   1.00-2.00   sec  20.9 MBytes   175 Mbits/sec  0.085 ms  67393/82502 (82%)   
[  5]   2.00-3.00   sec  20.9 MBytes   175 Mbits/sec  0.104 ms  67515/82633 (82%)   
[  5]   3.00-4.00   sec  20.9 MBytes   175 Mbits/sec  0.074 ms  67355/82470 (82%)   
[  5]   4.00-5.00   sec  20.9 MBytes   175 Mbits/sec  0.116 ms  67487/82594 (82%)   
[  5]   5.00-6.00   sec  20.9 MBytes   175 Mbits/sec  0.156 ms  67488/82601 (82%)   
[  5]   6.00-7.00   sec  20.9 MBytes   175 Mbits/sec  0.076 ms  67307/82432 (82%)   
[  5]   7.00-8.00   sec  20.9 MBytes   175 Mbits/sec  0.077 ms  67422/82545 (82%)   
[  5]   8.00-9.00   sec  20.9 MBytes   175 Mbits/sec  0.110 ms  67564/82680 (82%)   
[  5]   9.00-10.00  sec  20.9 MBytes   175 Mbits/sec  0.097 ms  67450/82569 (82%)   
[  5]  10.00-10.02  sec   426 KBytes   168 Mbits/sec  0.097 ms  1323/1624 (81%)   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.02  sec   209 MBytes   175 Mbits/sec  0.097 ms  673764/825232 (82%)  receiver

Клиент x86_64 (2 процессора Xeon с общим числом ядер — 40) способен генерировать большой объем трафика, поэтому в этом тесте насыщение скорости определяется возможностями приема пакетов сервером HiFive Unleashed и насыщение наступает в диапазоне скоростей 128-256 Мбит/с, как можно видеть из графика (Рисунок 3).

Рисунок 3. Зависимость измеренной скорости от скорости генерации пакетов клиентом x86_64 (опция iperf3 -b).

Как и для случая клиента HiFive рассмотрим область начала насыщения более подробно. На рисунке 4 представлена область насыщения измеренной скорости и кривая роста ошибок (отмеченных клиентом потерь пакетов в %).


Рисунок 4. Насыщение скорости и рост числа потерянных пакетов

Здесь также программа iperf3 на стороне сервера HiFive Unleashed занимала практически все ресурсы процессора, поэтому измерение скорости и уровень потери в разных интервалах одного теста iperf3 менялись в широких пределах, как можно видеть из представленного ниже вывода для генерации тестовых пакетов клиентом со скоростью 160 Мбит/с. Это обусловлено нагрузкой на процессоры, создаваемой системными процессами, которые имеют более высокий приоритет, нежели задача iperf3.

----------------------------------------------------------- 
Server listening on 5201 
----------------------------------------------------------- 
Accepted connection from 192.168.0.10, port 37206 
[  5] local 192.168.0.3 port 5201 connected to 192.168.0.10 port 56421 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-1.00   sec  17.8 MBytes   149 Mbits/sec  0.078 ms  912/13801 (6.6%)   
[  5]   1.00-2.00   sec  19.1 MBytes   160 Mbits/sec  0.099 ms  0/13809 (0%)   
[  5]   2.00-3.00   sec  18.0 MBytes   151 Mbits/sec  0.172 ms  654/13696 (4.8%)   
[  5]   3.00-4.00   sec  12.8 MBytes   107 Mbits/sec  0.165 ms  4361/13638 (32%)   
[  5]   4.00-5.00   sec  18.5 MBytes   155 Mbits/sec  0.106 ms  681/14106 (4.8%)   
[  5]   5.00-6.00   sec  17.9 MBytes   150 Mbits/sec  0.131 ms  757/13699 (5.5%)   
[  5]   6.00-7.00   sec  13.4 MBytes   112 Mbits/sec  0.191 ms  4124/13804 (30%)   
[  5]   7.00-8.00   sec  16.4 MBytes   137 Mbits/sec  0.072 ms  2071/13933 (15%)   
[  5]   8.00-9.00   sec  14.7 MBytes   124 Mbits/sec  0.195 ms  3043/13705 (22%)   
[  5]   9.00-10.00  sec  13.3 MBytes   112 Mbits/sec  0.148 ms  4134/13793 (30%)   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams 
[  5]   0.00-10.00  sec   162 MBytes   136 Mbits/sec  0.148 ms  20737/137984 (15%)  receiver

Заключение

Проведенные измерения показывают, что максимальная скорость генерации трафика UDP программой iperf3 на плате HiFive Unleashed составляет приблизительно 80 Мбит/с, а максимальная скорость приема той же же программой примерно вдвое выше. Это задает диапазон скоростей приема и передачи пакетов, для которых целесообразно снять профили загрузки процессоров с целью получения более подробной информации об использовании системных ресурсов и узких местах системы.

Николай Малых

nmalykh@protocols.ru




Тестирование платы HiFive Unleashed с ядром Linux 5.2.9

 PDF

Тесты выполнялись в локальной сети Gigabit Ethernet без сторонней нагрузки. Устройства были подключены к одному коммутатору D-Link. Управление платой HiFive Unleashed выполнялось по протоколу SSH. На плате была установлена ОС Linux с ядром версии 5.2.9, собранным специально для этой платы.

Измерение производительности с помощью iperf3

Тесты выполнялись при установленных по умолчанию параметрах сетевых интерфейсов, показанных ниже.

Хост HiFive

root@freedom-u540:~# ethtool eth0 
Settings for eth0: 
       Supported ports: [ TP MII ] 
       Supported link modes:   10baseT/Half 10baseT/Full  
                               100baseT/Half 100baseT/Full  
                               1000baseT/Half 1000baseT/Full  
       Supported pause frame use: Symmetric Receive-only 
       Supports auto-negotiation: Yes 
       Supported FEC modes: Not reported 
       Advertised link modes:  10baseT/Half 10baseT/Full  
                               100baseT/Half 100baseT/Full  
                               1000baseT/Half 1000baseT/Full  
       Advertised pause frame use: No 
       Advertised auto-negotiation: Yes 
       Advertised FEC modes: Not reported 
       Link partner advertised link modes:  10baseT/Half 10baseT/Full  
                                            100baseT/Half 100baseT/Full  
                                            1000baseT/Full  
       Link partner advertised pause frame use: Symmetric 
       Link partner advertised auto-negotiation: Yes 
       Link partner advertised FEC modes: Not reported 
       Speed: 1000Mb/s 
       Duplex: Full 
       Port: MII 
       PHYAD: 0 
       Transceiver: internal 
       Auto-negotiation: on 
       Link detected: yes

выполнялись в локальной сети Gigabit Ethernet без сторонней нагрузки. Устройства были подключены к одному коммутатору D-Link. Управление платой HiFive выполнялось по протоколу SSH.

Хост x86_64

[root@Lhotze ~]# ethtool enp4s0 
Settings for enp4s0: 
       Supported ports: [ TP ] 
       Supported link modes:   10baseT/Half 10baseT/Full  
                               100baseT/Half 100baseT/Full  
                               1000baseT/Full  
       Supported pause frame use: Symmetric 
       Supports auto-negotiation: Yes 
       Supported FEC modes: Not reported 
       Advertised link modes:  10baseT/Half 10baseT/Full  
                               100baseT/Half 100baseT/Full  
                               1000baseT/Full  
       Advertised pause frame use: Symmetric 
       Advertised auto-negotiation: Yes 
       Advertised FEC modes: Not reported 
       Speed: 1000Mb/s 
       Duplex: Full 
       Port: Twisted Pair 
       PHYAD: 1 
       Transceiver: internal 
       Auto-negotiation: on 
       MDI-X: off (auto) 
       Supports Wake-on: pumbg 
       Wake-on: g 
       Current message level: 0x00000007 (7) 
                              drv probe link 
       Link detected: yes

Из приведенного вывода видно, что оба интерфейса работают в полнодуплексном режиме со скоростью линии 1000 Мбит/с.

Далее были выполнены два теста, в одном из которых хост HiFive выступал в качестве клиента, в другом был сервером. Скорость определялась с помощью программы iperf3 с принятыми по умолчанию параметрами (протокол TCP, скорость передачи не ограничена.

Клиент HiFive

Вывод клиента

root@freedom-u540:~# iperf3 -c 192.168.0.10 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 46756 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.02   sec  15.1 MBytes   124 Mbits/sec    0    148 KBytes        
[  5]   1.02-2.03   sec  15.0 MBytes   125 Mbits/sec    0    157 KBytes        
[  5]   2.03-3.03   sec  15.0 MBytes   126 Mbits/sec    0    164 KBytes        
[  5]   3.03-4.04   sec  15.2 MBytes   126 Mbits/sec    0    181 KBytes        
[  5]   4.04-5.03   sec  15.0 MBytes   127 Mbits/sec    0    181 KBytes        
[  5]   5.03-6.01   sec  15.0 MBytes   128 Mbits/sec    0    181 KBytes        
[  5]   6.01-7.07   sec  16.2 MBytes   129 Mbits/sec    0    230 KBytes        
[  5]   7.07-8.06   sec  15.0 MBytes   127 Mbits/sec    0    230 KBytes        
[  5]   8.06-9.04   sec  15.0 MBytes   128 Mbits/sec    0    230 KBytes        
[  5]   9.04-10.03  sec  15.0 MBytes   127 Mbits/sec    0    230 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.03  sec   152 MBytes   127 Mbits/sec    0             sender 
[  5]   0.00-10.04  sec   152 MBytes   127 Mbits/sec                  receiver 

iperf Done.

Вывод сервера

[root@Lhotze src]# iperf3 -s 
----------------------------------------------------------- 
Server listening on 5201 
----------------------------------------------------------- 
Accepted connection from 192.168.0.3, port 46754 
[  5] local 192.168.0.10 port 5201 connected to 192.168.0.3 port 46756 
[ ID] Interval           Transfer     Bitrate 
[  5]   0.00-1.00   sec  14.6 MBytes   123 Mbits/sec                   
[  5]   1.00-2.00   sec  14.9 MBytes   125 Mbits/sec                   
[  5]   2.00-3.00   sec  15.0 MBytes   126 Mbits/sec                   
[  5]   3.00-4.00   sec  15.1 MBytes   126 Mbits/sec                   
[  5]   4.00-5.00   sec  15.2 MBytes   127 Mbits/sec                   
[  5]   5.00-6.00   sec  15.3 MBytes   129 Mbits/sec                   
[  5]   6.00-7.00   sec  15.3 MBytes   129 Mbits/sec                   
[  5]   7.00-8.00   sec  15.1 MBytes   127 Mbits/sec                   
[  5]   8.00-9.00   sec  15.3 MBytes   128 Mbits/sec                   
[  5]   9.00-10.00  sec  15.1 MBytes   127 Mbits/sec                   
[  5]  10.00-10.04  sec   665 KBytes   128 Mbits/sec                   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate 
[  5]   0.00-10.04  sec   152 MBytes   127 Mbits/sec                  receiver 
-----------------------------------------------------------

Результат показывает среднюю скорость обмена через сеть 127 Мбит/с, что составляет лишь 12,7% от номинальной скорости линии. Вариации скорости в процессе измерения невелики, а объем переданных данных составил 152 Мбайта, что позволяет считать результат измерения достаточно достоверным.

Для выяснения причин столь малой скорости меняем роли участвующих в тесте хостов — HiFive становится сервером, а x86_64 — клиентом.

Сервер HiFive

Вывод сервера

root@freedom-u540:~# iperf3 -s              
----------------------------------------------------------- 
Server listening on 5201 
----------------------------------------------------------- 
Accepted connection from 192.168.0.10, port 55746 
[  5] local 192.168.0.3 port 5201 connected to 192.168.0.10 port 55748 
[ ID] Interval           Transfer     Bitrate 
[  5]   0.00-1.00   sec  26.2 MBytes   220 Mbits/sec                   
[  5]   1.00-2.00   sec  25.9 MBytes   217 Mbits/sec                   
[  5]   2.00-3.00   sec  25.6 MBytes   215 Mbits/sec                   
[  5]   3.00-4.00   sec  26.2 MBytes   220 Mbits/sec                   
[  5]   4.00-5.00   sec  25.9 MBytes   217 Mbits/sec                   
[  5]   5.00-6.00   sec  29.8 MBytes   250 Mbits/sec                   
[  5]   6.00-7.00   sec  28.5 MBytes   240 Mbits/sec                   
[  5]   7.00-8.00   sec  25.8 MBytes   216 Mbits/sec                   
[  5]   8.00-9.00   sec  26.1 MBytes   219 Mbits/sec                   
[  5]   9.00-10.00  sec  25.8 MBytes   217 Mbits/sec                   
[  5]  10.00-10.02  sec   580 KBytes   259 Mbits/sec                   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate 
[  5]   0.00-10.02  sec   266 MBytes   223 Mbits/sec                  receiver 
----------------------------------------------------------- 
Server listening on 5201 
-----------------------------------------------------------

Вывод клиента

[root@Lhotze src]# iperf3 -c 192.168.0.3 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 55748 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec  28.9 MBytes   242 Mbits/sec   27    527 KBytes        
[  5]   1.00-2.00   sec  26.2 MBytes   220 Mbits/sec    0    595 KBytes        
[  5]   2.00-3.00   sec  26.2 MBytes   220 Mbits/sec    0    645 KBytes        
[  5]   3.00-4.00   sec  26.2 MBytes   220 Mbits/sec    1    485 KBytes        
[  5]   4.00-5.00   sec  25.0 MBytes   210 Mbits/sec    0    522 KBytes        
[  5]   5.00-6.00   sec  30.0 MBytes   252 Mbits/sec    0    563 KBytes        
[  5]   6.00-7.00   sec  28.8 MBytes   241 Mbits/sec    0    601 KBytes        
[  5]   7.00-8.00   sec  26.2 MBytes   220 Mbits/sec    0    634 KBytes        
[  5]   8.00-9.00   sec  25.0 MBytes   210 Mbits/sec    1    471 KBytes        
[  5]   9.00-10.00  sec  26.2 MBytes   220 Mbits/sec    0    542 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec   269 MBytes   226 Mbits/sec   29             sender 
[  5]   0.00-10.02  sec   266 MBytes   223 Mbits/sec                  receiver 

iperf Done.

В этом случае скорость получается почти вдвое выше, но все равно составляет лишь 22,3% от номинальной. Однако при внимательном рассмотрении вывода видно, что используемое отправителем (клиент) окно контроля насыщения TCP (правый столбец вывода на стороне клиента — Cwnd) существенно отличалось. Клиент HiFive задавал cwnd от 148 до 230 кбайт, а клиент x86_64 — от 471 до 645 кбайт. Это наводит на мысль о том, что скорость, определяемая iperf3 ограничивалась не на физическом или канальном уровне, а на транспортном (TCP). Отметим это и двинемся дальше.

Зависимость от физических параметров интерфейсов

Устанавливаем на сервере HiFive скорость сетевого интерфейса 100 и 10 Мбит,с и повторяем тесты. Параметры интерфейса на клиенте не изменяются.

Вывод сервера

root@freedom-u540:~# ethtool -s eth0 speed 100 autoneg off 

root@freedom-u540:~# iperf3 -s                 
----------------------------------------------------------- 
Server listening on 5201 
----------------------------------------------------------- 
Accepted connection from 192.168.0.10, port 38296 
[  5] local 192.168.0.3 port 5201 connected to 192.168.0.10 port 38298 
[ ID] Interval           Transfer     Bitrate 
[  5]   0.00-1.00   sec  5.72 MBytes  48.0 Mbits/sec                   
[  5]   1.00-2.00   sec  8.22 MBytes  68.9 Mbits/sec                   
[  5]   2.00-3.00   sec  7.27 MBytes  61.0 Mbits/sec                   
[  5]   3.00-4.00   sec  7.28 MBytes  61.1 Mbits/sec                   
[  5]   4.00-5.00   sec  8.61 MBytes  72.1 Mbits/sec                   
[  5]   5.00-6.00   sec  8.09 MBytes  67.9 Mbits/sec                   
[  5]   6.00-7.00   sec  8.16 MBytes  68.4 Mbits/sec                   
[  5]   7.00-8.00   sec  7.27 MBytes  61.0 Mbits/sec                   
[  5]   8.00-9.00   sec  7.32 MBytes  61.2 Mbits/sec                   
[  5]   9.00-10.00  sec  8.92 MBytes  75.0 Mbits/sec                   
[  5]  10.00-10.00  sec  31.1 KBytes  78.1 Mbits/sec                   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate 
[  5]   0.00-10.00  sec  76.9 MBytes  64.5 Mbits/sec                  receiver 
----------------------------------------------------------- 
Server listening on 5201 
-----------------------------------------------------------

Вывод клиента

[root@Lhotze src]# iperf3 -c 192.168.0.3        
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 38298 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec  6.79 MBytes  56.9 Mbits/sec    0    267 KBytes        
[  5]   1.00-2.00   sec  9.64 MBytes  80.9 Mbits/sec    0    494 KBytes        
[  5]   2.00-3.00   sec  7.26 MBytes  60.9 Mbits/sec    0    494 KBytes        
[  5]   3.00-4.00   sec  6.90 MBytes  57.9 Mbits/sec    0    494 KBytes        
[  5]   4.00-5.00   sec  8.26 MBytes  69.3 Mbits/sec    0    494 KBytes        
[  5]   5.00-6.00   sec  9.13 MBytes  76.6 Mbits/sec    0    494 KBytes        
[  5]   6.00-7.00   sec  8.02 MBytes  67.2 Mbits/sec    0    494 KBytes        
[  5]   7.00-8.00   sec  6.96 MBytes  58.4 Mbits/sec    0    494 KBytes        
[  5]   8.00-9.00   sec  6.52 MBytes  54.7 Mbits/sec    0    494 KBytes        
[  5]   9.00-10.00  sec  9.26 MBytes  77.7 Mbits/sec    0    494 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec  78.7 MBytes  66.1 Mbits/sec    0             sender 
[  5]   0.00-10.00  sec  76.9 MBytes  64.5 Mbits/sec                  receiver 

iperf Done.

При работе сетевого интерфейса на сервере HiFive со скоростью 100 Мбит/с средняя скорость обмена составила 64,5 Мбит/с или 64,5% от номинальной скорости более медленного интерфейса. Размер окна cwnd при этом в течение 9 из 10 интервалов измерения был постоянным (494 кбайта) и лишь в первом интервале составил 267 кбайт.

Устанавливаем на интерфейсе сервера HiFive скорость 10 Мбит/с и повторяем тест.

Вывод сервера

root@freedom-u540:~# ethtool -s eth0 speed 10 autoneg off 

root@freedom-u540:~# iperf3 -s                 
----------------------------------------------------------- 
Server listening on 5201 
----------------------------------------------------------- 
Accepted connection from 192.168.0.10, port 38330 
[  5] local 192.168.0.3 port 5201 connected to 192.168.0.10 port 38332 
[ ID] Interval           Transfer     Bitrate 
[  5]   0.00-1.00   sec   546 KBytes  4.47 Mbits/sec                   
[  5]   1.00-2.00   sec   785 KBytes  6.42 Mbits/sec                   
[  5]   2.00-3.00   sec   993 KBytes  8.13 Mbits/sec                   
[  5]   3.00-4.00   sec   998 KBytes  8.17 Mbits/sec                   
[  5]   4.00-5.00   sec   998 KBytes  8.18 Mbits/sec                   
[  5]   5.00-6.00   sec   993 KBytes  8.13 Mbits/sec                   
[  5]   6.00-7.00   sec  1001 KBytes  8.20 Mbits/sec                   
[  5]   7.00-8.00   sec   994 KBytes  8.14 Mbits/sec                   
[  5]   8.00-9.00   sec   996 KBytes  8.15 Mbits/sec                   
[  5]   9.00-10.00  sec  1003 KBytes  8.22 Mbits/sec                   
[  5]  10.00-10.01  sec  7.07 KBytes  7.71 Mbits/sec                   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate 
[  5]   0.00-10.01  sec  9.09 MBytes  7.62 Mbits/sec                  receiver 
----------------------------------------------------------- 
Server listening on 5201 
-----------------------------------------------------------

Вывод клиента

[root@Lhotze src]# iperf3 -c 192.168.0.3 
Connecting to host 192.168.0.3, port 5201 
[  5] local 192.168.0.10 port 38332 connected to 192.168.0.3 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec   730 KBytes  5.98 Mbits/sec    0   41.0 KBytes        
[  5]   1.00-2.00   sec   840 KBytes  6.88 Mbits/sec    0   65.0 KBytes        
[  5]   2.00-3.00   sec  1.09 MBytes  9.18 Mbits/sec    0   65.0 KBytes        
[  5]   3.00-4.00   sec   902 KBytes  7.39 Mbits/sec    0   65.0 KBytes        
[  5]   4.00-5.00   sec  1.09 MBytes  9.18 Mbits/sec    0   65.0 KBytes        
[  5]   5.00-6.00   sec   933 KBytes  7.65 Mbits/sec    0   65.0 KBytes        
[  5]   6.00-7.00   sec   933 KBytes  7.65 Mbits/sec    0   65.0 KBytes        
[  5]   7.00-8.00   sec   933 KBytes  7.65 Mbits/sec    0   65.0 KBytes        
[  5]   8.00-9.00   sec  1.09 MBytes  9.18 Mbits/sec    0   65.0 KBytes        
[  5]   9.00-10.00  sec   933 KBytes  7.64 Mbits/sec    0   65.0 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec  9.34 MBytes  7.84 Mbits/sec    0             sender 
[  5]   0.00-10.01  sec  9.09 MBytes  7.62 Mbits/sec                  receiver 

iperf Done.

В этом случае скорость обмена составила 7,62 Мбит/с или 72,6% от номинальной скорости более медленного интерфейса. Окно насыщения во всех интервалах измерения кроме первого имело размер 65 кбайт, а в первом интервале — 41 кбайт.

Из приведенного выше вывода очевидно, что во всех вариантах теста скорость обмена по сети была существенно ниже номинальной скорости линии, определяемой более медленным интерфейсом. Особенно сильно это проявлялось при скорости 1000 Мбит/с.

Далее были выполнены измерения с помощью программы iperf на клиенте HiFive (сервером служила программа iperf3) на скорости интерфейса 10, 100 и 1000 Мбит/с с заданием в каждом случае максимальной скорости передачи клиента (опция -b) в соответствии с номинальной скоростью линии.

1000 Мбит/с

root@freedom-u540:~# iperf -p 5201 -b 1G -c 192.168.0.10    
------------------------------------------------------------ 
Client connecting to 192.168.0.10, TCP port 5201 
TCP window size: 85.0 KByte (default) 
------------------------------------------------------------ 
[  3] local 192.168.0.3 port 46780 connected with 192.168.0.10 port 5201 
[ ID] Interval       Transfer     Bandwidth 
[  3]  0.0-10.0 sec   222 MBytes   186 Mbits/sec

100 Мбит/с

root@freedom-u540:~# ethtool -s eth0 speed 100 autoneg off  
root@freedom-u540:~# iperf -p 5201 -b 100M -c 192.168.0.10    
------------------------------------------------------------ 
Client connecting to 192.168.0.10, TCP port 5201 
TCP window size: 85.0 KByte (default) 
------------------------------------------------------------ 
[  3] local 192.168.0.3 port 46782 connected with 192.168.0.10 port 5201 
[ ID] Interval       Transfer     Bandwidth 
[  3]  0.0-10.0 sec  52.4 MBytes  43.9 Mbits/sec

10 Мбит/с

root@freedom-u540:~# ethtool -s eth0 speed 10 autoneg off  
root@freedom-u540:~# iperf -p 5201 -b 10M -c 192.168.0.10 
------------------------------------------------------------ 
Client connecting to 192.168.0.10, TCP port 5201 
TCP window size: 85.0 KByte (default) 
------------------------------------------------------------ 
[  3] local 192.168.0.3 port 46786 connected with 192.168.0.10 port 5201 
[ ID] Interval       Transfer     Bandwidth 
[  3]  0.0-10.0 sec  9.00 MBytes  7.54 Mbits/sec

И снова, как в случае iperf3 измеренная скорость существенно ниже номинальной скорости линии, а относительная скорость растет при снижении скорости более медленного интерфейса

После этого была восстановлена скорость 1000 Мбит/с на интерфейсе хоста HiFive и менялась скорость интерфейса на сервере (100 и 10 Мбит/с), при этом клиенту iperf на хосте HiFive задавалась полная скорость (1000 Мбит/с)

Сервер 100 Мбит/с

------------------------------------------------------------ 
Client connecting to 192.168.0.10, TCP port 5201 
TCP window size:  102 KByte (default) 
------------------------------------------------------------ 
[  3] local 192.168.0.3 port 46788 connected with 192.168.0.10 port 5201 
[ ID] Interval       Transfer     Bandwidth 
[  3]  0.0-10.0 sec  42.5 MBytes  35.6 Mbits/sec

Сервер 10 Мбит/с

root@freedom-u540:~# iperf -p 5201 -b 1G -c 192.168.0.10 
------------------------------------------------------------ 
Client connecting to 192.168.0.10, TCP port 5201 
TCP window size: 85.0 KByte (default) 
------------------------------------------------------------ 
[  3] local 192.168.0.3 port 46790 connected with 192.168.0.10 port 5201 
[ ID] Interval       Transfer     Bandwidth 
[  3]  0.0-10.1 sec  4.50 MBytes  3.73 Mbits/sec

Скорость обмена через сеть в обоих случаях не достигала и 40% от номинальной скорости линии у клиента.

Зависимость от скорости передачи на стороне клиента

Далее была восстановлены принятые по умолчанию настройки обоих сетевых интерфейсов (полнодуплексный режим, 1000 Мбит/с) и менялась скорость передачи пакетов на уровне клиента HiFive. Напомним, что по умолчанию iperf3 для тестов TCP использует полную скорость линии.

Приводится вывод лишь клиентской стороны, поскольку он более информативен.

Скорость передачи на стороне клиента 1000 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -b 1000M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 56086 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec  16.4 MBytes   137 Mbits/sec    0    158 KBytes        
[  5]   1.00-2.00   sec  16.4 MBytes   137 Mbits/sec    0    158 KBytes        
[  5]   2.00-3.01   sec  16.6 MBytes   139 Mbits/sec    0    158 KBytes        
[  5]   3.01-4.00   sec  16.2 MBytes   137 Mbits/sec    0    158 KBytes        
[  5]   4.00-5.00   sec  16.4 MBytes   137 Mbits/sec    0    167 KBytes        
[  5]   5.00-6.01   sec  16.5 MBytes   138 Mbits/sec    0    167 KBytes        
[  5]   6.01-7.00   sec  16.4 MBytes   138 Mbits/sec    0    167 KBytes        
[  5]   7.00-8.00   sec  16.5 MBytes   139 Mbits/sec    0    167 KBytes        
[  5]   8.00-9.00   sec  16.4 MBytes   137 Mbits/sec    0    167 KBytes        
[  5]   9.00-10.00  sec  16.5 MBytes   139 Mbits/sec    0    167 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec   164 MBytes   138 Mbits/sec    0             sender 
[  5]   0.00-10.01  sec   164 MBytes   138 Mbits/sec                  receiver 

iperf Done. 

Постепенное снижение скорости передачи на клиенте от 1000 до 140 Мбит/с давало близкие результаты со средней скоростью обмена чуть меньше 140 Мбит/с. Однако при скорости передачи клиента меньше 140 Мбит/с средняя скорость обмена между клиентом уже совпадала со скоростью передачи.

Скорость передачи на стороне клиента 140 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -b 140M  
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 56110 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec  16.5 MBytes   138 Mbits/sec    0    153 KBytes        
[  5]   1.00-2.00   sec  16.5 MBytes   138 Mbits/sec    0    168 KBytes        
[  5]   2.00-3.00   sec  16.4 MBytes   138 Mbits/sec    0    177 KBytes        
[  5]   3.00-4.01   sec  16.5 MBytes   138 Mbits/sec    0    177 KBytes        
[  5]   4.01-5.00   sec  16.2 MBytes   137 Mbits/sec    0    177 KBytes        
[  5]   5.00-6.00   sec  16.4 MBytes   137 Mbits/sec    0    177 KBytes        
[  5]   6.00-7.00   sec  16.4 MBytes   137 Mbits/sec    0    177 KBytes        
[  5]   7.00-8.01   sec  16.5 MBytes   138 Mbits/sec    0    177 KBytes        
[  5]   8.01-9.00   sec  16.1 MBytes   136 Mbits/sec    0    177 KBytes        
[  5]   9.00-10.01  sec  16.4 MBytes   137 Mbits/sec    0    177 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.01  sec   164 MBytes   137 Mbits/sec    0             sender 
[  5]   0.00-10.01  sec   164 MBytes   137 Mbits/sec                  receiver 

iperf Done.

Скорость передачи на стороне клиента 130 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -b 130M  
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 56114 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec  15.5 MBytes   130 Mbits/sec    0    158 KBytes        
[  5]   1.00-2.00   sec  15.5 MBytes   130 Mbits/sec    0    158 KBytes        
[  5]   2.00-3.00   sec  15.5 MBytes   130 Mbits/sec    0    158 KBytes        
[  5]   3.00-4.00   sec  15.5 MBytes   130 Mbits/sec    0    167 KBytes        
[  5]   4.00-5.00   sec  15.5 MBytes   130 Mbits/sec    0    167 KBytes        
[  5]   5.00-6.00   sec  15.5 MBytes   130 Mbits/sec    0    167 KBytes        
[  5]   6.00-7.00   sec  15.5 MBytes   130 Mbits/sec    0    167 KBytes        
[  5]   7.00-8.00   sec  15.5 MBytes   130 Mbits/sec    0    167 KBytes        
[  5]   8.00-9.00   sec  15.5 MBytes   130 Mbits/sec    0    167 KBytes        
[  5]   9.00-10.00  sec  15.5 MBytes   130 Mbits/sec    0    167 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec   155 MBytes   130 Mbits/sec    0             sender 
[  5]   0.00-10.01  sec   155 MBytes   130 Mbits/sec                  receiver 

iperf Done.

Скорость передачи на стороне клиента 100 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -b 100M 
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 56126 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec  12.0 MBytes   100 Mbits/sec    0    151 KBytes        
[  5]   1.00-2.00   sec  11.9 MBytes  99.9 Mbits/sec    0    151 KBytes        
[  5]   2.00-3.01   sec  12.0 MBytes   100 Mbits/sec    0    151 KBytes        
[  5]   3.01-4.00   sec  11.9 MBytes   100 Mbits/sec    0    151 KBytes        
[  5]   4.00-5.00   sec  11.9 MBytes  99.6 Mbits/sec    0    151 KBytes        
[  5]   5.00-6.01   sec  12.0 MBytes   100 Mbits/sec    0    151 KBytes        
[  5]   6.01-7.00   sec  11.9 MBytes   100 Mbits/sec    0    151 KBytes        
[  5]   7.00-8.01   sec  12.0 MBytes   100 Mbits/sec    0    151 KBytes        
[  5]   8.01-9.00   sec  11.9 MBytes  99.9 Mbits/sec    0    151 KBytes        
[  5]   9.00-10.00  sec  11.9 MBytes  99.7 Mbits/sec    0    151 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec   119 MBytes   100 Mbits/sec    0             sender 
[  5]   0.00-10.01  sec   119 MBytes  99.9 Mbits/sec                  receiver 

iperf Done.

Скорость передачи на стороне клиента 50 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -b 50M   
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 56130 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec  5.98 MBytes  50.1 Mbits/sec    0    130 KBytes        
[  5]   1.00-2.00   sec  6.00 MBytes  50.3 Mbits/sec    0    130 KBytes        
[  5]   2.00-3.00   sec  6.00 MBytes  50.2 Mbits/sec    0    130 KBytes        
[  5]   3.00-4.00   sec  5.88 MBytes  49.5 Mbits/sec    0    130 KBytes        
[  5]   4.00-5.00   sec  6.00 MBytes  50.3 Mbits/sec    0    130 KBytes        
[  5]   5.00-6.00   sec  6.00 MBytes  50.2 Mbits/sec    0    130 KBytes        
[  5]   6.00-7.00   sec  5.88 MBytes  49.4 Mbits/sec    0    130 KBytes        
[  5]   7.00-8.00   sec  6.00 MBytes  50.3 Mbits/sec    0    130 KBytes        
[  5]   8.00-9.01   sec  6.00 MBytes  50.1 Mbits/sec    0    130 KBytes        
[  5]   9.01-10.00  sec  5.88 MBytes  49.5 Mbits/sec    0    130 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec  59.6 MBytes  50.0 Mbits/sec    0             sender 
[  5]   0.00-10.01  sec  59.6 MBytes  50.0 Mbits/sec                  receiver 

iperf Done.

Скорость передачи на стороне клиента 10 Мбит/с

root@freedom-u540:~# iperf3 -c 192.168.0.10 -b 10M  
Connecting to host 192.168.0.10, port 5201 
[  5] local 192.168.0.3 port 56134 connected to 192.168.0.10 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec  1.25 MBytes  10.5 Mbits/sec    0   72.1 KBytes        
[  5]   1.00-2.00   sec  1.25 MBytes  10.5 Mbits/sec    0    123 KBytes        
[  5]   2.00-3.00   sec  1.12 MBytes  9.44 Mbits/sec    0    130 KBytes        
[  5]   3.00-4.00   sec  1.25 MBytes  10.5 Mbits/sec    0    130 KBytes        
[  5]   4.00-5.00   sec  1.12 MBytes  9.44 Mbits/sec    0    130 KBytes        
[  5]   5.00-6.00   sec  1.25 MBytes  10.5 Mbits/sec    0    130 KBytes        
[  5]   6.00-7.00   sec  1.12 MBytes  9.44 Mbits/sec    0    130 KBytes        
[  5]   7.00-8.00   sec  1.25 MBytes  10.5 Mbits/sec    0    130 KBytes        
[  5]   8.00-9.00   sec  1.12 MBytes  9.44 Mbits/sec    0    130 KBytes        
[  5]   9.00-10.00  sec  1.25 MBytes  10.5 Mbits/sec    0    130 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec  12.0 MBytes  10.1 Mbits/sec    0             sender 
[  5]   0.00-10.01  sec  12.0 MBytes  10.1 Mbits/sec                  receiver 

iperf Done.

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

Это позволяет с уверенностью считать, что результаты измерения скорости обмена по протоколу TCP определяются прежде всего параметрами TCP, а не физическими параметрами интерфейсов хостов и производительностью процессоров. Асимметрия скорости (при смене ролей клиента и сервера) объясняется разными настройками протокола TCP на двух хостах.

Дополнительные измерения

Заключительным был эксперимент по измерению скорости с помощью iperf3 через Internet, когда между сервером и клиентом присутствовало неопределенное число маршрутизаторов. На сервере пропускная способность ограничена значением 100 Мбит/с.

Вывод клиента

root@freedom-u540:~# iperf3 -c protocols.ru 
Connecting to host nmalykh.org, port 5201 
[  5] local 192.168.0.3 port 44460 connected to 185.147.80.144 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec  12.6 MBytes   106 Mbits/sec   45    355 KBytes        
[  5]   1.00-2.01   sec  11.5 MBytes  95.6 Mbits/sec    0    412 KBytes        
[  5]   2.01-3.00   sec  10.8 MBytes  91.2 Mbits/sec    5    320 KBytes        
[  5]   3.00-4.00   sec  11.4 MBytes  95.8 Mbits/sec    0    345 KBytes        
[  5]   4.00-5.00   sec  11.8 MBytes  98.9 Mbits/sec    0    362 KBytes        
[  5]   5.00-6.00   sec  10.9 MBytes  91.7 Mbits/sec    0    384 KBytes        
[  5]   6.00-7.00   sec  11.5 MBytes  96.3 Mbits/sec    0    406 KBytes        
[  5]   7.00-8.00   sec  11.5 MBytes  96.3 Mbits/sec    0    427 KBytes        
[  5]   8.00-9.00   sec  11.1 MBytes  93.2 Mbits/sec    8    342 KBytes        
[  5]   9.00-10.00  sec  11.5 MBytes  96.9 Mbits/sec    0    384 KBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec   115 MBytes  96.2 Mbits/sec   58             sender 
[  5]   0.00-10.00  sec   114 MBytes  95.3 Mbits/sec                  receiver 

iperf Done.

Вывод сервера

[root@nmalykh nmalykh]# iperf3 -s 
----------------------------------------------------------- 
Server listening on 5201 
----------------------------------------------------------- 
Accepted connection from 91.122.87.84, port 44458 
[  5] local 185.147.80.144 port 5201 connected to 91.122.87.84 port 44460 
[ ID] Interval           Transfer     Bandwidth 
[  5]   0.00-1.00   sec  11.1 MBytes  93.0 Mbits/sec                   
[  5]   1.00-2.00   sec  11.4 MBytes  95.4 Mbits/sec                   
[  5]   2.00-3.00   sec  11.4 MBytes  95.4 Mbits/sec                   
[  5]   3.00-4.00   sec  11.4 MBytes  95.4 Mbits/sec                   
[  5]   4.00-5.00   sec  11.4 MBytes  95.4 Mbits/sec                   
[  5]   5.00-6.00   sec  11.4 MBytes  95.4 Mbits/sec                   
[  5]   6.00-7.00   sec  11.4 MBytes  95.4 Mbits/sec                   
[  5]   7.00-8.00   sec  11.4 MBytes  95.4 Mbits/sec                   
[  5]   8.00-9.00   sec  11.4 MBytes  95.4 Mbits/sec                   
[  5]   9.00-10.00  sec  11.4 MBytes  95.4 Mbits/sec                   
[  5]  10.00-10.01  sec   142 KBytes  94.3 Mbits/sec                   
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bandwidth 
[  5]   0.00-10.01  sec  0.00 Bytes  0.00 bits/sec                  sender 
[  5]   0.00-10.01  sec   114 MBytes  95.2 Mbits/sec                  receiver 
----------------------------------------------------------- 
Server listening on 5201 
-----------------------------------------------------------

Здесь скорость обмена практически явно ограничивалась на уровнях 3 и 4 модели OSI (механизм ограничения пропускной способности на хосте protocols.ru точно не известен), поэтому скорость обмена фактически совпадала с номинальной скоростью линии.

Для сравнения ниже представлен результат измерения скорости обмена между двумя хостами с одной операционной системой (Mageia 7.1) в той же ЛВС. На обоих хостах сетевые интерфейсы использовали принятые по умолчанию параметры. Результаты измерений в том и другом направлении практически не отличались, поэтому приведен лишь вывод на стороне клиента для одного из направлений.

[root@Lhotze ~]# iperf3 -c 192.168.0.6 
Connecting to host 192.168.0.6, port 5201 
[  5] local 192.168.0.10 port 54170 connected to 192.168.0.6 port 5201 
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd 
[  5]   0.00-1.00   sec   107 MBytes   895 Mbits/sec    0    696 KBytes        
[  5]   1.00-2.00   sec   104 MBytes   870 Mbits/sec    0    769 KBytes        
[  5]   2.00-3.00   sec   105 MBytes   881 Mbits/sec    0    850 KBytes        
[  5]   3.00-4.00   sec   104 MBytes   870 Mbits/sec    0    935 KBytes        
[  5]   4.00-5.00   sec   104 MBytes   870 Mbits/sec    0    984 KBytes        
[  5]   5.00-6.00   sec   104 MBytes   870 Mbits/sec    0    984 KBytes        
[  5]   6.00-7.00   sec   104 MBytes   870 Mbits/sec    0   1.01 MBytes        
[  5]   7.00-8.00   sec   104 MBytes   870 Mbits/sec    0   1.01 MBytes        
[  5]   8.00-9.00   sec   104 MBytes   870 Mbits/sec    0   1.01 MBytes        
[  5]   9.00-10.00  sec   104 MBytes   870 Mbits/sec    0   1.01 MBytes        
- - - - - - - - - - - - - - - - - - - - - - - - - 
[ ID] Interval           Transfer     Bitrate         Retr 
[  5]   0.00-10.00  sec  1.02 GBytes   874 Mbits/sec    0             sender 
[  5]   0.00-10.00  sec  1.01 GBytes   872 Mbits/sec                  receiver 

iperf Done.

Заключение

Приведенные результаты позволяют с достаточной уверенностью считать, что измерения с помощью утилиты iperf3 при использовании принятого по умолчанию протокола TCP отражают не столько возможности и параметры физического интерфейса и драйвера, сколько параметры управления потоком данных протокола TCP. Поскольку мы пытаемся разобраться с возможностями и ограничениями процессоров Freedom U540 и сетевой подсистемы платы HiFive Unleashed, важнее разобраться с уровнями 1 — 2 эталонной модели OSI без влияния настроек вышележащих уровней. Для оценки реализации нижних уровней сетевого стека TCP/IP измерения, на которые определяющее влияние оказывает управление потоком данных на транспортном уровне, практической ценности не представляют, поэтому далее мы перейдем к измерениям на основе протокола UDP, поскольку в этом случае влияние верхних уровней стека протоколов существенно меньше.




Сборка ядра Linux версии 5.2.9 для платформ RISC-V

PDF

Аннотация

Проектирование встраиваемых систем – динамичная область знаний, которая интегрирует аппаратное и программное обеспечение. Со стороны сообщества Linux сделан колоссальный вклад в развитие мира встраиваемых систем в форме свободно распространяемого исходного кода и поддержки различных процессорных архитектур, включая RISCV. Для переноса операционной системы исходный код ядра настраивается, кросс-компилируется и устанавливается на целевую систему. Мы использовали плату HiFive Unleashed, оснащенную множеством периферийных компонентов, которые позволяют создавать комплексные системы, где можно запускать разнообразные приложения. В рамках стоящих перед нами задач нас интересует в первую очередь оценка производительности сетевых операций. Эта статья дает общее представление о технике переноса и разработке приложений для встраиваемых сетевых систем.

Предпосылки и обоснование выбора

Для тестирования производительности сетевых операций на платформе HiFive Unleashed нам требовалась операционная система Linux с ядром, поддерживающим функции трассировки и оценки производительности. Первоначально было предпринято несколько попыток добиться желаемых результатов на основе поддерживаемого компанией SiFive пакета SiFive Freedom Unleashed (FU) SDK [1], включающего несколько ветвей с разными версиями ядра Linux. Однако создать загрузочный образ на основе собранного с использованием [1] ядра и поддерживаемого компанией SiFive демонстрационного образа Debian [2] или образа Fedora RISCV [3], обеспечивающий нужную функциональность и достаточно стабильную работу, не удалось.

В результате был сделан выбор в пользу разрабатываемой компанией SiFive ветви SiFive OpenEmbedded (OE) [4] с поддержкой ядра Linux версии 5.

Сборка подготовленного образа

Ветвь кода SiFive OE построена на основе репозитория repo от Google и существенно отличается от остальной части FU SDK. Строго говоря, это новое направление, связанное с FU SDK лишь общей аппаратной платформой — HiFive Unleashed.

В отличие от FU SDK, здесь не только создаются ядро и компоненты загрузки для платы HiFive Unleashed, но и собирается достаточно функциональный дистрибутив Linux, похожий на Debian.

Рассмотрим сначала создание загрузочных образов с принятыми по умолчанию настройками.

Процесс начинается с установки программы repo, если в вашей системе ее еще нет. Процедура установки и инициализации repo достаточно подробно и внятно описана на странице Google [5], поэтому не будем на этом останавливаться.

После этого нужно создать каталог для дерева исходных кодов, который после загрузки и сборки компонент займет около 80 Гбайт. Далее все ссылки на файлы будут указываться относительно этого каталога (в нашем случае riscvsifive).

$ mkdir riscv-sifive
$ cd riscv-sifive
$ repo init -u git://github.com/sifive/meta-sifive -b master -m tools/manifests/sifive.xml
$ repo sync

Последняя команда может выполняться достаточно долго в зависимости от скорости соединения с сетью и производительности дисковой подсистемы компьютера. Общий объем загруженных файлов составляет приблизительно 300 Мбайт.

Затем вводится команда

$ repo start work --all

для начала работы со всеми ветвями проекта. Следом необходимо настроить среду сборки требуемых образов с помощью команды

$ . ./meta-sifive/setup.sh

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

Init OE 
You had no conf/local.conf file. This configuration file has therefore been 
created for you with some default values. You may wish to edit it to, for 
example, select a different MACHINE (target hardware). See conf/local.conf 
for more information as common configuration options are commented. 

You had no conf/bblayers.conf file. This configuration file has therefore been 
created for you with some default values. To add additional metadata layers 
into your configuration please add entries to conf/bblayers.conf. 

The Yocto Project has extensive documentation about OE including a reference 
manual which can be found at: 
   http://yoctoproject.org/documentation 

For more information about OpenEmbedded see their website: 
   http://www.openembedded.org/ 


### Shell environment set up for builds. ### 

You can now run 'bitbake <target>' 

Common targets are: 
   core-image-minimal 
   core-image-sato 
   meta-toolchain 
   meta-ide-support 

You can also run generated qemu images with a command like 'runqemu qemux86' 
Adding layers 
NOTE: Starting bitbake server... 
... 

NOTE: Starting bitbake server... 
Creating auto.conf 
--------------------------------------------------- 
MACHINE=freedom-u540 bitbake demo-coreip-cli 
--------------------------------------------------- 

Buildable machine info 
--------------------------------------------------- 
* freedom-u540: The SiFive HiFive Unleased board 
* qemuriscv64: The 64-bit RISC-V machine 
---------------------------------------------------

На этом этапе система готова к сборке загрузочного образа с принятыми по умолчанию параметрами. Для начала сборки следует ввести в консоли команду, приведенную в конце показанного выше вывода

$ MACHINE=freedom-u540 bitbake demo-coreip-cli

Эта команда указывает тип машины, для которой выполняется сборка (freedomu540) и образ (democoreipcli), собираемый с помощью команды bitbake. После запуска команды начнется весьма долгий процесс загрузки ядра и требуемых пакетов, их настройки и сборки.

Initialising tasks: 100% |################################################################| Time: 0:00:18 
Parsing of 2389 .bb files complete (0 cached, 2389 parsed). 3490 targets, 134 skipped, 0 masked, 0 errors. 
NOTE: Resolving any missing task queue dependencies 

Build Configuration: 
BB_VERSION           = "1.43.1" 
BUILD_SYS            = "x86_64-linux" 
NATIVELSBSTRING      = "mageia-7" 
TARGET_SYS           = "riscv64-oe-linux" 
MACHINE              = "freedom-u540" 
DISTRO               = "nodistro" 
DISTRO_VERSION       = "nodistro.0" 
TUNE_FEATURES        = "riscv64 littleendian" 
meta                 = "work:6b36db836547a23f43c5f97bf3706d7b210c209c" 
meta-oe               
meta-python           
meta-multimedia       
meta-networking       
meta-gnome            
meta-xfce            = "work:4e0538516b1e0ef42dc79bd08f7895f0052063ac" 
meta-riscv           = "work:99cdf8d0cfe4b515ccac76c816091b146d0a012b" 
meta-sifive          = "work:87a209be777318fefb87da6e295f4c34540717f3" 

NOTE: Fetching uninative binary shim from http://downloads.yoctoproject.org/releases/uninative/2.6/x86_64-nativesdk-libc.tar.xz;sha256sum=133387753a9acf3e1b788103c59fac91e968e2ee331d7a4b9498e926ada7be57 
Initialising tasks: 100% |################################################################| Time: 0:00:04 
Sstate summary: Wanted 1950 Found 0 Missed 1950 Current 0 (0% match, 0% complete) 
NOTE: Executing Tasks 
NOTE: Setscene tasks completed
...

Следует отметить, что в процессе первоначальной настройки с большой вероятностью возникнут те или иные проблемы и процесс завершится ошибкой. В таком случае следует внимательно просмотреть содержимое вывода на консоль и log-файлы. Обычно, при возникновении ошибки, программа выводит на консоль имя файла, в который были записаны сообщения. Анализ вывода позволяет обнаружить недостающие или некорректно настроенные компоненты системы и устранитье неполадки. Пример сообщения о создании журнала ошибок приведен ниже:

ERROR: Logfile of failure stored in: riscv-sifive/build/tmp-glibc/work/x86_64-linux/shared-mime-info-native/1.10-r0/temp/log.do_compile.39743

Некоторые ошибки удается найти не сразу по причине большого объема вывода программы сборки. Если прокрутка экрана вверх не позволяет увидеть место возникновения ошибки в процессе сборки, имеет смысл воспользоваться перенаправлением вывода в файл и последующим анализом этого файла. В нашем случае возникла проблема, связанная с пустым файлом

riscv-sifive/build/tmp-glibc/work/x86_64-linux/shared-mime-info-native/1.10-r0/build/freedesktop.org.xml

Решить проблему после ее обнаружения удалось путем копирования в упомянутый каталог файла /usr/share/mime/packages/freedesktop.org.xml. Другая проблема была связана со сборкой пакета networkmanager и решить ее удалось только “вручную”, путем сборки части пакета вне процесса bitbake после анализа вывода программы и обнаружения точки возникновения ошибки.

Процесс сборки занимает достаточно продолжительное время (на системе x86 с 40 ядрами и гигабитным каналом доступа в Internet процесс тянулся более часа). В конце концов после некоторого ожидания и правки ошибок будет выведено сообщение вида

...
NOTE: Tasks Summary: Attempted 5681 tasks of which 5423 didn't need to be rerun and all succeeded. 
NOTE: Writing buildhistory 
NOTE: Writing buildhistory took: 1 seconds 
NOTE: Build completion summary: 
NOTE:   do_populate_sysroot: 0.0% sstate reuse(0 setscene, 6 scratch) 
NOTE:   do_package_qa: 0.0% sstate reuse(0 setscene, 8 scratch) 
NOTE:   do_package: 0.0% sstate reuse(0 setscene, 7 scratch) 
NOTE:   do_packagedata: 0.0% sstate reuse(0 setscene, 7 scratch) 
NOTE:   do_package_write_ipk: 0.0% sstate reuse(0 setscene, 8 scratch) 
NOTE:   do_populate_lic: 0.0% sstate reuse(0 setscene, 2 scratch) 

Summary: There was 1 WARNING message shown.

Это означает, что процедура установки, настройки и сборки компонент завершилась без ошибок и полученный образ можно копировать на карту микро-SD для загрузки платы HiFive Unleashed. Подготовленные образы для установки на карту микро-SD будут размещаться в каталоге riscvsifive/build/tmpglibc/deploy/images/freedomu540.Процесс сборки завершается в каталоге riscvsifive/build.
Для переноса образов на карту микро-SD необходимо выполнить команды

$ cd  ./tmp-glibc/deploy/images/freedom-u540 $ zcat demo-coreip-cli-freedom-u540.wic.gz | sudo dd of=/dev/sdX bs=512K iflag=fullblock oflag=direct conv=fsync status=progress

где вместо sdX нужно указать имя реального устройства, с которым ваша система видит подключенную к ней карту микро-SD. В нашем случае карта имела в системе имя sdk, которое дальше и будет указываться. Для установки образов достаточно карты размером 8 Гбайт. Если вы возьмете карту большего размера, на ней все равно будут созданы разделы таких размеров, как будто использовалась карта на 8 Гбайт. При желании можно после копирования изменить размер корневого раздела с помощью gparted или иной подходящей программы.

$ zcat demo-coreip-cli-freedom-u540.wic.gz | sudo dd of=/dev/sdk bs=512K iflag=fullblock oflag=direct conv=fsync status=progress [sudo] пароль для user:  
7124549632 байт (7,1 GB, 6,6 GiB) скопирован, 523 s, 13,6 MB/s 
13600+1 записей получено 
13600+1 записей отправлено 
7130334208 байт (7,1 GB, 6,6 GiB) скопирован, 523,467 s, 13,6 MB/s

Отключаем карту микро-SD от сборочного компьютера, переносим ее в гнездо платы HiFive Unleashed и включаем питание платы. Для наблюдения за процессом использовалась консоль программы screen, запущенной на отладочной машине, которая соединена с платой кабелем USB. Вывод консоли начала процесса загрузки платы HiFive Unleashed с созданным образом частично показан ниже.

$ zcat demo-coreip-cli-freedom-u540.wic.gz | sudo dd of=/dev/sdk bs=512K iflag=fullblock oflag=direct conv=fsync status=progress [sudo] пароль для user:  
7124549632 байт (7,1 GB, 6,6 GiB) скопирован, 523 s, 13,6 MB/s 
13600+1 записей получено 
13600+1 записей отправлено 
7130334208 байт (7,1 GB, 6,6 GiB) скопирован, 523,467 s, 13,6 MB/s

Отключаем карту микро-SD от сборочного компьютера, переносим ее в гнездо платы HiFive Unleashed и включаем питание платы. Для наблюдения за процессом использовалась консоль программы screen, запущенной на отладочной машине, которая соединена с платой кабелем USB. Вывод консоли начала процесса загрузки платы HiFive Unleashed с созданным образом частично показан ниже.

$ zcat demo-coreip-cli-freedom-u540.wic.gz | sudo dd of=/dev/sdk bs=512K iflag=fullblock oflag=direct conv=fsync status=progress
[sudo] пароль для user:  
7124549632 байт (7,1 GB, 6,6 GiB) скопирован, 523 s, 13,6 MB/s 
13600+1 записей получено 
13600+1 записей отправлено 
7130334208 байт (7,1 GB, 6,6 GiB) скопирован, 523,467 s, 13,6 MB/s

Отключаем карту микро-SD от сборочного компьютера, переносим ее в гнездо платы HiFive Unleashed и включаем питание платы. Для наблюдения за процессом использовалась консоль программы screen, запущенной на отладочной машине, которая соединена с платой кабелем USB. Вывод консоли начала процесса загрузки платы HiFive Unleashed с созданным образом частично показан ниже.

SiFive FSBL:       2019-09-18-128f282-dirty
Using FSBL DTB
HiFive-U serial #: 00000220
Loading boot payload........


OpenSBI v0.4-21-ga2a7763 (Sep 18 2019 16:39:38)
   ____                    _____ ____ _____
  / __ \                  / ____|  _ \_   _|
 | |  | |_ __   ___ _ __ | (___ | |_) || |
 | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
 | |__| | |_) |  __/ | | |____) | |_) || |_
  \____/| .__/ \___|_| |_|_____/|____/_____|
        | |
        |_|

Platform Name          : SiFive Freedom U540
Platform HART Features : RV64ACDFIMSU
Platform Max HARTs     : 5
Current Hart           : 1
Firmware Base          : 0x80000000
Firmware Size          : 100 KB
Runtime SBI Version    : 0.1

PMP0: 0x0000000080000000-0x000000008001ffff (A)
PMP1: 0x0000000000000000-0x0000007fffffffff (A,R,W,X)


U-Boot 2019.07 (Sep 18 2019 - 16:32:19 +0000)

CPU:   rv64imafdc
Model: SiFive HiFive Unleashed A00
DRAM:  8 GiB
MMC:   spi@10050000:mmc@0: 0
In:    serial@10010000
Out:   serial@10010000
Err:   serial@10010000
Net:   eth0: ethernet@10090000
Hit any key to stop autoboot:  2 ### 1 ### 0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr.uimg
678 bytes read in 3 ms (220.7 KiB/s)
## Executing script at 88100000
9326152 bytes read in 4707 ms (1.9 MiB/s)
## Loading kernel from FIT Image at 88300000 ...
   Using 'conf@sifive_hifive-unleashed-a00-microsemi.dtb' configuration
   Trying 'kernel@1' kernel subimage
     Description:  Linux kernel
     Type:         Kernel Image
     Compression:  gzip compressed
     Data Start:   0x883000fc
     Data Size:    9317433 Bytes = 8.9 MiB
     Architecture: RISC-V
     OS:           Linux
     Load Address: 0x80200000
     Entry Point:  0x80200000
     Hash algo:    sha256
     Hash value:   62f8986a3de46f822f9c75388982836bf6f43c4de9a5cf63d4288c7454f51dc0
   Verifying Hash Integrity ... sha256+ OK
## Loading fdt from FIT Image at 88300000 ...
   Using 'conf@sifive_hifive-unleashed-a00-microsemi.dtb' configuration
   Trying 'fdt@sifive_hifive-unleashed-a00-microsemi.dtb' fdt subimage
     Description:  Flattened Device Tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x88be2e64
     Data Size:    6677 Bytes = 6.5 KiB
     Architecture: RISC-V
     Load Address: 0x82200000
     Hash algo:    sha256
     Hash value:   b704ade210b1ac4161e2abb16a5e0e1a437aae731b9b49e7b5c41f357e4a8e4e
   Verifying Hash Integrity ... sha256+ OK
   Loading fdt from 0x88be2e64 to 0x82200000
   Booting using the fdt blob at 0x82200000
   Uncompressing Kernel Image ... OK
   Using Device Tree in place at 0000000082200000, end 0000000082204a14

Starting kernel ...

Уже самое начало процесса загрузки показывает, что он организован иначе, нежели в образах FU SDK — вместо загрузчика BBL [6, 7] используется OpenSBI [8, 9]. Не будем сейчас вдаваться в детали, а лишь отметим, что загрузка системы в этом варианте во много раз быстрей по сравнению с FU SDK на основе BBL.

По-умолчанию, для входа в систему служит имя пользователя root с пустым паролем (Enter). Изучением полученной системы каждый может заняться самостоятельно, а мы рассмотрим некоторые вопросы настройки создаваемого образа.

Настройка параметров ядра и компонент системы

Настройка параметров и компонент образа описана достаточно подробно в документах [10 — 12]. Система имеет также графический Web-интерфейс Toaster [13] для настройки компонент собираемого образа. Желающие могут изучить в деталях варианты настроек самостоятельно по приведенным в конце ссылкам. Нам же нужно изменить конфигурацию ядра Linux и добавить некоторое число пакетов в образ, что можно сделать вручную, просто редактируя нужные файлы.

Параметры конфигурации ядра определяются файлом riscv-sifive/build/tmp-glibc/work/freedom_u540-oe-linux/linux-mainline/5.2.9+gitAUTOINC+aad39e30fb-r0/linux-freedom_u540-standard-build/.config. Этот файл создается или обновляется в процессе сборки образов на основе файла riscv-sifive/meta-sifive/recipes-kernel/linux/files/freedom-u540/defconfig, содержащего набор конфигурационных параметров ядра, а также других фрагментов конфигурации, размещенный в многочисленных файлах. Файл defconfig достаточно безопасно можно редактировать вручную, если вы представляете смысл и назначение изменяемых параметров. Однако следует отметить, что при создании итоговой конфигурации ядра файл defconfig анализируется в самом начале процесса и некоторые опции, заданные в нем могут быть переопределены другими фрагментами конфигурации.

В нашем случае к заданной по умолчанию конфигурации были лишь добавлены (отредактированы) опции, связанные с трассировкой и отладкой ядра. Подробно останавливаться на них мы не будем, поскольку каждый будет выбирать их самостоятельно в соответствии с задачами. Приведем лишь краткий список опций, которые нужны для трассировки и оценки производительности.

CONFIG_LATENCYTOP=y 
CONFIG_NOP_TRACER=y 
CONFIG_HAVE_FUNCTION_TRACER=y 
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y 
CONFIG_HAVE_DYNAMIC_FTRACE=y 
CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y 
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y 
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y 
CONFIG_TRACER_MAX_TRACE=y 
CONFIG_TRACE_CLOCK=y 
CONFIG_RING_BUFFER=y 
CONFIG_EVENT_TRACING=y 
CONFIG_CONTEXT_SWITCH_TRACER=y 
CONFIG_RING_BUFFER_ALLOW_SWAP=y 
CONFIG_PREEMPTIRQ_TRACEPOINTS=y 
CONFIG_TRACING=y 
CONFIG_GENERIC_TRACER=y 
CONFIG_TRACING_SUPPORT=y 
CONFIG_FTRACE=y 
CONFIG_FUNCTION_TRACER=y 
CONFIG_FUNCTION_GRAPH_TRACER=y 
CONFIG_PREEMPTIRQ_EVENTS=y 
CONFIG_IRQSOFF_TRACER=y 
CONFIG_SCHED_TRACER=y 
CONFIG_HWLAT_TRACER=y 
CONFIG_FTRACE_SYSCALLS=y 
CONFIG_TRACER_SNAPSHOT=y 
CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y 
CONFIG_TRACE_BRANCH_PROFILING=y 
CONFIG_PROFILE_ALL_BRANCHES=y 
CONFIG_STACK_TRACER=y 
CONFIG_DYNAMIC_FTRACE=y 
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y 
CONFIG_FUNCTION_PROFILER=y 
CONFIG_FTRACE_MCOUNT_RECORD=y 
CONFIG_TRACEPOINT_BENCHMARK=y 
CONFIG_PREEMPTIRQ_DELAY_TEST=m

Если редактировать файл вручную вы не рискнете или результаты такого редактирования не устроят (нужные опции будут переопределены в других файлах), можно воспользоваться инструментами devtool, подробно описанными в [12] (параграф 15.3.3 и далее). Поскольку детали процесса в нашем случае несколько отличаются и не вполне очевидны, ниже приведен список команд, которые позволят активизировать на сборочном хосте пакет интерактивной настройки ядра menuconfig.

Из каталога сборки (build) запускаем команду для создания стартового файла конфигурации ядра (.config).

bitbake linux-mainline -c kernel_configme -f

Если вы уже собирали образ с принятыми по умолчанию настройками, файл конфигурации ядра .config уже имеется в дереве исходных кодов и команду можно опустить, но в любом случае ее запуск не нанесет никакого урона. Далее из того же каталога вводим команду

bitbake linux-mainline -c menuconfig

На экране появится новое консольное окно linux-mainline Configuration с выводом процесса запуска команды make menuconfig, используемой ядром Linux для интерактивной настройки конфигурации, а затем в этом окне будет выведен текстовый интерфейс menuconfig.

 
Процесс редактирования параметров конфигурации ничем не отличается от обычной настройки конфигурации ядра Linux [14] и мы не будем здесь останавливаться. После выбора нужных опций не забудьте сохранить результаты.

После редактирования конфигурации ядра следует расширить набор включаемых в образ операционной системы пакетов и утилит в соответствии с вашими потребностями. Компоненты добавляются с помощью переменной CORE_IMAGE_EXTRA_INSTALL += в файле build/conf/local.conf. Полный список доступных пакетов, отсортированных по алфавиту, можно получить с помощью команды bitbake -s. При добавлении нужных вам пакетов можно не задумываться над зависимостями, они будут проверены автоматически с добавлением нужных пакетов без вашего участия. Добавленные в нашем случае приложения показаны ниже.

CORE_IMAGE_EXTRA_INSTALL += "apt numactl ptpd hwloc netperf man tzdata bootchart \ 
                            swig cmake jsoncpp tcpdump"

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

$ MACHINE=freedom-u540 bitbake demo-coreip-cli
…
$ cd  ./tmp-glibc/deploy/images/freedom-u540 $ zcat demo-coreip-cli-freedom-u540.wic.gz | sudo dd of=/dev/sdk bs=512K iflag=fullblock oflag=direct conv=fsync status=progress

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

Заключение

В этой статье были рассмотрены некоторые детали настройки конфигурации ядра и всего процесса разработки с RISC-V и встроенным Linux перед запуском реального приложения. В дальнейшем мы сможем добавлять и проектировать периферийные устройства и разрабатывать соответствующие драйверы для Linux, совместимые с RISC-V платой HiFive Unleashed.

Литература

[1] SiFive Freedom Unleashed SDK, https://github.com/sifive/freedom-u-sdk.

[2] HiFive U RiscV-pc alpha release, https://github.com/tmagik/freedom-u-sdk/releases/download/hifiveu-2.0-alpha.1/.

[3] Architectures/RISC-V/Installing, https://dl.fedoraproject.org/pub/alt/risc-v/disk-images/fedora/rawhide/20190703.n.0/Developer/Fedora-Developer-Rawhide-20190703.n.0-sda.raw.xz.

[4] SiFive OpenEmbedded Layer, https://github.com/sifive/meta-sifive.

[5] Installing Repo, https://source.android.com/setup/build/downloading#installing-repo.

[6] All Aboard, Part 6: Booting a RISC-V Linux Kernel, https://www.sifive.com/blog/all-aboard-part-6-booting-a-risc-v-linux-kernel.

[7] RISC-V Proxy Kernel and Boot Loader, https://github.com/riscv/riscv-pk.

[8] RISC-V Open Source Supervisor Binary Interface (OpenSBI), https://github.com/riscv/opensbi

[9] RISC-V Supervisor Binary Interface Specification, https://github.com/riscv/riscv-sbi-doc/blob/master/riscv-sbi.adoc.

[10] BitBake User Manual, https://www.yoctoproject.org/docs/2.7.1/bitbake-user-manual/bitbake-user-manual.html.

[11] A practical guide to BitBake, https://a4z.bitbucket.io/docs/BitBake/guide.html.

[12] Yocto Project Reference Manual, https://www.yoctoproject.org/docs/2.7.1/ref-manual/ref-manual.html#devtool-modifying-a-recipe.

[13] Toaster User Manual, https://www.yoctoproject.org/docs/2.7.1/toaster-manual/toaster-manual.html.

[14] Menuconfig, https://en.wikipedia.org/wiki/Menuconfig.

Николай Малых

nmalykh@protocols.ru