Повышение производительности веб-приложений. Лекция 1. Введение в оптимизацию веб-приложений

В последнее время я достаточно долго работал над небольшим курсом лекций по оптимизации веб-приложений, однако некий злой рок преследовал этот курс от очного проведения лекций и записи видео дляTechDays. Рано или поздно это случится, тем временем я решил опубликовать материалы лекций курса в качестве статей, пообещав самому себе регулярно садиться за клавиатуру и превращать каракулеобразные заметки в небольшом потертом «молескине» в осмысленный текст в формате статей. Собственно, это и есть первая лекция курса.

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

Несколько слов о курсе лекций

Курс ориентирован, прежде всего, на платформу ASP.NET, с особенным прицелом на ASP.NET MVC Framework. Тем не менее, базовые принципы и подходы могут быть использованы на разных платформах с использованием разных технологий. Сам автор курса считает платформу ASP.NET наиболее подходящей для эффективного решения задач веб-разработки.

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

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

Язык примеров – C#, основная технология – ASP.NET MVC, на момент написания курса текущая версия четыре developer preview.

Введение в оптимизацию веб-приложений

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

Прежде всего, целью оптимизации является получение оптимальной скорости отклика приложения в ответ на действия пользователя. Пользователем могут выступать: удаленный клиент, работающий через браузер или приложение, удаленный веб-сервис, другое веб-приложение (в случае API вызовов) или локальное приложение, осуществляющее вызов по протоколу HTTP. В конечном итоге, задача оптимизации производительности обеспечить оптимальную скорость отклика для как можно большего количества пользователей.

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

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

  1. Проектирование веб-приложения. При разработке архитектуры следует уделить внимание не только бизнес-процессам и безопасности приложения, а также масштабированию приложения под возрастающей нагрузкой и оптимизации скорости отклика веб-приложения на действия клиента. Важный момент на данном этапе – знать основные методики оптимизации, требующие реализации в архитектуре веб-приложения.
  2. Разработка веб-приложения. При разработке необходимо использовать конкретные методики непосредственно на страницах и во внутренних классах приложения. Здесь важен и подход к написанию кода и качество создаваемого кода, качество алгоритмов и, конечно же, конкретные методики, такие как многопоточная обработка, освобождение потоков и тредов на время ожидания завершения длительных операций и тому подобного. Также, важная часть процесса – оптимизация клиентской части веб-приложения.
  3. Тестирование веб-приложения. При тестировании веб-приложения необходимо не только проверять работоспособность и безопасности, необходимо также тестировать приложение под серьезной нагрузкой. В идеальной ситуации, желательно спрогнозировать нагрузку и добавить 20-30% дополнительной нагрузки при тестировании приложения. Дополнительный запас прочности не столько нужен «для подстраховки», сколько необходим на случай пиковых нагрузок, имеющих обыкновение случаться в самый неожиданный момент.

Основные элементы, влияющие на производительность приложения

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

  1. База данных – непосредственно сервис баз данных, архитектура базы данных, структура данных и хранимые процедуры, физический сервер и дисковая подсистема на которой работает сервис баз данных.
  2. Веб-приложение – само приложение, веб-сервер, сетевой интерфейс, дисковая подсистема и оперативная память сервера.
  3. Канал связи – сетевые интерфейсы между различными серверами, передающими пакеты данных, скорость разрешения DNS-имен, прокси-сервера на стороне провайдера клиента и прочие инфраструктурные элементы.
  4. Веб-браузер клиента – а также сетевой интерфейс, дисковая подсистема, оперативная память клиента.

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

Подходы к оптимизации веб-приложений

Основных подходов к оптимизации несколько:

  1. Использовать многопоточность и избегать блокирующих треды вызовов. Количество тредов, отвечающих за обработку запросов, ограничено, поэтому не продуктивно «замораживать» их на время ожидания завершения длительной операции (удаленный вызов, сложная обработка данных). Ключ к решению проблемы – асинхронная обработка.
  2. Оптимизировать работу с базами данных и сами базы данных. Необходимо сократить количество операций записи и чтения, кешируя часто используемые данные на уровне приложения. В самой базе данных архитектура должна предполагать быстрое выполнение сложных выборок, с использованием оптимальных хранимых процедур. При возможности данные сложных запросов стоит выбирать достаточными порциями, избегая частых повторных обращений. Часть данных, требующих постоянного обновления, можно вынести в хранилище состояния сеанса, кеш приложения или в cookie-файлы и скрытые поля, передаваемые между отправками страниц на сервер.
  3. Оптимизировать обмен данных по сети. Уменьшить количество обменов информацией между клиентом и сервером. Кешируя файлы на клиенте и объединяя много маленьких файлов в один большой можно сэкономить на количестве запросов в обе стороны.
  4. Оптимизировать клиента. Необходимо тестировать производительность приложения, ощущаемую пользователем – то есть не только и не столько скорость генерации страниц, сколько скорость работы интерфейса. На помощь тут приходят асинхронные запросы (ajax), кеширование данных на стороне клиента (local storage, переменные JavaScript, DOM-модель).

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

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