среда, 25 марта 2009 г.

Улучшение производительности web сайтов. Web Garden

Всем привет.

Сегодня я начинаю свой блог и первую статью я посвящу улучшению производительности web сайтов.

Что я хочу рассказать:

Что такое Web Garden


Многие из вас сталкивались с проблемой, когда вашему web приложению трудно справляться с большим количеством подключений. Есть несколько способов решить эту трагедию:
  1. Проапгредить вашу старушку до «Мустанга» - дорого;
  2. Распараллелить web приложение – бесплатно и заманчиво;
  3. Распараллелить чтоб аж Google «завидовал» - в следующем посте (Web Farm).

Остановимся на 2 решении. Данный механизм называется Web Garden и служит для распараллеливания web приложений используя 1 компьютер. Это решение очень простое и не требует дополнительных ресурсов и растрат.

Веб садом является web приложение в котором количество рабочих процессов больше 1. Этот механизм появился с IIS 6, в котором также появилась возможность создавать N пулов под N сайтов (max 2000 pools). Каждый пул в IIS 6 по умолчанию работает в режиме isolation mode, это значит, что каждый пул будет иметь свою память, свой контекст и свои границы приложения. Также это значит, что если сайт «упадет» (упаси Билл конечно), то упадет только этот пул, с сайтами которые в нем существуют, но не весь сервер, как было раньше в IIS 5 %). По скольку пул может работать изолированно, мы можем дать ему возможность создавать еще процессы для того, чтоб приложение могло выдерживать больше подключений. Тем самым мы его распараллеливаем, снижая блокировки на ресурсы, используемые приложением. Все запросы, которые приходят в конкретный пул, разделяются между процессами web сада.


Как настроить Web Garden на IIS6

Рассмотрим как это делается.
  1. В IIS Manager создадим новый пул приложения, в котором будет работать наш сайт, например MyGardenPool.
  2. Затем выбираем в свойствах пула выбираем Properties.
  3. Переходим на вкладку Performance.
  4. В группе Web garden, в поле Maximum number of worker processes устанавливаем количество процессов которое будет выделено вашему пулу. Чтобы приложение работало как web сад, значение должно быть больше 1.
  5. Добавляем web приложение.

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


Преимущества
  1. Легко настраивается;
  2. Надежная и устойчивая обработка web сервером запросов. Если один из процессов в пуле будет работать не стабильно или «упадет» по неизвестным причинам, то его сразу подменить другой процесс из пула.
  3. Меньше блокировок на ресурсы. Когда web garden доходит до состоянии «щас лопну», то каждое новое подключение к серверу распределяется между процессами по карусельному принципу.
  4. Рациональное использование N-ядерной или N-процессорной машины;

Недостатки
  1. Если вы используете сессию для хранения каких то данные, то эти данные не будут переданы новому выделенному процессу, т.к. каждый новый процесс - это сам по себе работающий сайт со своей памятью, потоками и т.д. Эту проблему можно решить, например хранить сессию в SQL Server или State Server.
  2. Если у вас выделяется много процессов, то вы можете проиграть в скорости, т.к. время будет уходить на работу деспетчера процессов ОС.
  3. Выделяя больше процессов, вы выделяете под него память которую он «съедает», тем самым уменьшая память под другие возможности приложения, такие как кэш.

Вывод


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