Når du ber om data fra en hvilken som helst kilde, er det alltid noen forsinkelser. Ping til webservere måles i millisekunder, lagringstilgangstid kan ha forsinkelser i mikrosekunder mens RAM-latens måles i CPU-klokkesykluser. Selvfølgelig ville denne typen hastigheter vært utenkelige for bare noen tiår siden, men i dag er de aldri raske nok. Tilgangshastighet er regelmessig en form for flaskehals i ytelsen. En av måtene dette kan løses på er med caching.
Bufring er en prosess for å lagre en midlertidig kopi av en ressurs på en måte at den kan nås raskere enn normalt. Det finnes et stort spekter av implementeringer både innen programvare og maskinvare. Cacher kan fungere som lesecacher, skrivecacher eller begge deler.
Les cacher
I en lesebuffer lagres data som har blitt bedt om tidligere i en hurtigbuffer for raskere tilgang. I noen scenarier kan hurtigbufferen til og med være forhåndslastet med data slik at den første forespørselen kan leveres fra hurtigbufferen i stedet for bare påfølgende forespørsler.
Lesebufferen som du mest sannsynlig er kjent med, er nettleserbufferen. Her lagrer nettleseren en lokal kopi av forespurte ressurser. Dette betyr at hvis og når nettsiden lastes inn på nytt eller en lignende side lastes inn som bruker mye av det samme innholdet, kan innholdet serveres fra hurtigbufferen i stedet for nettserveren. Ikke bare betyr dette at nettsiden kan lastes raskere, men det reduserer også belastningen på nettet server og reduserer mengden data brukeren trenger å laste ned som kan være viktig på målt forbindelser.
Selve RAM fungerer også som en lesebuffer for data på harddisken. I dette tilfellet lastes data for et program som kjører på forhånd inn i RAM slik at prosessoren kan få tilgang til det raskere. Data fra RAM bufres deretter videre til CPU-cachen, selv om prosessen for dette er mye mer kompleks da CPU-cachen måles i megabyte ikke gigabyte.
Skriv cacher
En skrivebuffer er en hurtigbuffer som kan absorbere data som skrives til en tregere enhet. Et vanlig eksempel på dette vil være SLC-cachen i moderne SSD-er. Denne hurtigbufferen lar ikke data leses raskere, det er imidlertid mye raskere å skrive til enn det er å skrive til TLC- eller QLC-flashen som utgjør resten av SSD-en. SLC-cachen kan absorbere høyhastighets skriveoperasjoner, og laster deretter dataene så snart den kan til TLC-flashen som tilbyr mye bedre lagringstetthet, men som også er mye tregere å skrive til. Ved å bruke flash-minnet på denne måten optimaliseres det for både høye skrivehastigheter og høy lagringstetthet.
Hybride cacher
Det er mange måter å håndtere cacher på som kan tillate dem å fungere som både lese- og skrivebuffer. Hver av disse metodene håndterer skriveoperasjoner forskjellig og har fordeler og ulemper. De tre alternativene er omskriving, gjennomskriving og tilbakeskrivning. En omskrivningsbuffer hopper fullstendig over hurtigbufferen når du skriver, gjennomskrivingsbufferen skriver til hurtigbufferen, men anser bare operasjonen som fullført når den er skrevet til lagring. Tilbakeskrivningsbufferen skriver til hurtigbufferen og anser deretter operasjonen som fullført, og stoler på at hurtigbufferen overfører den til lagring hvis det er nødvendig.
Omskriving kan være nyttig hvis du forventer et stort volum av skrivinger, da det minimerer cache-churn. Det betyr imidlertid at en operasjon som deretter leser noen av de skrevne dataene vil møte minst én cache-miss første gang. Gjennomskrivingsbuffer hurtigbuffer skriveoperasjoner umiddelbart, noe som betyr at resultatet kan serveres fra hurtigbufferen første gang det blir forespurt. For å bli ansett som komplett, må en skriveoperasjon også skrive dataene til disken, noe som legger til latens. En tilbakeskrivningsbuffer har samme fordel som en gjennomskrivning, slik at skrevne data umiddelbart kan serveres fra hurtigbufferen. Det krever ikke skriveoperasjoner for å skrive til disk for å bli ansett som fullført. Dette reduserer skriveforsinkelse, men kommer med risiko for tap av data hvis hurtigbufferen er flyktig og den ikke blir ferdig med å skrive dataene tilbake til lagringen før strømmen går.
Hvordan fjerne data fra cachen?
En av de begrensende faktorene til enhver cache er kapasitet. En stor cache tar lang tid å søke, noe som opphever en god del av fordelen med å bruke en cache i utgangspunktet. Minneteknologier som brukes til bufring har også en tendens til å være dyrere enn minnet de bufres fra. Hvis dette ikke var tilfelle, er det sannsynlig at det minnenivået ville ha byttet minneteknologi for å forbedre ytelsen. Begge disse faktorene betyr at cacher har en tendens til å være relativt små, spesielt sammenlignet med lagringsmediet de cacher fra. RAM har mindre kapasitet enn lagring og CPU-cache har mindre kapasitet enn RAM. SLC-cachen har mindre kapasitet enn TLC-minnet.
Alt dette betyr at det ofte er nødvendig å sykle data ut av cachen for å frigjøre plass til nye data som må bufres. Det finnes en rekke forskjellige tilnærminger til dette. "Minst ofte brukt", foretrekker å kaste ut cache-oppføringer som har det laveste antallet tilgang. Dette kan være nyttig for å forutsi hvilke oppføringer som vil ha minst effekt på fremtidige cache-misser, men vil også telle svært nylig lagt til oppføringer som å ha et lavt antall tilganger, noe som kan føre til cache churn.
"Minst nylig brukt" foretrekker å kaste ut cache-oppføringer som ikke har blitt brukt på en stund. Dette forutsetter at de ikke brukes for øyeblikket, men tar ikke hensyn til om de ble mye brukt for en stund tilbake. "Sist brukt" foretrekker å kaste ut de sist brukte cache-oppføringene, forutsatt at de har blitt brukt og ikke trenger å brukes igjen. Den beste tilnærmingen er generelt en kombinasjon av alle tre, informert av bruksstatistikk.
Foreldet informasjon og sikkerhetsrisikoer
Hovedrisikoen ved cacher er at informasjonen de inneholder kan bli foreldet. En cache-oppføring betraktes som foreldet når de originale dataene har blitt oppdatert, slik at cache-oppføringen er utdatert. Det er viktig å regelmessig kontrollere at den direktesendte kopien som vises fortsatt samsvarer med den bufrede kopien.
Spesielt på nettsteder er det også ekstremt viktig å identifisere hvilke data som kan og ikke kan bufres. For eksempel er det helt greit at en stor uforanderlig JavaScript-fil bufres. Dette sparer brukeren fra å laste den ned hver gang, og kan til og med være til nytte for andre brukere som betjenes av samme cache. Du kan imidlertid ikke bufre øktspesifikke data. Tenk deg hva som ville skje hvis du surfet til en meldingsapp mens du var pålogget som deg selv, bare for å finne ut at du ble servert med en bufret versjon av en annen brukers meldinger. Heldigvis kan nettservere spesifisere hvilke ressurser som kan og ikke kan bufres, og disse problemene er generelt velkjente, så det er få problemer som dette.
Konklusjon
En cache er en del av minnet som kan lagre noen nylig brukte data i en lagringsmetode som er raskere å få tilgang til enn det ville vært å fullføre den normale datatilgangsprosessen igjen. En cache er vanligvis begrenset i kapasitet, noe som betyr at den må kaste ut oppføringer når den er full. Cacher er generelt gjennomsiktige for brukeren, noe som betyr at latens er den eneste indikasjonen på at resultatet ble servert via en cache.