- PVSM.RU - https://www.pvsm.ru -

Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение

В моём предыдущем материале [1] речь шла о сравнении производительности ASP.NET Core [2]-приложений, запускаемых в Windows и в среде Linux + Docker, работающих в службе приложений Azure [3]. Эта тема интересна многим — поэтому я решил написать продолжение.

Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение - 1 [4]

Я снова провёл испытания, используя подход, отличающийся от прежнего лучшей воспроизводимостью, такой, который даёт более надёжные результаты. Теперь я генерирую веб-нагрузку на серверы с помощью облачных инструментов Azure Cloud Agents [5], применяя Visual Studio и VSTS. И, более того, в то время как ранее я выполнял тесты с использованием HTTP, теперь тестирование проводилось с применением HTTPS.

Выполнение тестов в облачной среде

Благодаря отличной работе, проведённой Microsoft, запуск тестов в облаке [5] — это очень просто. Делается это с помощью инструментов Visual Studio Web Performance, с использованием учётной записи VSTS. Я провёл по две серии нагрузочных тестов для каждого из следующих сценариев:

  • Ответ, в теле которого содержится текст Hello World и отметка времени.
  • Ответ с телом в 1 Кб.
  • Ответ с телом в 10 Кб.
  • Ответ с телом в 50 Кб.
  • Ответ с телом в 100 Кб.

Вот как были настроены тесты:

  • Тесты выполнялись по 5 минут.
  • В начале количество пользователей равнялось 50.
  • Каждые 10 секунд количество пользователей увеличивалось на 10.
  • Максимальным количеством пользователей было 150.
  • Запросы выполнялись из того же региона (Western Europe), где были развёрнуты исследуемые приложения.

Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение - 2

Результаты тестов (оригинал [6])

Среди выходных данных тестов были сводные показатели, имеющие практическую ценность, отчёты об ошибках и о нарушениях ограничений, касающихся ресурсов, выделенных системам (например — слишком большая нагрузка на CPU).

Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение - 3

Пример выходных данных теста (оригинал [7])

Я использовал те же тесты, которые применялись в прошлый раз (найти соответствующий код можно здесь [8]).

Что же у меня получилось теперь?

Анализ результатов

Полученные в этот раз результаты согласуются с теми, которые были получены в прошлый раз, при использовании клиентской системы, подключённой к интернету по проводной сети. А именно, ASP.NET Core-приложение, развёрнутое в Linux с применением Docker-контейнера, оказывается гораздо быстрее, чем оно же, развёрнутое на Windows-хосте (оба варианта работают в рамках соответствующего плана служб приложений). Результаты новых тестов даже сильнее, чем результаты прежних, указывают на превосходство Linux-варианта, особенно — при работе с запросами, предусматривающими возврат ответов с более объёмными телами.

Вот сводные результаты испытаний, отражающие количество запросов, обработанных в секунду (RPS).

Сценарий Linux Windows Linux +%
Hello World 646,6 432,85 +49,38%
Ответ с телом в 1 Кб 623,05 431,95 +44,24%
Ответ с телом в 10 Кб 573,6 361,9 +58,5%
Ответ с телом в 50 Кб 415,5 210,05 +97,81%
Ответ с телом в 100 Кб 294,35 143,25 +105,48%

Вот — среднее время ответа (мс).

Сценарий Linux Windows Linux +%
Hello World 168,85 242,2 -30,28%
Ответ с телом в 1 Кб 171,25 249,8 -31,45%
Ответ с телом в 10 Кб 184,2 292,7 -37,07%
Ответ с телом в 50 Кб 233,3 542,85 -57,02%
Ответ с телом в 100 Кб 365,05 817,35 -55,34%

Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение - 4

Запросов в секунду, средний показатель (больше — лучше)

Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение - 5

Время, в течение которого обрабатываются 95% запросов (меньше — лучше)

Вот [9] — .xlsx-файл с результатами тестирования, а вот [10] — аналогичный .ods-файл.

В чём Linux показывает себя хуже Windows (и так ли это на самом деле)?

Почти все нагрузочные тесты на Linux-хосте приводили к превышению допустимой нагрузки на процессор (Processor% Processor Time [11]) с выдачей соответствующих предупреждений. При этом ни один из тестов, проводимых на Windows-хосте, не привёл к появлению подобных предупреждений. Я не вполне уверен в том, что правильно понял документацию по этому показателю производительности, по умолчанию включаемому во все новые нагрузочные тесты, создаваемые в Visual Studio. Если кто-то в этом разбирается — буду благодарен за пояснения.

Странные графики, касающиеся производительности и пропускной способности Windows-системы

Я обратил внимание на странную закономерность в графиках VSTS, отражающих производительность и пропускную способность систем в ходе нагрузочного тестирования. В случае с Linux-системами эти графики представляют собой довольно-таки плавные линии. А вот Windows-графики напоминают нечто вроде «пил». Вот соответствующие графики для сценария, в котором в теле ответа содержится 10 Кб данных.

Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение - 6

Графики производительности и пропускной способности для Linux

Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение - 7

Графики производительности и пропускной способности для Windows

Другие графики можно найти здесь [12]. Вот графики (Linux [13] и Windows [14]) для сценария, где в теле ответа содержится 50 Кб данных.

Итоги

В свете моих предыдущих испытаний [1] учитывая полученные здесь результаты, могу сказать, что, с точки зрения производительности, в Azure оправдано использование конфигурации Linux + Docker.

Заключительные замечания

Мне нет никакой выгоды от того, чтобы представить Linux в более выгодном свете, чем Windows. Я опубликовал [1] все исходные коды моих тестов и инструкции, касающиеся воспроизведения тестового окружения. Если кто-то подозревает, что я где-то что-то «подкрутил», или сделал что-то неправильно — пусть повторит мои тесты и укажет на мою ошибку. И будет неплохо, если кто-нибудь проведёт проверку моих результатов.

Я решил провести эти тесты производительности и опубликовать результаты лишь из-за того, что планирую создать веб-сервис для приложения, написанного мной на Python. Мне было интересно узнать о том, удастся ли мне получить удовлетворительные результаты в среде Azure с использованием Linux-хоста, на котором работает Docker. Для разработки моего сервиса я планирую использовать PyPy 3 [15], Gunicorn [16], Gevent [17] и Flask [18]. И я полагаю, что проект, основанный на этом стеке технологий, будет работать быстрее аналогичного ASP.NET Core-проекта, использующего сервер Kestrel. Но это — уже совсем другая история, и чтобы говорить об этом с уверенностью — надо провести соответствующие тесты.

Какими стеками технологий вы пользуетесь для разработки веб-сервисов?

Автор: ru_vds

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/364077

Ссылки в тексте:

[1] предыдущем материале: https://habr.com/ru/company/ruvds/blog/555650/

[2] ASP.NET Core: https://docs.microsoft.com/ru-ru/aspnet/core/?view=aspnetcore-5.0

[3] службе приложений Azure: https://docs.microsoft.com/ru-ru/azure/app-service/overview-hosting-plans

[4] Image: https://habr.com/ru/company/ruvds/blog/555652/

[5] Azure Cloud Agents: https://docs.microsoft.com/en-us/vsts/load-test/getting-started-with-performance-testing

[6] оригинал: https://raw.githubusercontent.com/RobertoPrevato/robertoprevato.github.io/master/images/posts/aspcoredocker/load-tests-list.png

[7] оригинал: https://raw.githubusercontent.com/RobertoPrevato/robertoprevato.github.io/master/images/posts/aspcoredocker/loadtest-summary.png

[8] здесь: https://github.com/RobertoPrevato/ASPNetCoreHelloWorld/tree/master/PerformanceTests/ASPNetCoreHelloWorldLoadTestProject

[9] Вот: https://github.com/RobertoPrevato/robertoprevato.github.io/raw/master/documents/aspcoredocker/Linux-vs-Windows-benchmark.xlsx

[10] вот: https://github.com/RobertoPrevato/robertoprevato.github.io/raw/master/documents/aspcoredocker/Linux-vs-Windows-benchmark.ods

[11] Processor% Processor Time: https://docs.microsoft.com/en-us/previous-versions/tn-archive/bb734903(v=technet.10)?redirectedfrom=MSDN

[12] здесь: https://github.com/RobertoPrevato/robertoprevato.github.io/tree/master/images/posts/aspcoredocker

[13] Linux: https://raw.githubusercontent.com/RobertoPrevato/robertoprevato.github.io/master/images/posts/aspcoredocker/linux-50kb-graphs.png

[14] Windows: https://raw.githubusercontent.com/RobertoPrevato/robertoprevato.github.io/master/images/posts/aspcoredocker/windows-50kb-graphs.png

[15] PyPy 3: http://pypy.org/

[16] Gunicorn: http://gunicorn.org/

[17] Gevent: http://sdiehl.github.io/gevent-tutorial/#greenlets

[18] Flask: http://flask.pocoo.org/

[19] Источник: https://habr.com/ru/post/555652/?utm_source=habrahabr&utm_medium=rss&utm_campaign=555652