ASP.NET Web Garden - Сколько рабочих процессов мне нужно? - PullRequest
61 голосов
/ 28 января 2010

Какова оптимальная практика для определения того, сколько рабочих процессов следует разрешить для веб-приложения ASP.NET?

На одном сервере, которым я управляю, при создании нового AppPool по умолчанию используется 10 (максимум) рабочих процессов. Другие люди предполагают, что нормальная настройка равна единице.

Какую проблему решают несколько рабочих процессов и каковы методы принятия решения о количестве?

Ответы [ 4 ]

54 голосов
/ 28 января 2010

Рабочие процессы - это способ сегментировать выполнение вашего веб-сайта по нескольким исполняемым файлам. Вы делаете это по нескольким причинам, одна из которых, если один из рабочих забит из-за проблем во время выполнения, не останавливает остальных. Например, если поступает html-запрос, который приводит к тому, что процесс не выполняется, тогда уничтожаются только другие запросы, обрабатываемые этим одним рабочим процессором. Другой пример: один запрос может привести к блокировке других потоков, обрабатываемых одним и тем же работником.

Насколько вам нужно, проведите нагрузочное тестирование. Хит приложение сильно и посмотреть, что происходит только с одним. Затем добавьте еще немного и нажмите снова. В какой-то момент вы достигнете точки насыщения сети компьютеров, дисков, процессоров и оперативной памяти. Вот когда вы знаете, что у вас правильный баланс.

Кстати, вы можете контролировать количество потоков, используемых на рабочий процесс, через файл machine.config. Я полагаю, ключом является maxWorkerThreads.

Теперь, будьте осторожны, если вы используете сеанс, состояние сеанса не разделяется между рабочими процессами. Я вообще все равно рекомендую избегать сессии, но это то, что нужно учитывать.

Для всех намерений и целей вы можете рассматривать каждый рабочий процесс как отдельный веб-сервер. За исключением того, что они работают на одной коробке.

4 голосов
/ 31 марта 2014

Утечки памяти

Другим большим преимуществом является обработка утечек памяти. Иногда сколько бы вы ни пытались оптимизировать свой код, но бывают утечки памяти в самой среде и других сторонних библиотеках. Мы заметили, что в конечном итоге наше приложение достигает очень большого объема памяти и начинает выдавать никаких исключений памяти.

Поэтому нам пришлось установить максимальный лимит виртуальной памяти для рабочего процесса равным 1 ГБ и разрешить запуск нескольких процессов. Вы можете установить максимальный виртуальный лимит даже для одного рабочего процесса, но это приводит к всплескам замедления, так как при перезапуске рабочего процесса все запросы замедляются до тех пор, пока рабочий процесс не наберет хорошую скорость. Поскольку наше приложение имеет внутреннее кэширование (Entity Framework Query Cache, некоторые пулы объектов), каждая из этих вещей замедляет запуск приложения. Именно здесь больше всего мешает отдельный рабочий процесс.

Если имеется несколько рабочих процессов, только один из процессов в режиме перезапуска работает медленно, но другие сохраняют хорошую скорость.

4 голосов
/ 28 января 2010

Рекомендации здесь довольно хорошие: http://msdn.microsoft.com/en-us/library/ms998549.aspx

1 голос
/ 02 января 2017

Другой случай, когда имеет смысл иметь много рабочих процессов, - это если ваше приложение содержит блокировки, препятствующие его распараллеливанию. Обработка изображений на основе GDI + является одним из примеров.

Я нашел это, когда попытался найти решение для моей проблемы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...