2010-01-27 9 views
52

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

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

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

+1

Я не был уверен, что если это будет более уместно здесь или на ServerFault, сообщите мне, если я сделал неправильный выбор, и я его переведу. –

+4

Идите вперед и спросите в обоих местах. Я думаю, что ваш вопрос здесь уместен. Специфика развертывания ASP.Net часто относится к области знаний разработчика, особенно в том, что касается оптимизации приложений. – DOK

+6

Я согласен с DOK. Оба места подходят. Dev's часто являются теми, кто должен рассказать сетевым ребятам, как настроить сервер. Из-за этого они должны иметь эту информацию. – NotMe

ответ

47

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

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

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

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

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

+1

На самом деле это была проблема с состоянием сеанса, которое вызвало этот вопрос (см. Http://stackoverflow.com/questions/2147578/asp-net-session-state-and -кратный-рабочий-процессы). Благодарим за полезный ответ (+1) –

+2

По умолчанию, как правило, один. Ваш сервер, который по умолчанию имеет значение 10, должен быть изменен, чтобы изменить его значения по умолчанию. – NotMe

+1

@ChrisLively, состояние сеанса разделяется между рабочими процессами, infact. Состояние сеанса также распределяется между несколькими веб-сайтами, имеющими одинаковое имя файла cookie. –

4

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

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

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

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

1

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

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