Тарифы Услуги Сим-карты

Что такое кэш в телефоне и компьютере. Но что, если мой контент изменяется? Что такое кеширование

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

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

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

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

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

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

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

Итак, кэширование чтения основано на предсказании следующих обращений к диску за данными (обычно расположенными непосредственно вслед за только что прочитанными) и помещении их в быстродействующую память перед тем, как они потребуются системе. Поскольку программа, отвечающая за кэширование, считывает информацию в память до того, как за ней обратятся, такой механизм часто называют буфером с упреждающим чтением (read look-ahead buffer). С точки зрения еще более существенного повышения производительности не имеет смысла размещать кэш-буфер и соответствующую программу в основной памяти компьютера, так как тогда она потребует часть вычислительных ресурсов центрального процессора. Дисковый накопитель сам способен справиться с упреждающим кэшированием, не отвлекая компьютер на хлопоты, связанные с управлением кэш-памятью.

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

Сегодня, когда большинство производителей использует от 128 до 512 килобайт кэш-памяти, компания Seagate в своих наиболее производительных накопителях Barracuda и Cheetah увеличила ее объем до полновесного мегабайта (предусмотрев возможность ее наращивания в четыре раза), а винчестеры Elite рекордной емкости (23 гигабайта) сразу оснащает 2 мегабайтами кэша. Это необходимо с учетом тех приложений, для которых предназначены указанные жесткие диски - для рабочих станций и серверов класса "хай-энд", мини- и суперкомпьютеров. В каждом из этих случаев постоянно требуется прочтение большого количества данных при максимальной скорости передачи. Настолько быстро, насколько только возможно.

Адаптивное кэширование Каждый раз, когда компьютер обращается за данными, которые уже находятся в кэше, запрос называется "попаданием в кэш". Если же запрошенных данных в кэше не оказалось и накопитель должен привести в действие свою механику и прочитать их с дисков, говорят о "промахе". О том, насколько эффективно работает программа (или алгоритм) кэширования, легче всего судить по соотношению попаданий и промахов. Сравнивая число попаданий с числом промахов, получают так называемый "рейтинг попаданий" для примененной схемы кэширования.

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

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

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

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

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

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

Роман Соболенко,по материалам Seagate

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

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

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

- Кэширование может работать не для всех пользователе й - Вы открываете страницу - она загружается быстро. Но так ли это для всех пользователей? Кэширование очень часто позволяет оптимизировать время загрузки для большинства посетителей, но часто в реальности Вам надо чтобы страница загружалась быстро для всех без исключения (если следовать принципу six sigma). На практике запрос может промахиваться мимо кэша всегда для одного и того же пользователя, что еще более усугубляет ситуацию (Прим. переводчика : Я знаю совершенно реальный случай, когда в электронном магазине кэш срабатывал для 99% процентов пользователей и не работал для 1% посетителей имевших длинную историю покупок, как результат магазин работал медленно как раз для активных покупателей).

- Кэширование может уводить Вас в сторону от решения проблемы - Вы смотрите на наиболее медленно загружающуюся страницу и пытаетесь ее оптимизировать. Но хитрость здесь в том, что в реальности проблема с производительностью может лежать в другой области (опять six sigma). Вы «залечиваете» проблему кэшируя, например, страницу целиком, но сама проблема с производительностью никуда не уходит и остается скрытой (Прим. переводчика : с тем чтобы всплыть на других страницах еще и еще и еще раз).

- Управление кэшем в реальности непростая задача - Вы когда-нибудь боролись с "убеганием кэша " или с ситуацией когда большое количество элементов кэша инвалидируются одновременно?

Альтернативный подход

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

Что это за способы?

Перед тем как вводить оптимизацию убедитесь что Вы прошлись по этому достаточно простому списку:

- Вы понимаете план исполнения каждого запроса? Если нет, установите long_query_time=0 и используйте команду mk-query-digest, чтобы получить полный список запросов. Выполните для каждого из них EXPLAIN, проанализируйте план исполнения.

Вы используете SELECT * чтобы потом использовать только небольшой набор столбцов? Или вы выбираете из БД много строк, но используете только некоторые из них? Если это так - то вы выбираете слишком много данных, ограничивая оптимизацию уровня СУБД, такую например как использование индексов.

Знаете ли Вы сколько именно запросов Вы используете для генерации одной страницы? Все ли они действительно необходимы? Можно ли какие-то из этих запросов превратить в один запрос или вообще убрать? (Прим. переводчика : Очень распространенная проблема. Реально знаю случай когда на странице отображался список учеников в классе, а затем в цикле для каждого ученика запрашивалась дополнительная информация, включая название класса. После переделки количество запросов сократилось с 61 до 3-х).

Думаю что как вывод можно сказать: «Оптимизация очень редко уменьшает сложность приложения. Старайтесь избегать усложнения, за счет оптимизации только того, что действительно надо оптимизировать» - цитата со слайда Джастина - instrumentation-for-php .

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

Прим. переводчика : Совершенно реальный диалог произошедший не так давно:
- Так у нас проблемы с производительностью, надо добавить кэширование, вертикальное партиционирование и NoSQL DB для логинов
- Парни - я тут посмотрел EXPLAIN - у Вас fullscan запрос на 4,000 строк, я попробовал создать индекс- все ускорилось в 26 раз.

Несколько замечаний к переводу

1. Термин cache stampeding - я перевел как убегание кэша (был соблазн перевести как «просрачивание», но это было бы неправильно). Если коротко, это ситуация, когда например определенный запрос выполняется достаточно долго и результаты этого запроса кэшируются, когда затем эти данные рано или поздно уходят из кэша, и одновременно рендерится 10 страниц на которых эти данные нужны, то в БД отправляется 10 медленных запрсов, вместо одного. Обычно с этим борются пере запрашивая данные до того как они будут выкинуты из кэша. см например
2. Хочу обратить внимание, что в статье не говорится что кэшировать данные не надо. Их надо кэшировать, но только после того как Вы попробуете несколько простых способов оптимизации запросов к БД. Иными словами начинать надо с простого.

Всем привет! Проверяя блоги людей, заметил, что буквально у каждого второго начинающего блогера отсутствует плагин кэширования. Почему? Ведь его установка и настройка занимает буквально пару минут! А причина банальна — люди не знаю, что такое кэширование и зачем его так важно использовать для своего сайта. Раз так, то давайте поговорим об этом, чтобы все стало предельно понятно.

Сейчас я постараюсь на пальцах, предельно простым и понятным языком объяснить вам, что такое кэширование и почему его так важно использоваться. И так, человек заходит на ваш блог и видит одну из его страниц. Откуда эта страница берется? На сервере ее не найти в виде обычного html файла, который можно было бы открыть, посмотреть или отредактировать. Страница создается «на лету»:

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

Все это сливается воедино на стороне сервера, преобразуется в html код (сам WordPress работает с серверным языком программирования php), который отправляется на компьютер пользователя, где с помощью браузер отображается на экране монитора. Сложно? Не стоит вникать в детали, главное, что вы должны понять — страниц блога нет как таковых, они формируются для каждого посетителя каждый раз заново! Представляете, какие мощи на это нужно задействовать?

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

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

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

Кэширование страниц сайта на WordPress

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

1. Hyper Cache — пожалуй, мой любимый плагин кэширования. У него есть одна замечательная фишка — администратору всегда показывается оригинал, а не материал из кэша. Таким образом, некоторые простые вещи (скажем, стили) можно править «на живу», то есть сразу на рабочем блоге. Результат этих действий виден только тебе, как админу, а рядовые пользователи видят картинку из кэша. Если что-то пойдет не так, то проблему можно будет быстро решить, читатели же этого даже не заметят.

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

2. WP Super Cache — еще один отличный плагин. Именно его я использую на этом блоге. Его отличительная особенность — кэширование страниц блога не только для пользователей персональных компьютеров, но и для людей, зашедших к вам на блог с помощью мобильных устройств — телефон, планшет и так далее. Главное все настроить в соответствие с

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

Цель лекции : изучить принципы использования кэширования при создании Web-приложений. На практических примерах рассмотреть возможности ASP . NET по организации различных видов кэширования как целых страниц, так и их частей.

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

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

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

Основы кэширования в ASP.NET

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

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

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

Упомянутые виды кэширования стали основой для создания еще двух разновидностей.

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

Рассмотрим основные аспекты применения кэширования в ASP . NET

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

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

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

Создадим новое Web- приложение , откроем редактор кода страницы и введем следующую команду в обработчик события Page_Load :

Response.Write(DateTime.Now.ToString());

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


Рис. 9.1.

Добавим данную страницу в кэш . Для этого добавим к файлу страницы директиву

<%@ OutputCache Duration="10" VaryByParam="None" %>

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

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

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

Схема работы кэша

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

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

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


Алгоритм кэширования в браузерах

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

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

Кэш в Windows

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

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

Кэш на андройде

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

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