Кэширование файлов — Win32 apps

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 3 мин

По умолчанию Windows кэширует данные файлов, которые считываются с дисков и записываются на диски. Это означает, что операции чтения считывают данные файлов из области в системной памяти, известной как системный кэш файлов, а не с физического диска. Соответственно, при операциях записи данные файлов записываются в системный файловый кэш, а не на диск. Такой тип кэша называется кэшем обратной записи. Управление кэшированием осуществляется для каждого файлового объекта.

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

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

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

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

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

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

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

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

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

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

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

FlushFileBuffers .

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

 

 

HTTP-кеширование — HTTP | MDN

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

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

Существует несколько видов кешей, которые можно разделить на две основные категории: приватные кеши и кеши совместного использования. В кешах совместного использования (shared cache) хранятся копии, которые могут направляться разным пользователям. Приватный кеш (private cache) предназначен для отдельного пользователя. Здесь будет говориться в основном о кешах браузеров и прокси, но существуют также кеши шлюзов, CDN, реверсные прокси кеши и балансировщики нагрузки, разворачиваемые на серверах для повышения надёжности, производительности и масштабируемости веб-сайтов и веб-приложений.

Приватный (private) кеш браузера

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

Общий (shared) прокси-кеш

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

Кеширование в HTTP не является обязательным, однако в большинстве случаев бывает полезно повторно использовать ранее сохранённые ресурсы.

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

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

  • Успешно загруженные ресурсы: ответ
    200
    OK на запрос методом GET HTML-документов, изображений или файлов.
  • Постоянные перенаправления: ответ 301 Moved Permanently («перемещено навсегда»).
  • Сообщения об ошибках: ответ 404 Not Found («не найдено»).
  • Неполные результаты: ответ 206 Partial Content («частичное содержимое»).
  • Ответы на запросы отличные от GET, если есть что-либо, подходящее для использования в качестве ключа кеша.

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

Заголовок

Cache-control

Поле Cache-Control общего заголовка HTTP/1.1 используется для задания инструкций по механизму кеширования как в запросах, так и в ответах. Применяется для задания политик кеширования.

Полное отсутствие кеширования

В кеше не должно сохраняться ничего — ни по запросам клиента, ни по ответам сервера. Запрос всегда отправляется на сервер, ответ всегда загружается полностью.

Cache-Control: no-store
Cache-Control: no-cache, no-store, must-revalidate
Кешировать, но проверять актуальность

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

Cache-Control: no-cache
Приватные (private) и общие (public) кеши

Директива «public» указывает, что ответ можно сохранять в любом кеше. Это бывает полезно, если возникает потребность сохранить страницы с HTTP-аутентификацией, или такими кодами ответа, которые обычно не кешируются. Директива же «private» указывает, что ответ предназначен отдельному пользователю и не должен храниться в кеше совместного использования. В этом случае ответ может сохраняться приватным кешем браузера.

Cache-Control: private
Cache-Control: public
Срок действия (Expiration)

Самой важной здесь является директива «max-age=<seconds>» — максимальное время, в течение которого ресурс считается «свежим». В отличие от директивы Expires, она привязана к моменту запроса. К неизменяющимся файлам приложения обычно можно применять «агрессивное» кеширование. Примером таких статических файлов могут быть изображения, файлы стилей (CSS) или скриптов (JavaScript).

Подробнее об этом рассказывается в разделе Свежесть ресурса.

Cache-Control: max-age=31536000
Проверка актуальности

При использовании директивы «must-revalidate» кеш обязан проверять статус ресурсов с истёкшим сроком действия. Те копии, что утратили актуальность, использоваться не должны. Подробнее об этом рассказано ниже, в разделе Валидация кеша.

Cache-Control: must-revalidate

Заголовок

Pragma

Pragma является заголовком HTTP/1.0. Он не описан для HTTP-ответов и, таким образом, не может служить надёжной заменой общему заголовку Cache-Control протокола HTTP/1.1, хотя его поведение аналогично «Cache-Control: no-cache» когда поле заголовка Cache-Control опущено в запросе. Использовать его следует только для совместимости с клиентами HTTP/1.0.

Однажды попав в кеш, ресурс, теоретически, может храниться там вечно. Однако, поскольку объем хранилища конечен, записи периодически приходится оттуда удалять. Этот процесс называют вытеснением данных из кеша (cache eviction). Кроме того, ресурсы могут изменяться на сервере, поэтому кеш требуется обновлять. Поскольку HTTP является клиент-серверным протоколом, сервера не могут сами обращаться к кешам и клиентам при изменении ресурса; им необходимо договориться о сроке действия сохранённой копии. До его истечения ресурс считается свежим (fresh), после — устаревшим (stale). Алгоритмы вытеснения отдают предпочтение «свежим» ресурсам. Тем не менее, копия ресурса не удаляется из кеша сразу же по истечении её срока действия; при получении запроса на устаревший ресурс кеш передаёт его дальше с заголовком If-None-Match (en-US) на случай, если копия все ещё актуальна. Если это так, сервер возвращает заголовок 304 Not Modified («не изменялось»), а тело ресурса не посылает, экономя тем самым трафик.

Вот пример того, как протекает этот процесс при использовании совместного кеша прокси:

Срок действия (freshnessLifetime) вычисляется на основании нескольких заголовков. Если задан заголовок «Cache-control: max-age=N», то срок действия равен N. Если его нет, а это бывает очень часто, проверяется заголовок Expires, и, если он есть, то срок действия берётся равным значению заголовка Expires минус значение заголовка Date. Наконец, если нет ни того ни другого, смотрят заголовок Last-Modified. Если он есть, то срок действия равен значению заголовка Date минус значение заголовка Last-modified разделить на 10. Время устаревания (expirationTime) вычисляется следующим образом:

expirationTime = responseTime + freshnessLifetime - currentAge

где responseTime — это время получения ответа по часам браузера, а currentAge — текущий возраст кеша.

Обновление статических ресурсов (Revved resources)

Чем больше ресурсов может быть взято из кеша, тем быстрее сайт реагирует на запросы и тем выше его производительность. Из этих соображений их «срок годности» имеет смысл делать как можно большим. Однако, возникает проблема с ресурсами, которые обновляются редко и нерегулярно. Как раз их кеширование даёт больше всего выгоды, но сильно затрудняет обновление. Такие ресурсы можно найти на любой веб-странице: файлы скриптов (JavaScript) и стилей (CSS) изменяются редко, но уж если это произошло, обновление надо произвести как можно быстрее.

Веб-разработчики разработали метод, который Стив Сандерс (Steve Sounders) назвал revving[1], что можно перевести как «оборачиваемость». Для редко обновляемых файлов используют особый способ именования: в их URL, обычно в имя файла, добавляют номер релиза или версии. Таким образом, каждая новая версия считается отдельным ресурсом, срок устаревания которого отодвинут далеко в будущее, как правило, на год, или больше. Недостатком этого метода является то, что для получения новых версий ресурса приходится обновлять все ссылки на него — это некоторое усложнение, справиться с которым разработчику помогает цепочка инструментов. Обновление статических ресурсов влечёт за собой обновление и часто изменяемых ресурсов. Когда считываются первые, считываются и новые версии вторых.

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

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

Валидация кеша запускается при нажатии пользователем кнопки перезагрузки. Кроме того, она может выполняться в ходе обычного просмотра страниц, если кешированный ответ включает заголовок «Cache-control: must-revalidate». Другим фактором являются настройки кеширования браузера — можно потребовать принудительной валидации при каждой загрузке документа.

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

Заголовки ETag

Заголовок ответа ETag является непрозрачным для клиентского приложения (агента) значением, которое можно использовать в качестве сильного валидатора. Суть в том, что клиент, например, браузер, не знает, что представляет эта строка и не может предсказать, каким будет её значение. Если в ответе присутствует заголовок ETag, клиент может транслировать его значение через заголовок If-None-Match (en-US) будущих запросов для валидации кешированного ресурса.

Заголовок ответа Last-Modified можно использовать в качестве слабого валидатора. Слабым он считается из-за того, что имеет 1-секундное разрешение. Если в ответе присутствует заголовок Last-Modified, то для валидации кешированного документа клиент может выводить в запросах заголовок If-Modified-Since.

При запросе на валидацию сервер может либо проигнорировать валидацию и послать стандартный ответ 200 OK, либо вернуть ответ 304 Not Modified (с пустым телом), тем самым указывая браузеру взять копию из кеша. В последнем случае в ответ могут входить также заголовки для обновления срока действия кешированного ресурса.

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

Если кеш получает запрос, который можно удовлетворить сохранённым в кеше ответом с заголовком Vary, то использовать этот ответ можно только при совпадении всех указанных в Vary полей заголовка исходного (сохранённого в кеше) запроса и нового запроса.

Это может быть полезно, например, при динамическом предоставлении контента. При использовании заголовка Vary: User-Agent кеширующие сервера, принимая решение об использовании страницы из кеша, должны учитывать агент пользователя. Так можно избежать ситуации, когда пользователи мобильных устройств по ошибке получат десктопную версию вашего сайта. Вдобавок, это может помочь Google и другим поисковым системам обнаружить мобильную версию страницы, и может также указать им на то, что здесь нет никакой подмены контента с целью поисковой оптимизации (Cloaking).

Vary: User-Agent

Поскольку значение заголовка User-Agent различается («varies») у мобильных и десктопных клиентов, закешированный мобильный контент не будет по ошибке отсылаться пользователям десктопов и наоборот.

  • RFC 7234: Hypertext Transfer Protocol (HTTP/1.1): Caching
  • Caching Tutorial – Mark Nottingham
  • HTTP caching – Ilya Grigorik
  • RedBot, инструмент для проверки относящихся к кешу заголовков HTTP .

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

Want to get more involved?

Learn how to contribute.

This page was last modified on by MDN contributors.

Кэширование файлов — приложения Win32

Редактировать

Твиттер LinkedIn Фейсбук Электронная почта

  • Статья
  • 4 минуты на чтение

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

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

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

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

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

В таких случаях кэширование можно отключить. Это делается во время открытия файла путем передачи FILE_FLAG_NO_BUFFERING как значение параметра dwFlagsAndAttributes CreateFile . Когда кэширование отключено, все операции чтения и записи напрямую обращаются к физическому диску. Однако метаданные файла все еще могут кэшироваться. Чтобы сбросить метаданные на диск, используйте функцию FlushFileBuffers .

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

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

Некоторые приложения, такие как антивирусное программное обеспечение, требуют, чтобы их операции записи были немедленно сброшены на диск; Windows предоставляет эту возможность посредством кэширования со сквозной записью. Процесс включает кэширование со сквозной записью для конкретной операции ввода-вывода, передавая флаг FILE_FLAG_WRITE_THROUGH в свой вызов CreateFile . При включенном кэшировании со сквозной записью данные по-прежнему записываются в кэш, но диспетчер кэша записывает данные немедленно на диск, а не использует отложенную запись с задержкой. Процесс также может принудительно сбросить файл, который он открыл, вызвав метод 9.0035 Функция FlushFileBuffers .

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

Высокоскоростной кэш — Amazon File Cache — Amazon Web Services

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

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

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

Как это работает

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

 Нажмите, чтобы увеличить

Введение в Amazon File Cache (0:46)

Почему кеш файлов Amazon?

Amazon File Cache обеспечивает высокоскоростной кэш на AWS, который упрощает обработку файловых данных независимо от того, где они хранятся.

Почему кеш файлов Amazon?

Amazon File Cache обеспечивает высокоскоростной кэш на AWS, который упрощает обработку файловых данных независимо от того, где они хранятся.

Примеры использования

Повышение гибкости рабочей нагрузки мультимедиа


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

Ускорение высокопроизводительных вычислений

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

Сокращение времени обучения машинному обучению (ML)

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

Выполнять интенсивный анализ данных

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

С чего начать

Начните работу с учетной записью AWS

Изучите основы разработки на AWS.

Зарегистрироваться »

Узнайте больше об Amazon File Cache

Ознакомьтесь с часто задаваемыми вопросами.

Подробнее »

Начните использовать Amazon File Cache


Создайте кеш за считанные минуты в консоли Amazon File Cache.

Войти »

Войдите в консоль

Узнайте об AWS

  • Что такое AWS?
  • Что такое облачные вычисления?
  • AWS Разнообразие, равенство и инклюзивность
  • Что такое DevOps?
  • Что такое контейнер?
  • Что такое озеро данных?
  • Облачная безопасность AWS
  • Что нового
  • Блоги
  • Пресс-релизы

Ресурсы для AWS

  • Начало работы
  • Обучение и сертификация
  • Библиотека решений AWS
  • Архитектурный центр
  • Часто задаваемые вопросы по продуктам и техническим вопросам
  • Аналитические отчеты
  • Партнеры AWS

Разработчики на AWS

  • Центр разработчиков
  • SDK и инструменты
  • .