- .net Core on Windows vs Linux
- 3 Answers 3
- Hot Network Questions
- Subscribe to RSS
- Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение
- Выполнение тестов в облачной среде
- Анализ результатов
- В чём Linux показывает себя хуже Windows (и так ли это на самом деле)?
- Странные графики, касающиеся производительности и пропускной способности Windows-системы
- Итоги
- Заключительные замечания
.net Core on Windows vs Linux
ASP.Net Core runs on both Windows and Linux Docker containers. Considering Linux hosts are cheaper than Windows hosts, what is the benefit of running your app on IIS/Windows vs Nginx/Linux if one doesn’t require the full .Net framework?
3 Answers 3
A study by Roberto Prevato suggests that you’ll be better off running it on Linux (!), at least for ASP.NET Core.
Results are consistent with those obtained generating load from a computer connected through wire to the internet: the same ASP.NET Core application deployed in Linux and Docker is much faster than one deployed in Windows host (both inside Application Service Plan). These new tests show an even stronger dominance of the application hosted in Linux, especially when serving responses with bigger bodies.
A short summary of the results he got:
Requests per second (higher is better):
Scenario Linux Windows +% Hello World 646.6 432.85 +49.38% 1KB 623.05 431.95 +44.24% 10KB 573.6 361.9 +58.5% 50KB 415.5 210.05 +97.81% 100KB 294.35 143.25 +105.48%
Response Time (lower is better):
Scenario Linux Windows -% Hello World 168.85 242.2 -30.28% 1KB 171.25 249.8 -31.45% 10KB 184.2 292.7 -37.07% 50KB 233.3 542.85 -57.02% 100KB 365.05 817.35 -55.34%
There is no clear cut benefit. This is the same argument as why would you want to run rails, jboss, on other platforms. Since you are running the same app, there are not many considerations to account for. There are features in windows that you may wish to have such as dns caching. Of if you would prefer to use web listener, and not kestrel, but that would have to largely depend on what you are doing.
If you really care about your http transports, or which timezone database .net will use, then you can make such a determination. For most users, there is not a major benefit. If you wish to have AD login’s then you pretty much have to use windows, and IIS, since you need a server that is part of the active directory domain.
Just remember, linux does have a free option, but most paid enterprise support for linux is usually the same, if not more expensive than windows.
The features that you are highlighting such as «There are features in windows that you may wish to have such as dns caching.» can easily be implemented in Linux. If the benchmark above are comparing apples against apples, then the numbers are relevant.
Most of the performance tests conducted recently would beg to differ. A 50% RPS difference is clear cut. There are definitely niche differences, such as native AD support, though openAD would facilitate that on Linux, for people with the experience to set it up. Given the performance test results, and the fact that Linux offers easier and generally more secure production deployments, I’m curious what reasons people might need to choose windows. A same-server Sharepoint integration? 🙂
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.14.43533
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Сравнение производительности ASP.NET Core-проектов на Linux и Windows в службе приложений Azure. Продолжение
В моём предыдущем материале речь шла о сравнении производительности ASP.NET Core-приложений, запускаемых в Windows и в среде Linux + Docker, работающих в службе приложений Azure. Эта тема интересна многим — поэтому я решил написать продолжение.
Я снова провёл испытания, используя подход, отличающийся от прежнего лучшей воспроизводимостью, такой, который даёт более надёжные результаты. Теперь я генерирую веб-нагрузку на серверы с помощью облачных инструментов Azure Cloud Agents, применяя Visual Studio и VSTS. И, более того, в то время как ранее я выполнял тесты с использованием HTTP, теперь тестирование проводилось с применением HTTPS.
Выполнение тестов в облачной среде
Благодаря отличной работе, проведённой Microsoft, запуск тестов в облаке — это очень просто. Делается это с помощью инструментов Visual Studio Web Performance, с использованием учётной записи VSTS. Я провёл по две серии нагрузочных тестов для каждого из следующих сценариев:
- Ответ, в теле которого содержится текст Hello World и отметка времени.
- Ответ с телом в 1 Кб.
- Ответ с телом в 10 Кб.
- Ответ с телом в 50 Кб.
- Ответ с телом в 100 Кб.
- Тесты выполнялись по 5 минут.
- В начале количество пользователей равнялось 50.
- Каждые 10 секунд количество пользователей увеличивалось на 10.
- Максимальным количеством пользователей было 150.
- Запросы выполнялись из того же региона (Western Europe), где были развёрнуты исследуемые приложения.
Среди выходных данных тестов были сводные показатели, имеющие практическую ценность, отчёты об ошибках и о нарушениях ограничений, касающихся ресурсов, выделенных системам (например — слишком большая нагрузка на CPU).
Пример выходных данных теста (оригинал)
Я использовал те же тесты, которые применялись в прошлый раз (найти соответствующий код можно здесь).
Что же у меня получилось теперь?
Анализ результатов
Полученные в этот раз результаты согласуются с теми, которые были получены в прошлый раз, при использовании клиентской системы, подключённой к интернету по проводной сети. А именно, 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% запросов (меньше — лучше)
Вот — .xlsx-файл с результатами тестирования, а вот — аналогичный .ods-файл.
В чём Linux показывает себя хуже Windows (и так ли это на самом деле)?
Почти все нагрузочные тесты на Linux-хосте приводили к превышению допустимой нагрузки на процессор (Processor\% Processor Time) с выдачей соответствующих предупреждений. При этом ни один из тестов, проводимых на Windows-хосте, не привёл к появлению подобных предупреждений. Я не вполне уверен в том, что правильно понял документацию по этому показателю производительности, по умолчанию включаемому во все новые нагрузочные тесты, создаваемые в Visual Studio. Если кто-то в этом разбирается — буду благодарен за пояснения.
Странные графики, касающиеся производительности и пропускной способности Windows-системы
Я обратил внимание на странную закономерность в графиках VSTS, отражающих производительность и пропускную способность систем в ходе нагрузочного тестирования. В случае с Linux-системами эти графики представляют собой довольно-таки плавные линии. А вот Windows-графики напоминают нечто вроде «пил». Вот соответствующие графики для сценария, в котором в теле ответа содержится 10 Кб данных.
Графики производительности и пропускной способности для Linux
Графики производительности и пропускной способности для Windows
Другие графики можно найти здесь. Вот графики (Linux и Windows) для сценария, где в теле ответа содержится 50 Кб данных.
Итоги
В свете моих предыдущих испытаний учитывая полученные здесь результаты, могу сказать, что, с точки зрения производительности, в Azure оправдано использование конфигурации Linux + Docker.
Заключительные замечания
Мне нет никакой выгоды от того, чтобы представить Linux в более выгодном свете, чем Windows. Я опубликовал все исходные коды моих тестов и инструкции, касающиеся воспроизведения тестового окружения. Если кто-то подозревает, что я где-то что-то «подкрутил», или сделал что-то неправильно — пусть повторит мои тесты и укажет на мою ошибку. И будет неплохо, если кто-нибудь проведёт проверку моих результатов.
Я решил провести эти тесты производительности и опубликовать результаты лишь из-за того, что планирую создать веб-сервис для приложения, написанного мной на Python. Мне было интересно узнать о том, удастся ли мне получить удовлетворительные результаты в среде Azure с использованием Linux-хоста, на котором работает Docker. Для разработки моего сервиса я планирую использовать PyPy 3, Gunicorn, Gevent и Flask. И я полагаю, что проект, основанный на этом стеке технологий, будет работать быстрее аналогичного ASP.NET Core-проекта, использующего сервер Kestrel. Но это — уже совсем другая история, и чтобы говорить об этом с уверенностью — надо провести соответствующие тесты.
Какими стеками технологий вы пользуетесь для разработки веб-сервисов?