Vad är en cache?

click fraud protection

När du begär data från valfri källa finns det alltid en viss fördröjning. Ping till webbservrar mäts i millisekunder, lagringsåtkomsttid kan ha fördröjningar i mikrosekunder medan RAM-latens mäts i CPU-klockcykler. Naturligtvis skulle den här typen av hastigheter ha varit otänkbara för bara några decennier sedan, men i nutid är de aldrig tillräckligt snabba. Åtkomsthastighet är regelbundet någon form av flaskhals i prestanda. Ett av sätten detta kan lösas är med cachning.

Cachning är en process för att lagra en tillfällig kopia av en resurs på ett sätt så att den kan nås snabbare än normalt. Det finns ett stort utbud av implementeringar både inom mjukvara och hårdvara. Cachar kan fungera som läscacher, skrivcacher eller båda.

Läs cacher

I en läs cache lagras data som har begärts tidigare i en cache för snabbare åtkomst. I vissa scenarier kan cachen till och med laddas i förebyggande syfte med data så att den första begäran kan betjänas från cachen snarare än bara efterföljande förfrågningar.

Läscachen som du med största sannolikhet känner till är webbläsarens cache. Här lagrar webbläsaren en lokal kopia av begärda resurser. Detta innebär att om och när webbsidan laddas om eller en liknande sida laddas som använder mycket av samma innehåll, kan det innehållet serveras från cachen snarare än webbservern. Detta innebär inte bara att webbsidan kan laddas snabbare, utan det minskar också belastningen på webben server och minskar mängden data som användaren behöver ladda ner vilket kan vara viktigt på uppmätta anslutningar.

Själva RAM-minnet fungerar också som en läscache för data i hårddisken. I det här fallet laddas data för ett pågående program i förebyggande syfte in i RAM-minnet så att processorn kan komma åt det snabbare. Data från RAM-minnet cachelagras sedan vidare till CPU-cachen, även om processen för detta är mycket mer komplex eftersom CPU-cachen mäts i megabyte inte gigabyte.

Skriv cacher

En skrivcache är en cache som kan absorbera data som skrivs till en långsammare enhet. Ett vanligt exempel på detta skulle vara SLC-cachen i moderna SSD: er. Denna cache tillåter inte data att läsas snabbare, det är dock mycket snabbare att skriva till än det är att skriva till TLC- eller QLC-blixten som utgör resten av SSD: n. SLC-cachen kan absorbera skrivoperationer i hög hastighet och laddar sedan av den datan så snart den kan till TLC-flashen som erbjuder mycket bättre lagringstäthet, men är också mycket långsammare att skriva till. Att använda flashminnet på detta sätt optimerar det för både snabba skrivhastigheter och hög lagringstäthet.

Hybridcacher

Det finns många sätt att hantera cacher som kan låta dem fungera som både läs- och skrivcache. Var och en av dessa metoder hanterar skrivoperationer på olika sätt och har fördelar och nackdelar. De tre alternativen är omskrivning, genomskrivning och återskrivning. En omskrivningscache hoppar helt över cachen när den skriver, genomskrivningscachen skriver till cachen men betraktar endast operationen som slutförd när den har skrivits till lagring. Återskrivningscachen skriver till cachen och betraktar sedan operationen som slutförd, och förlitar sig på att cachen överför den till lagring om det behövs.

Omskrivning kan vara användbart om du förväntar dig en stor volym skrivningar eftersom det minimerar cache-churn. Det betyder dock att en operation som sedan läser någon av dessa skrivna data kommer att möta minst en cachemiss första gången. Genomskrivningscacher cachelagrar omedelbart skrivoperationer vilket innebär att resultatet kan serveras från cachen första gången det begärs. För att betraktas som komplett måste en skrivoperation även skriva data till disken, vilket lägger till latens. En återskrivningscache har samma fördel som en genomskrivning, vilket gör att skrivna data omedelbart kan betjänas från cachen. Det kräver dock inga skrivoperationer för att skriva till disk för att anses vara komplett. Detta minskar skrivfördröjningen men medför risk för dataförlust om cachen är flyktig och den inte slutför att skriva tillbaka data till lagringen innan strömmen går förlorad.

Hur tar man bort data från cachen?

En av de begränsande faktorerna för varje cache är kapacitet. En stor cache tar lång tid att söka, vilket förnekar en stor del av fördelen med att använda en cache i första hand. Minnestekniker som används för cachning tenderar också att vara dyrare än minnet de cachelagrar från. Om detta inte var fallet är det troligt att den minnesnivån skulle ha bytt minnesteknik för att förbättra prestandan. Båda dessa faktorer betyder att cacharna tenderar att vara relativt små, särskilt jämfört med lagringsmediet de cachelagrar från. RAM har mindre kapacitet än lagring och CPU-cache har mindre kapacitet än RAM. SLC-cachen har mindre kapacitet än TLC-minnet.

Allt detta innebär att det ofta är nödvändigt att cykla ut data från cachen för att frigöra utrymme för ny data som behöver cachelagras. Det finns en rad olika tillvägagångssätt för detta. "Minst frekvent använd", föredrar att vräka cacheposter som har det lägsta antalet åtkomster. Detta kan vara användbart för att förutsäga vilka poster som kommer att ha minst effekt på framtida cachemissar men skulle också räkna mycket nyligen tillagda poster som att de har ett lågt antal åtkomster, vilket kan leda till cache churn.

"Minst nyligen använd" föredrar att vräka cacheposter som inte har använts på ett tag. Detta förutsätter att de inte används för närvarande, men tar inte hänsyn till om de användes hårt för ett tag sedan. "Senast använd" föredrar att vräka de senast använda cacheposterna, förutsatt att de har använts och inte behöver användas igen. Det bästa tillvägagångssättet är i allmänhet en kombination av alla tre, informerad av användningsstatistik.

Inaktuell information och säkerhetsrisker

Den största risken med cacher är att informationen de innehåller kan bli inaktuell. En cachepost anses inaktuell när originaldata har uppdaterats och lämnar cacheposten inaktuell. Det är viktigt att regelbundet kontrollera att den live-exemplar som visas fortfarande matchar den cachade kopian.

Specifikt på webbplatser är det också extremt viktigt att identifiera vilken data som kan och inte kan cachelagras. Till exempel är det helt okej att en stor oföränderlig JavaScript-fil cachelagras. Detta sparar användaren från att ladda ner det varje gång, och kan till och med gynna andra användare som betjänas av samma cache. Du kan dock inte cachelagra sessionsspecifik data. Föreställ dig vad som skulle hända om du bläddrade till en meddelandeapp medan du var inloggad som dig själv, bara för att upptäcka att du fick en cachad version av en annan användares meddelanden. Tack och lov kan webbservrar specificera vilka resurser som kan och inte kan cachelagras och dessa problem är allmänt välkända så det finns få problem som detta.

Slutsats

En cache är en del av minnet som kan lagra vissa nyligen använda data i en lagringsmetod som är snabbare att komma åt än det skulle vara att slutföra den normala dataåtkomstprocessen igen. En cache är vanligtvis begränsad i kapacitet, vilket innebär att den måste vräka poster när den är full. Cachar är i allmänhet genomskinliga för användaren, vilket betyder att latens är den enda indikationen på att resultatet serverades via en cache.