ASP.NET Web Garden - Сколько рабочих процессов мне нужно?
Как лучше всего решать, сколько рабочих процессов разрешить для веб-приложения ASP.NET?
На одном сервере, которым я управляю, при создании нового AppPool по умолчанию используется 10 (максимум) рабочих процессов. Другие люди предполагают, что нормальная настройка - одна.
Какую проблему решают несколько рабочих процессов и каковы методы принятия решения о том, сколько?
4 ответа
Рабочие процессы - это способ сегментировать выполнение вашего веб-сайта по нескольким исполняемым файлам. Вы делаете это по нескольким причинам, одна из которых, если один из рабочих забит из-за проблем во время выполнения, не останавливает остальных. Например, если поступает html-запрос, который приводит к тому, что процесс не выполняется, тогда уничтожаются только другие запросы, обрабатываемые этим одним рабочим процессором. Другим примером является то, что один запрос может вызвать блокировку для других потоков, обрабатываемых одним и тем же работником.
Насколько вам нужно, проведите нагрузочное тестирование. Хит приложение сильно и посмотреть, что происходит только с одним. Затем добавьте еще немного и нажмите снова. В какой-то момент вы достигнете точки насыщения сети компьютеров, диска, процессора и оперативной памяти. Вот когда вы знаете, у вас правильный баланс.
Кстати, вы можете контролировать количество потоков, используемых на рабочий процесс, через файл machine.config. Я считаю, что ключ maxWorkerThreads.
Теперь, будьте осторожны, если вы используете сеанс, состояние сеанса не разделяется между рабочими процессами. Я вообще рекомендую избегать сессии в любом случае, но это кое-что, чтобы рассмотреть.
В любом случае вы можете рассматривать каждый рабочий процесс как отдельный веб-сервер. За исключением того, что они работают на одной коробке.
Утечки памяти
Другим большим преимуществом является обработка утечек памяти. Иногда сколько бы вы ни пытались оптимизировать свой код, но бывают утечки памяти в самой среде и других сторонних библиотеках. Мы заметили, что в конечном итоге наше приложение достигает очень большого объема памяти и начинает давать никаких исключений памяти.
Поэтому нам пришлось установить максимальный предел виртуальной памяти для рабочего процесса равным 1 ГБ и разрешить запуск нескольких процессов. Вы можете установить максимальный виртуальный лимит даже для одного рабочего процесса, но это приводит к всплескам замедления, так как, когда рабочий процесс перезапускается, все запросы замедляются до тех пор, пока рабочий процесс не наберет хорошую скорость. Поскольку наше приложение имеет внутреннее кэширование (Entity Framework Query Cache, некоторые пулы объектов), каждая из этих вещей замедляет запуск приложения. Это где один рабочий процесс вредит больше всего.
Если имеется несколько рабочих процессов, только один из процессов в режиме перезапуска работает медленно, но другие сохраняют хорошую скорость.
Рекомендации здесь довольно хороши: http://msdn.microsoft.com/en-us/library/ms998549.aspx
Другой случай, когда имеет смысл иметь много рабочих процессов, - это если ваше приложение содержит блокировки, препятствующие его распараллеливанию. Обработка изображений на основе GDI+ является одним из примеров.
Я нашел это, когда попытался найти решение для моей проблемы.