ядро dotnet медленно на Raspberry Pi 2

Среда выполнения ядра Dotnet медленно запускается на Raspberry Pi 2

Raspberry Pi 2 был настроен с использованием tar-файла Lite (Raspbian 10, Buster) с сайта Raspbian.

Я установил openssh, php7.1, dotnet runtime и mono. У меня уже есть сервер RabbitMQ, работающий на отдельном Linux-сервере.

Я использую код отправки для начала работы №1 (hello-world), найденный на сайте RabbitMQ, https://www.rabbitmq.com/getstarted.html

На моем Raspberry Pi 2 я установил следующее

  • PHP 7.1 для тестирования кода отправки PHP в интерфейсе командной строки
  • ядро dotnet 2.2 для тестирования кода отправки C # (как консольное приложение)
  • mono для тестирования кода отправки C # как Framework 4.7.2 (как консольное приложение)

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

Результаты ниже

  • dotnet - Истекшее время = 00: 00: 07.1991475
  • моно - Истекшее время = 00: 00: 04.3602941
  • php - Истекшее время = 00: 00: 00.1396138

У меня создалось впечатление, что кодирование в ядре Dotnet будет быстрее, чем в Framework (с использованием моно).

Я подумал, что это может быть библиотека RabbitMQ (NuGet - RabbitMq.Client)

Итак, мы решили создать два новых проекта только с Hello World в console.write.

Результаты были очень похожи.

  • dotnet - 7 секунд
  • моно - 4 сек
  • php - 0 секунд

Я надеялся написать свое приложение на C #, но пока я не смогу решить проблему с производительностью, похоже, что PHP - лучший вариант для моего проекта.

Есть ли что-нибудь, что я могу попробовать улучшить производительность?

После долгих поисков я обнаружил похожие проблемы, но статьи были старыми и относились к ядру dotnet 2.1 в ранних выпусках. Я как бы надеялся, что к выпуску dotnet core 2.2 поддерживаемый процессор Arm будет лучше. Особенно с развитием Интернета вещей.

Процессор Arm, который я использую в своем Raspberry Pi 2, - ARMv7 rev 5 (v71).

Я попробовал Raspberry Pi 1, 2 и 3 и, к сожалению, получил те же результаты. За исключением Raspberry Pi 1, вы не можете установить dotnet (не поддерживается на процессоре ARMv6), поэтому на нем были протестированы только моно и PHP.

Любые идеи....


person Ian Chilvers    schedule 18.08.2019    source источник
comment
Вы давали приложению какое-то время на разогрев? то есть: насколько вероятно, что все уже было JIT?   -  person Tony Ranieri    schedule 19.08.2019
comment
Просто мысль. Можно ли было бы переместить среду выполнения ядра dotnet в раздел RAM-диска, чтобы улучшить тайминги? Если да, то какие папки вы переместите, а затем создадите символическую ссылку?   -  person Ian Chilvers    schedule 18.09.2019


Ответы (1)


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

  1. Если возможно, перейдите на dotnetcore3.0, что дает значительные преимущества в производительности и запуске.

  2. Включите многоуровневую компиляцию в вашем csproj. Как описано здесь, https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#tiered-compilation

<PropertyGroup>
  <TieredCompilationQuickJit>true</TieredCompilationQuickJit>
  <TieredCompilation>true</TieredCompilation>
</PropertyGroup>
  1. Используйте образы ReadyToRun, включив это в вашем csproj. Как описано здесь, https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#tiered-compilation В csproj.

Также рассмотрите возможность использования функции обрезки для уменьшения двоичных размеров при публикации single-exe. Это уменьшает объем данных, необходимых для чтения с диска для выполнения вашего приложения.

Эта проблема обсуждалась также в контексте Amazon Lambda, время холодного запуска довольно велико. введите здесь описание изображения Пока что лучшим способом является уменьшение размеров dll с использованием ReadyToRun для сокращения времени JIT и TieredCompilation. Эти изменения замечательно сработали для нас в сочетании с dotnetcore3.0.

Здесь есть некоторые рекомендации Скотта Хансельмана https://www.hanselman.com/blog/MakingATinyNETCore30EntirelySelfconhibitedSingleExecutable.aspx

person rasharasha    schedule 29.11.2019