Quando si richiedono dati da qualsiasi fonte, c'è sempre un certo ritardo. Il ping sui server Web viene misurato in millisecondi, il tempo di accesso allo storage può avere latenze di microsecondi mentre la latenza della RAM viene misurata in cicli di clock della CPU. Naturalmente, questo tipo di velocità sarebbe stato impensabile solo pochi decenni fa, ma al giorno d'oggi non sono mai abbastanza veloci. La velocità di accesso è regolarmente una forma di collo di bottiglia nelle prestazioni. Uno dei modi in cui questo può essere affrontato è con la memorizzazione nella cache.
La memorizzazione nella cache è un processo di archiviazione di una copia temporanea di una risorsa in modo da potervi accedere più rapidamente di quanto non sarebbe normalmente. Ci sono una vasta gamma di implementazioni sia nel software che nell'hardware. Le cache possono fungere da cache di lettura, cache di scrittura o entrambe.
Leggi le cache
In una cache di lettura, i dati richiesti in precedenza vengono archiviati in una cache per un accesso più rapido. In alcuni scenari, la cache può anche essere caricata preventivamente con dati che consentono di soddisfare la prima richiesta dalla cache anziché solo le richieste successive.
La cache di lettura con cui probabilmente avrai familiarità è la cache del browser. Qui il browser memorizza una copia locale delle risorse richieste. Ciò significa che se e quando la pagina Web viene ricaricata o viene caricata una pagina simile che utilizza gran parte dello stesso contenuto, tale contenuto può essere servito dalla cache anziché dal server Web. Questo non solo significa che la pagina web può essere caricata più velocemente, ma riduce anche il carico sul web server e riduce la quantità di dati che l'utente deve scaricare, il che può essere importante a livello di misurazione connessioni.
La stessa RAM funge anche da cache di lettura per i dati nel disco rigido. In questo caso, i dati per un programma in esecuzione vengono caricati preventivamente nella RAM in modo che la CPU possa accedervi più velocemente. I dati dalla RAM vengono quindi ulteriormente memorizzati nella cache della CPU, sebbene il processo per questo sia molto più complesso poiché la cache della CPU viene misurata in megabyte e non in gigabyte.
Scrivi cache
Una cache di scrittura è una cache in grado di assorbire i dati scritti su un dispositivo più lento. Un esempio comune di ciò sarebbe la cache SLC nei moderni SSD. Questa cache non consente di leggere i dati più velocemente, tuttavia, è molto più veloce scrivere su che scrivere sul flash TLC o QLC che costituisce il resto dell'SSD. La cache SLC può assorbire operazioni di scrittura ad alta velocità e quindi scaricare i dati non appena possibile sulla flash TLC che offre una densità di archiviazione molto migliore, ma è anche molto più lenta in cui scrivere. L'utilizzo della memoria flash in questo modo la ottimizza sia per velocità di scrittura elevate che per un'elevata densità di archiviazione.
Cache ibride
Esistono molti modi per gestire le cache che possono consentire loro di agire sia come cache di lettura che di scrittura. Ciascuno di questi metodi gestisce le operazioni di scrittura in modo diverso e presenta vantaggi e svantaggi. Le tre opzioni sono write-around, write-through e write-back. Una cache write-around ignora completamente la cache durante la scrittura, la cache write-through scrive nella cache ma considera l'operazione completata solo quando è stata scritta nella memoria. La cache di write-back scrive nella cache e quindi considera l'operazione completata, basandosi sulla cache per trasferirla nella memoria, se necessario.
Il write-around può essere utile se ti aspetti un grande volume di scritture poiché riduce al minimo l'abbandono della cache. Tuttavia, significa che un'operazione che legge uno qualsiasi di quei dati scritti dovrà affrontare almeno una cache mancata la prima volta. Le cache write-through memorizzano immediatamente nella cache le operazioni di scrittura, il che significa che il risultato può essere servito dalla cache la prima volta che viene richiesto. Per essere considerata completa, tuttavia, un'operazione di scrittura deve scrivere anche i dati su disco, il che aggiunge latenza. Una cache write-back ha lo stesso vantaggio di una write-through, consentendo di servire immediatamente i dati scritti dalla cache. Tuttavia, non richiede operazioni di scrittura per scrivere su disco per essere considerato completo. Ciò riduce la latenza di scrittura ma comporta il rischio di perdita di dati se la cache è volatile e non finisce di riscrivere i dati nella memoria prima che venga interrotta l'alimentazione.
Come rimuovere i dati dalla cache?
Uno dei fattori limitanti di qualsiasi cache è la capacità. Una cache di grandi dimensioni richiede molto tempo per la ricerca, annullando una buona parte del vantaggio dell'utilizzo di una cache in primo luogo. Le tecnologie di memoria utilizzate per la memorizzazione nella cache tendono anche ad essere più costose della memoria da cui vengono memorizzate nella cache. In caso contrario, è probabile che quel livello di memoria avrebbe cambiato le tecnologie di memoria per migliorare le prestazioni. Entrambi questi fattori significano che le cache tendono ad essere relativamente piccole, soprattutto se confrontate con il supporto di archiviazione da cui stanno memorizzando nella cache. La RAM ha una capacità inferiore rispetto allo storage e la cache della CPU ha una capacità inferiore rispetto alla RAM. La cache SLC ha una capacità inferiore rispetto alla memoria TLC.
Tutto ciò significa che spesso è necessario estrarre i dati dalla cache per liberare spazio per i nuovi dati che devono essere memorizzati nella cache. Ci sono una serie di approcci diversi a questo. "Usato meno frequentemente", preferisce eliminare le voci della cache che hanno il numero di accessi più basso. Questo può essere utile per prevedere quali voci avranno il minor effetto sui futuri errori nella cache, ma conterebbe anche le voci aggiunte di recente come aventi un basso numero di accessi, il che potrebbe portare alla cache zangola.
"Utilizzato meno di recente" preferisce eliminare le voci della cache che non sono state utilizzate da un po' di tempo. Ciò presuppone che non siano attualmente utilizzati, ma non tiene conto del fatto che siano stati utilizzati pesantemente tempo fa. "Usato più di recente" preferisce eliminare le voci della cache utilizzate più di recente, supponendo che siano state utilizzate e non dovranno essere riutilizzate. L'approccio migliore è generalmente una combinazione di tutti e tre, informato dalle statistiche di utilizzo.
Informazioni obsolete e rischi per la sicurezza
Il rischio principale delle cache è che le informazioni che contengono possano diventare obsolete. Una voce della cache è considerata obsoleta quando i dati originali sono stati aggiornati lasciando la voce della cache non aggiornata. È importante verificare regolarmente che la live copy pubblicata corrisponda ancora alla copia memorizzata nella cache.
In particolare nei siti Web, è anche estremamente importante identificare quali dati possono e non possono essere memorizzati nella cache. Ad esempio, va benissimo per memorizzare nella cache un grande file JavaScript immutabile. Ciò evita all'utente di scaricarlo ogni volta e può persino avvantaggiare altri utenti serviti dalla stessa cache. Tuttavia, non puoi memorizzare nella cache i dati specifici della sessione. Immagina cosa accadrebbe se accedessi a un'app di messaggistica mentre sei registrato come te stesso, solo per scoprire che ti è stata servita una versione memorizzata nella cache dei messaggi di un altro utente. Per fortuna, i server Web possono specificare quali risorse possono e non possono essere memorizzate nella cache e questi problemi sono generalmente ben noti, quindi ci sono pochi problemi come questo.
Conclusione
Una cache è una porzione di memoria che può archiviare alcuni dati utilizzati di recente in un metodo di archiviazione a cui è possibile accedere più velocemente di quanto sarebbe per completare nuovamente il normale processo di accesso ai dati. Una cache in genere ha una capacità limitata, il che significa che deve rimuovere le voci una volta che è piena. Le cache sono generalmente trasparenti per l'utente, il che significa che la latenza è l'unica indicazione che il risultato è stato servito tramite una cache.