- PVSM.RU - https://www.pvsm.ru -
В моём предыдущем материале [1] речь шла о сравнении производительности ASP.NET Core [2]-приложений, запускаемых в Windows и в среде Linux + Docker, работающих в службе приложений Azure [3]. Эта тема интересна многим — поэтому я решил написать продолжение.
Я снова провёл испытания, используя подход, отличающийся от прежнего лучшей воспроизводимостью, такой, который даёт более надёжные результаты. Теперь я генерирую веб-нагрузку на серверы с помощью облачных инструментов Azure Cloud Agents [5], применяя Visual Studio и VSTS. И, более того, в то время как ранее я выполнял тесты с использованием HTTP, теперь тестирование проводилось с применением HTTPS.
Благодаря отличной работе, проведённой Microsoft, запуск тестов в облаке [5] — это очень просто. Делается это с помощью инструментов Visual Studio Web Performance, с использованием учётной записи VSTS. Я провёл по две серии нагрузочных тестов для каждого из следующих сценариев:
Hello World
и отметка времени.Вот как были настроены тесты:
Результаты тестов (оригинал [6])
Среди выходных данных тестов были сводные показатели, имеющие практическую ценность, отчёты об ошибках и о нарушениях ограничений, касающихся ресурсов, выделенных системам (например — слишком большая нагрузка на CPU).
Пример выходных данных теста (оригинал [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% |
Запросов в секунду, средний показатель (больше — лучше)
Время, в течение которого обрабатываются 95% запросов (меньше — лучше)
Вот [9] — .xlsx-файл с результатами тестирования, а вот [10] — аналогичный .ods-файл.
Почти все нагрузочные тесты на Linux-хосте приводили к превышению допустимой нагрузки на процессор (Processor% Processor Time [11]) с выдачей соответствующих предупреждений. При этом ни один из тестов, проводимых на Windows-хосте, не привёл к появлению подобных предупреждений. Я не вполне уверен в том, что правильно понял документацию по этому показателю производительности, по умолчанию включаемому во все новые нагрузочные тесты, создаваемые в Visual Studio. Если кто-то в этом разбирается — буду благодарен за пояснения.
Я обратил внимание на странную закономерность в графиках VSTS, отражающих производительность и пропускную способность систем в ходе нагрузочного тестирования. В случае с Linux-системами эти графики представляют собой довольно-таки плавные линии. А вот Windows-графики напоминают нечто вроде «пил». Вот соответствующие графики для сценария, в котором в теле ответа содержится 10 Кб данных.
Графики производительности и пропускной способности для Linux
Графики производительности и пропускной способности для 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
Нажмите здесь для печати.