Кэширование И Производительность Веб-Приложений

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

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

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

Эта технология присутствует на всех уровнях вычислительных систем.

Процессоры, жесткие диски, серверы и браузеры имеют кэши.



Кэширование и производительность веб-приложений

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

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



Кэш процессора

Начнем разговор о кэшах с самого нижнего уровня — с процессора.

Кэш процессора — это очень быстрая память, которая действует как буфер между процессором (ЦП) и оперативной памятью (ОЗУ).

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

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

Регистры — это самая быстрая память, с которой может работать процессор, которая расположена максимально близко к остальным его механизмам и имеет небольшой объем.

Иногда регистры называют кешем уровня 0 (кэш L0, L — сокращение от Layer).

Процессоры также имеют доступ к еще нескольким уровням кэш-памяти.

Это до четырех уровней кэша, которые соответственно называются кэшами первого, второго, третьего и четвертого уровня (кэш L0 – L4).

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

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



Кэширование и производительность веб-приложений

Структура памяти в некоторых новейших процессорах

Кэш жесткого диска

Жесткие диски (HDD, Hard Disk Drive), используемые для постоянного хранения данных, являются достаточно медленными устройствами по сравнению с оперативной памятью, предназначенной для кратковременного хранения информации.

Однако следует отметить, что скорость постоянного хранения информации увеличивается за счет распространения твердотельных накопителей (SSD, Solid State Drive).

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



Кэширование и производительность веб-приложений

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



О производительности жестких дисков и оперативной памяти

Разница между временным хранением данных в оперативной памяти и постоянным хранением на жестком диске проявляется в скорости работы с информацией, стоимости носителя и его близости к процессору.

Время отклика оперативной памяти составляет десятки наносекунд, тогда как жесткому диску нужны десятки миллисекунд. Разница в производительности дисков и памяти составляет шесть порядков!

Кэширование и производительность веб-приложений

Одна миллисекунда равна миллиону наносекунд.

Простой веб-сервер

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

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

Представим, что между клиентом и сервером нет специальных систем кэширования.

Вот как это выглядит.

Кэширование и производительность веб-приложений

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

при работе с диском.

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

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

Последующие запросы тех же данных будут успешными при поиске в кэше; это известно как «попадание в кэш».

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



Кэширование базы данных

Давайте усложним наш пример, добавив сюда базу данных.

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

Если запросы повторяются, их кэширование с помощью базы данных поможет сократить время ее ответа.

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



Кэширование и производительность веб-приложений

Простой веб-сервер с базой данных Большинство серверов баз данных по умолчанию настроены с оптимальными настройками кэширования.

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



Кэширование ответов веб-сервера

Давайте продолжим развивать наш пример.

Теперь веб-сервер, ранее рассматривавшийся как единое целое, разделен на две части.

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

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

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



Кэширование и производительность веб-приложений

Кэш ответов и кеш приложения Ответы веб-сервера кэшируются в оперативной памяти.

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



Мемоизация функций

Теперь поговорим об оптимизации производительности серверного приложения посредством мемоизации.

Это тип кэширования, используемый для оптимизации работы с ресурсоёмкими функциями.

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

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



Кэширование и производительность веб-приложений

Запоминание функции с помощью таблицы поиска Мемоизация — распространенный метод, используемый для повышения производительности программ.

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



Кэширование браузера

Теперь перейдем к клиентской части и поговорим о кэшировании в браузерах.

Каждый браузер имеет реализацию HTTP-кеша (также называемого веб-кешем), который предназначен для временного хранения материалов, полученных из Интернета, таких как страницы HTML, файлы JavaScript и изображения.

Этот кеш используется, когда ответ сервера содержит правильно настроенные заголовки HTTP, которые указывают браузеру, когда и как долго он может кэшировать ответ сервера.

Перед нами очень полезная технология, которая предоставляет следующие преимущества всем участникам обмена данными:

  • Улучшается пользовательский опыт работы с сайтом, поскольку ресурсы из локального кэша загружаются очень быстро.

    При получении ответа не учитывается время прохождения сигнала от клиента до сервера и обратно (RTT, Round Trip Time), так как запрос не поступает в сеть.

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

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



Кэширование и производительность веб-приложений

Кэширование браузера

Кэширование и прокси-серверы

В компьютерных сетях прокси-серверы могут быть представлены специальным оборудованием или соответствующими приложениями.

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

Кэширование — одна из проблем, которые они решают. Давайте рассмотрим различные типы прокси-серверов.



▍Шлюзы

Шлюз — это прокси-сервер, который пересылает входящие запросы или исходящие ответы, не изменяя их.

Такие прокси-серверы также называются туннелирующими прокси-серверами, веб-прокси, прокси-серверами или прокси-серверами уровня приложения.

Эти прокси-серверы обычно используются, например, всеми клиентами, находящимися за одним брандмауэром, что делает их хорошо подходящими для кэширования запросов.



▍Прямые прокси-серверы

На стороне клиента обычно устанавливается прямой прокси-сервер (часто называемый просто прокси-сервером).

Веб-браузер, настроенный на использование прокси-сервера пересылки, будет отправлять исходящие запросы на этот сервер.

Эти запросы затем будут перенаправлены на целевой сервер, расположенный в Интернете.

Одним из преимуществ прямых прокси является то, что они защищают данные клиента (однако, когда речь идет об обеспечении анонимности в Интернете, безопаснее использовать VPN).



▍Веб-ускорители

Веб-ускоритель — это прокси-сервер, который сокращает время доступа к веб-сайту.

Для этого он заранее запрашивает у сервера документы, которые, скорее всего, понадобятся клиентам в ближайшем будущем.

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



▍Обратные прокси

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

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

Такие прокси выполняют кэширование на стороне сервера и помогают основным серверам обрабатывать большое количество запросов.



▍Пограничное кэширование

Обратные прокси расположены рядом с серверами.

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

Это так называемое периферийное кэширование, представленное сетями доставки контента (CDN, Content Delivery Network).

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

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

Эти серверы, определяющие актуальность информации, полагаются на серверы, хранящие исходные данные.



Кэширование и производительность веб-приложений

Прокси-серверы в инфраструктуре связи между клиентом и сервером

Полученные результаты

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

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

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

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

Правильно настроенная система кэширования может значительно улучшить общую производительность сервера.

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

Уважаемые читатели! Какие технологии кэширования вы используете в своих проектах?

Кэширование и производительность веб-приложений

Теги: #Администрирование сервера #Разработка веб-сайтов #веб-разработка #кэширование #прокси #прокси #веб-сервер

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.