Какво е кеш?

click fraud protection

Когато се изискват данни от произволен източник, винаги има известно забавяне. Ping към уеб сървъри се измерва в милисекунди, времето за достъп до хранилището може да има латентност в микросекунди, докато латентността на RAM се измерва в тактови цикли на процесора. Разбира се, тези видове скорости биха били немислими само преди няколко десетилетия, но в настоящето те никога не са достатъчно бързи. Скоростта на достъп обикновено е някаква форма на пречка в производителността. Един от начините, по които това може да се реши, е чрез кеширане.

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

Четене на кешове

В кеш за четене данните, които са били заявени преди това, се съхраняват в кеш за по-бърз достъп. В някои сценарии кешът може дори да бъде предварително зареден с данни, позволяващи първата заявка да бъде обслужена от кеша, а не само следващите заявки.

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

Самата RAM също действа като кеш за четене на данни в твърдия диск. В този случай данните за работеща програма се зареждат предварително в RAM, така че процесорът да има по-бърз достъп до тях. След това данните от RAM се кешират допълнително в кеша на процесора, въпреки че процесът за това е много по-сложен, тъй като кешът на процесора се измерва в мегабайти, а не в гигабайти.

Кешове за писане

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

Хибридни кеш памети

Има много начини за работа с кешове, които могат да им позволят да действат както като кеш за четене, така и като запис. Всеки от тези методи обработва операциите за запис по различен начин и има предимства и недостатъци. Трите опции са заобиколно записване, записване чрез и обратно записване. Кешът за запис изцяло пропуска кеша при запис, кешът за запис записва в кеша, но счита операцията за завършена само когато е записана в хранилището. Кешът за обратно записване записва в кеша и след това счита операцията за завършена, разчитайки на кеша да го прехвърли в хранилище, ако е необходимо.

Записването може да бъде полезно, ако очаквате голям обем записи, тъй като минимизира изтичането на кеша. Това обаче означава, че операция, която след това чете някои от тези записани данни, ще се сблъска с поне един пропуснат кеш първия път. Кешовете за запис незабавно кешират операциите за запис, което означава, че резултатът може да бъде сервиран от кеша първия път, когато бъде поискан. Въпреки това, за да се счита за завършена, операцията по запис също трябва да запише данните на диска, което добавя латентност. Кешът за обратно записване има същата полза като сквозния запис, позволявайки записаните данни да бъдат незабавно обслужвани от кеша. Въпреки това не изисква операции за запис, за да се счита за завършен. Това намалява забавянето при запис, но идва с риск от загуба на данни, ако кешът е непостоянен и не завърши записването на данните обратно в хранилището, преди да се загуби захранването.

Как да премахнете данни от кеша?

Един от ограничаващите фактори на всеки кеш е капацитетът. Големият кеш отнема много време за търсене, което отрича голяма част от предимството на използването на кеш на първо място. Технологиите за памет, използвани за кеширане, също са склонни да бъдат по-скъпи от паметта, от която кешират. Ако това не беше така, вероятно това ниво на паметта щеше да смени технологиите на паметта, за да подобри производителността. И двата фактора означават, че кешовете обикновено са сравнително малки, особено в сравнение с носителя за съхранение, от който кешират. RAM има по-малък капацитет от паметта, а кешът на процесора има по-малък капацитет от RAM. SLC кешът има по-малък капацитет от TLC паметта.

Всичко това означава, че често е необходимо данните да се извеждат от кеша, за да се освободи място за нови данни, които трябва да бъдат кеширани. Има набор от различни подходи към това. „Най-малко използван“, предпочита да извади записи от кеша, които имат най-нисък брой достъпи. Това може да бъде полезно за прогнозиране кои записи ще имат най-малък ефект върху бъдещи пропуски в кеша, но също така ще отчете съвсем наскоро добавени записи като имащи малък брой достъпи, което може да доведе до кеш избивам.

„Най-малко използвано“ предпочита да извади записи от кеша, които не са били използвани от известно време. Това предполага, че те не се използват в момента, но не взема предвид дали са били силно използвани преди известно време. „Най-скоро използвани“ предпочита да изхвърли най-скоро използваните записи в кеша, като се предполага, че са били използвани и няма да е необходимо да се използват отново. Най-добрият подход обикновено е комбинация от трите, информирани от статистиките за употреба.

Остаряла информация и рискове за сигурността

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

Конкретно в уебсайтовете също е изключително важно да се определи кои данни могат и кои не могат да бъдат кеширани. Например, напълно добре е голям непроменен JavaScript файл да бъде кеширан. Това спестява на потребителя да го изтегля всеки път и дори може да бъде от полза за други потребители, обслужвани от същия кеш. Не можете обаче да кеширате специфични за сесията данни. Представете си какво би се случило, ако прегледате приложение за съобщения, докато сте влезли като себе си, само за да откриете, че сте получили кеширана версия на съобщенията на друг потребител. За щастие, уеб сървърите могат да определят кои ресурси могат и кои не могат да бъдат кеширани и тези проблеми като цяло са добре известни, така че има малко проблеми като този.

Заключение

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