Что такое кэш?

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

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

Чтение кешей

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

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

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

Запись кешей

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

Гибридные кеши

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

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

Как удалить данные из кеша?

Одним из ограничивающих факторов любого кэша является емкость. Поиск в большом кеше занимает много времени, что сводит на нет большую часть преимуществ использования кеша. Технологии памяти, используемые для кэширования, также имеют тенденцию быть более дорогими, чем память, из которой они кэшируются. Если бы это было не так, вполне вероятно, что на этом уровне памяти были бы изменены технологии памяти для повышения производительности. Оба эти фактора означают, что кэши имеют тенденцию быть относительно небольшими, особенно по сравнению с носителем данных, с которого они кэшируются. ОЗУ имеет меньшую емкость, чем хранилище, а кэш-память ЦП имеет меньшую емкость, чем ОЗУ. Кэш SLC имеет меньшую емкость, чем память TLC.

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

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

Устаревшая информация и риски безопасности

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

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

Вывод

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