Опубликован: 30.01.2013 | Доступ: свободный | Студентов: 1291 / 162 | Длительность: 17:23:00
Теги: .net, ajax, asp, www, интранет
Лекция 9:

Способы увеличения производительности

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

Общие вопросы производительности веб-приложений

Производительность любого приложения – тема сложная, обширная и очень важная. Если приложение будет работать медленно, это может вызвать серьезные неудобства для пользователя, а также снизить общую эффективность работы пользователя. Поэтому вопросам производительности обычно уделяется серьезное внимание при построении любого приложения. Производительность веб-приложений – это вопрос еще более сложный, чем производительность настольных приложений. Это справедливо, поскольку веб-приложения одновременно обрабатывают запросы от большого количества пользователей, причем количество пользователей заранее неизвестно. Это означает, что разместив веб-приложений в глобальной сети Интернет, есть потенциальная вероятность того, что к нему одновременно могут обращаться тысячи или десятки тысяч пользователей. Именно поэтому при разработке веб-приложений следует уделять серьезное внимание вопросам производительности и масштабируемости приложения.

При работе веб-приложения существенное влияние на производительность оказывают две составляющие:

  • программный код самого веб-сервера;
  • программный код прикладного приложения.

Приложения ASP.NET работают в рамках веб-сервера Internet Information Services, который поставляется в составе семейства операционных систем Windows Server (IIS). Актуальная версия этого веб-сервера – IIS7 – содержит ряд механизмов по увеличению производительности приложений.

При обработке поступающего от клиента HTTP-запроса используется отдельный поток, работающий в рамках процесса веб-сервера. Например, для обработки пяти HTTP-запросов, необходимо инициировать пять потоков в рамках веб-сервера. Аналогично, для обработки двухсот одновременных HTTP-запросов требуется инициировать двести потоков на веб-сервере. Однако, поскольку для создания и очистки потока требуются отдельные ресурсы, это создает дополнительные накладные расходы. Обычно каждый HTTP-запрос обрабатывает на сервере за считанные доли секунды. В этом случае накладные расходы по созданию потоков могут быть сопоставимы со временем непосредственной работы потока. Этот факт создает дополнительные издержки по обработке запроса.

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


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


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

Наиболее частые проблемы веб-приложений, которые снижают производительность приложения:

  • частые и сложные обращения к базе данных в процессе обработки запроса;
  • выполнение сложного программного кода (например, вычислительных операций), который существенно загружает центральный процессор.

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

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

Однако с таким подходом связан ряд проблем. Одна из главных проблем – это проблема устаревания данных в кэше (данные в базе данных обновились, а в кэше нет). Поэтому механизм кэширования требует реализации с учетом этой специфики и должен предусматривать ряд механизмов по обновлению данных в кэше.

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

Краткие итоги

Производительность веб-приложений зависит от реализации веб-сервера и программного кода приложения. Веб-сервер IIS7 содержит ряд механизмов для увеличения производительности приложений. Например, вместо создания потока на каждый HTTP-запрос используется пул готовых потоков. Для увеличения производительности приложения также может использоваться кэширование данных на стороне сервера. Платформа ASP.NET содержит мощный механизм кэширования, который позволяет реализовать этот сценарий.

Марина Воробьева
Марина Воробьева
Виктория Ткаченко
Виктория Ткаченко

Проигрыватель не работает. После нажатия кнопки Play ничего не происходит.