Этот пост является продолжением цикла статей про обновление проекта nopCommerce:
Миграция с .NET Core 2.2 на .NET Core 3.1 на примере реального проекта
Как проапгрейдить существующий проект с ASP.NET MVC на ASP.NET Core. Практическое руководство
nopCommerce - бесплатная CMS с открытым исходным кодом для создания интернет-магазинов. В этой статье мы коснемся вопросов почему мы неуклонно стараемся обновлять платформу нашего приложения. Расскажем что мы добились в плане производительности с .NET 6 и попробуем дать практическую оценку того результата, который мы получили.
Причины миграции
Все кто следит за обновлениями nopCommerce хорошо знают, что мы стараемся обновлять ядро приложения как можно оперативней, этому способствуют постоянно развивающиеся технологии Microsoft, которые находят свое отражение в платформе .NET Core.
Одной из основных целей - это переход к выпуску с долгосрочной поддержкой (LTS). Это обусловлено тем, что текущая версия .NET 5 будет поддерживаться и получать исправления в течение 1.5 лет с момента выпуска. Обновленная версия nopCommerce 4.50 основана уже на платформе .NET 6, которая будет поддерживаться 3 года, что для конечных пользователей играет важную роль, и позволит сообществу предоставить достаточно времени, чтобы обновить свои магазины и плагины к ним. При этом ожидание следующей версии будет сопровождаться регулярными обновлениями, в том числе и по безопасности.
С выходом .NET 6, разработчики Microsoft наиболее полно приблизились к тому, что .NET предоставляет единую платформу для разработки под все имеющиеся типы приложений, начиная от десктопов и веб приложений и заканчивая разработкой под мобильные устройства. Такая унификация открывает перед нами возможность реализовать мобильное приложение для nopCommerce в единой кодовой базе на языке C#, что безусловно будет положительно сказываться на нашем сообществе разработчиков в плане погружения и понимания всей экосистемы nopCommerce.
Также при переходе на .NET 6 мы планировали повысить планку производительности нашего приложения. Скажу наперед, что результаты замеров показали довольно интересные данные с точки зрения эволюции nopCommerce, которыми мы бы хотели поделиться.
Замеры производительности в приложении
В качестве инструмента тестирования мы решили выбрать достаточно популярный SaaS сервис для тестирования нагрузки и масштабируемости - loader.io. В качестве сервера, на котором развернуто приложение, служит среднестатистическая машина, используемая для разработки:
CPU - Intel(R) Core(TM) i5-7400 CPU 3.00 GHz
RAM - 16,0 ГБ
Тесты проводились под управлением Windows 10 (19044.1415) и IIS 10 (10.0.19041.1415).Для теста мы взяли стандартную базу данных, которая поставляется при установке приложения. Все это под управлением MS SQL Server 2019 (19.0.2000).
Для моделирования нагрузки была выбрана конфигурация теста которая будет подключать 250 пользователей в течение минуты. Пользователи будут посещать несколько рандомных страниц приложения. Этого будет достаточно чтобы проследить общую картину поведения приложения, и позволит более наглядно увидеть разницу относительно предыдущих версий.
Далее я приведу таблицу соответствия версий приложения nopCommerce версиям платформы .NET.
nopCommerce |
4.50 |
4.40.4 |
4.30 |
.NET |
.NET 6 |
.NET 5 |
.NET Core 3.1 |
Мы провели подряд 3 одинаковых нагрузочных теста, чтобы получить представление не только о характере нагрузки, но и о потреблении памяти на сервере. Усредненные результаты после нескольких прогонов представлены ниже.
Замер времени отклика (меньше лучше). Наглядно видна тенденция увеличения производительности относительно .NET 5 и .NET Core 3.1 версий - на 46,1% и 65,3% соответственно.
Замер потребления памяти приложения (меньше лучше). Тесты проводились последовательно для каждой платформы без сброса пула приложений. Тут нужно учесть, что накладные расходы по памяти самой платформы .NET увеличились, видимо это неизбежная плата за увеличение производительности. Однако следует отметить, что проведенная оптимизация, обещанная в .NET 6, тут прослеживается.
Давайте теперь более детально рассмотрим как распределялась нагрузка в приложении на платформе.NET 6, и сравним аналогичные данные для тестов на базе .NET 5. Тут важно отметить, что мы стараемся показать общую тенденцию работы системы на разных платформах, а не выявить предельные показатели при которых система будет выходить из состояния равновесия, поскольку в этом играет немаловажную роль технические параметры тестируемого сервера.
Распределение нагрузки в .NET 6
Распределение нагрузки в .NET 5
С точки зрения анализа мы видим интересную картину для платформы .NET 6 - с ростом количества клиентов в секунду график среднего времени отклика держится на достаточном удалении относительно .NET 5. График обновленной версии более сглаженный и имеет меньше всплесков. Хорошим показателем является и то, что обе линии графиков не пересекаются на протяжении всего теста. Это косвенно свидетельствует о возросшей производительности, .NET 6 справляется с тестом несколько легче, нежели .NET 5.
Итоги
Мы в очередной раз убедились, что следование последним технологическим новинкам от Microsoft приносит положительный результат. Кроме повышения производительности мы получили обновленную платформу, которая позволит нам развиваться на новом для нас направлении. Речь конечно о мобильном приложении, путь к которому мы начали еще в версии 4.40, реализовав Web API для нашей платформы, которое охватывает буквально все функции которые предоставляет наша платформа. В угоду увеличения производительности мы имеем чуть большие накладные расходы на потребление памяти, это следует помнить при выборе хостинг-провайдера. Но учитывая, что в среднесрочной перспективе текущая версия безусловно будет доминировать в нашем сообществе среди прочих, то переход на нее кажется наиболее прагматичным решением.
Узнать больше о нашем проекте вы можете на сайте nopcommerce.com или посетив наш репозиторий на GitHub.
Taritsyn
Были ли у вас какие-нибудь проблемы с WebMarkupMin при переходе на .NET 6?