Під час запиту даних з будь-якого джерела завжди є певна затримка. Пінг до веб-серверів вимірюється в мілісекундах, час доступу до пам’яті може мати затримки в мікросекундах, тоді як затримка оперативної пам’яті вимірюється в тактах ЦП. Звичайно, такі швидкості були б немислимими лише кілька десятиліть тому, але зараз вони ніколи не бувають достатньо високими. Швидкість доступу зазвичай є вузьким місцем у продуктивності. Одним із способів вирішення цієї проблеми є кешування.
Кешування — це процес зберігання тимчасової копії ресурсу таким чином, щоб отримати доступ до нього швидше, ніж зазвичай. Існує величезна кількість програмних і апаратних реалізацій. Кеші можуть діяти як кеші читання, кеші запису або обидва.
Читати кеші
У кеш-пам’яті для читання дані, які запитувалися раніше, зберігаються в кеші для швидшого доступу. У деяких сценаріях кеш може бути навіть попередньо завантажений даними, що дозволяє обслуговувати перший запит із кешу, а не лише наступні запити.
Кеш читання, з яким ви, швидше за все, знайомі, це кеш браузера. Тут браузер зберігає локальну копію запитуваних ресурсів. Це означає, що якщо і коли веб-сторінка перезавантажується або завантажується подібна сторінка, яка використовує майже той самий вміст, цей вміст може обслуговуватися з кешу, а не з веб-сервера. Це не тільки означає, що веб-сторінка може завантажуватися швидше, але й зменшує навантаження на Інтернет сервер і зменшує кількість даних, які користувачеві потрібно завантажити, що може бути важливим для metered з'єднання.
Сама оперативна пам'ять також діє як кеш для читання даних на жорсткому диску. У цьому випадку дані для запущеної програми попередньо завантажуються в оперативну пам’ять, щоб ЦП міг отримати до них швидший доступ. Дані з оперативної пам’яті далі кешуються в кеш-пам’ять процесора, хоча процес для цього набагато складніший, оскільки кеш-пам’ять процесора вимірюється в мегабайтах, а не в гігабайтах.
Кеші запису
Кеш запису — це кеш, який може поглинати дані, що записуються на повільніший пристрій. Типовим прикладом цього може бути SLC-кеш у сучасних SSD. Цей кеш не дозволяє читати дані швидше, однак записувати на нього набагато швидше, ніж на флеш-пам’ять TLC або QLC, яка становить решту SSD. Кеш SLC може поглинати операції високошвидкісного запису, а потім вивантажувати ці дані, як тільки це можливо, на флеш-пам’ять TLC, яка пропонує набагато кращу щільність зберігання, але також набагато повільніше для запису. Використання флеш-пам’яті таким чином оптимізує її як для високої швидкості запису, так і для високої щільності зберігання.
Гібридні кеші
Є багато способів обробки кеш-пам’яті, які можуть дозволити їм працювати як кеш читання та запису. Кожен із цих методів обробляє операції запису по-різному та має переваги та недоліки. Три варіанти: повторний запис, наскрізний запис і зворотний запис. Кеш циклічного запису повністю пропускає кеш під час запису, кеш наскрізного запису записує в кеш, але вважає операцію завершеною лише тоді, коли її було записано в сховище. Кеш зворотного запису записує в кеш, а потім вважає операцію завершеною, покладаючись на те, що кеш перенесе його в сховище, якщо це необхідно.
Запис може бути корисним, якщо ви очікуєте великого обсягу записів, оскільки він мінімізує відтік кешу. Однак це означає, що операція, яка потім зчитує будь-які з цих записаних даних, зіткнеться принаймні з одним промахом кешу в перший раз. Наскрізні кеші негайно кешують операції запису, що означає, що результат може бути подано з кешу під час першого запиту. Щоб вважатися завершеною, операція запису також має записати дані на диск, що додає затримку. Кеш із зворотним записом має ті ж переваги, що й наскрізний запис, дозволяючи негайно обслуговувати записані дані з кешу. Однак для того, щоб запис на диск вважався завершеним, не потрібні операції запису. Це зменшує затримку запису, але пов’язане з ризиком втрати даних, якщо кеш-пам’ять є енергонезалежним і він не завершить запис даних назад у сховище до зникнення живлення.
Як видалити дані з кешу?
Одним із обмежуючих факторів будь-якого кеша є ємність. Великий кеш займає багато часу для пошуку, що зводить нанівець значну частину переваг використання кешу. Технології пам’яті, які використовуються для кешування, також, як правило, дорожчі, ніж пам’ять, з якої вони кешують. Якби це було не так, ймовірно, що цей рівень пам’яті змінив би технології пам’яті для підвищення продуктивності. Обидва ці фактори означають, що кеші, як правило, відносно малі, особливо в порівнянні з носієм даних, з якого вони кешуються. Оперативна пам’ять має менший об’єм, ніж сховище, а кеш-пам’ять ЦП – менший об’єм, ніж оперативна пам’ять. Кеш-пам'ять SLC має меншу ємність, ніж пам'ять TLC.
Все це означає, що часто необхідно циклічно видаляти дані з кешу, щоб звільнити місце для нових даних, які потрібно кешувати. Існує цілий ряд різних підходів до цього. «Найменш часто використовувані» віддає перевагу видаленню записів із кешу, які мають найменшу кількість доступу. Це може бути корисно для передбачення того, які записи матимуть найменший вплив на майбутні промахи кешу, але також вважатиме нещодавно додані записи як такі, що мають низьку кількість звернень, що може призвести до кешу відтік.
«Найменш використовуваний» віддає перевагу видаленню записів кешу, які не використовувалися деякий час. Це припускає, що вони зараз не використовуються, але не бере до уваги, чи активно вони використовувалися деякий час тому. «Останні використані» надає перевагу видаленню останніх використаних записів кешу, припускаючи, що вони були використані та не потребують використання знову. Найкращим підходом є, як правило, поєднання всіх трьох на основі статистики використання.
Застаріла інформація та ризики безпеки
Основний ризик кеш-пам’яті полягає в тому, що інформація, яку вони містять, може застаріти. Запис кешу вважається застарілим, якщо вихідні дані оновлено, в результаті чого запис кешу застарів. Важливо регулярно перевіряти, чи оперативна копія, яка надається, все ще збігається з кешованою копією.
Особливо на веб-сайтах також надзвичайно важливо визначити, які дані можна, а які ні – кешувати. Наприклад, для великого незмінного файлу JavaScript цілком нормально зберігати кеш. Це позбавляє користувача від необхідності кожного разу завантажувати його та може навіть принести користь іншим користувачам, які обслуговуються тим самим кеш-пам’яттю. Однак ви не можете кешувати дані сеансу. Уявіть, що станеться, якщо ви перейдете в програму обміну повідомленнями, увійшовши як ви, і виявите, що вам надається кешована версія повідомлень іншого користувача. На щастя, веб-сервери можуть вказувати, які ресурси можна, а які не можна кешувати, і ці проблеми загалом добре відомі, тому таких проблем небагато.
Висновок
Кеш — це частина пам’яті, яка може зберігати деякі нещодавно використані дані в спосіб зберігання, доступ до якого є швидшим, ніж повторний процес звичайного доступу до даних. Ємність кешу зазвичай обмежена, тобто йому потрібно видаляти записи, коли він заповнений. Кеші, як правило, прозорі для користувача, тобто затримка є єдиною ознакою того, що результат було подано через кеш.