Lorsque vous demandez des données à partir de n'importe quelle source, il y a toujours un certain retard. Le ping vers les serveurs Web est mesuré en millisecondes, le temps d'accès au stockage peut avoir des latences en microsecondes tandis que la latence de la RAM est mesurée en cycles d'horloge CPU. Bien sûr, ces types de vitesses auraient été impensables il y a quelques décennies à peine, mais à l'heure actuelle, elles ne sont jamais assez rapides. La vitesse d'accès est régulièrement une forme de goulot d'étranglement dans les performances. L'une des façons de résoudre ce problème est la mise en cache.
La mise en cache est un processus de stockage d'une copie temporaire d'une ressource de manière à ce qu'elle soit accessible plus rapidement qu'elle ne pourrait l'être normalement. Il existe une vaste gamme d'implémentations à la fois logicielles et matérielles. Les caches peuvent agir comme des caches de lecture, des caches d'écriture ou les deux.
Lire les caches
Dans un cache de lecture, les données qui ont été demandées précédemment sont stockées dans un cache pour un accès plus rapide. Dans certains scénarios, le cache peut même être chargé de manière préventive avec des données permettant à la première demande d'être servie à partir du cache plutôt que simplement les demandes suivantes.
Le cache de lecture que vous connaissez le plus probablement est le cache du navigateur. Ici, le navigateur stocke une copie locale des ressources demandées. Cela signifie que si et quand la page Web est rechargée ou une page similaire est chargée qui utilise une grande partie du même contenu, ce contenu peut être servi à partir du cache plutôt que du serveur Web. Non seulement cela signifie que la page Web peut se charger plus rapidement, mais cela réduit également la charge sur le Web. serveur et réduit la quantité de données que l'utilisateur doit télécharger, ce qui peut être important sur les compteurs Connexions.
La RAM elle-même agit également comme un cache de lecture pour les données du disque dur. Dans ce cas, les données d'un programme en cours d'exécution sont chargées de manière préventive dans la RAM afin que le processeur puisse y accéder plus rapidement. Les données de la RAM sont ensuite mises en cache dans le cache du processeur, bien que le processus soit beaucoup plus complexe car le cache du processeur est mesuré en mégaoctets et non en gigaoctets.
Caches en écriture
Un cache d'écriture est un cache qui peut absorber les données écrites sur un périphérique plus lent. Un exemple courant de ceci serait le cache SLC dans les SSD modernes. Ce cache ne permet pas de lire les données plus rapidement, cependant, il est beaucoup plus rapide d'écrire que d'écrire sur le flash TLC ou QLC qui constitue le reste du SSD. Le cache SLC peut absorber les opérations d'écriture à grande vitesse, puis décharger ces données dès qu'elles le peuvent sur le flash TLC qui offre une bien meilleure densité de stockage, mais est également beaucoup plus lent à écrire. L'utilisation de la mémoire flash de cette manière l'optimise à la fois pour des vitesses d'écriture rapides et une densité de stockage élevée.
Caches hybrides
Il existe de nombreuses façons de gérer les caches qui peuvent leur permettre d'agir à la fois comme cache de lecture et d'écriture. Chacune de ces méthodes gère les opérations d'écriture différemment et présente des avantages et des inconvénients. Les trois options sont écriture autour, écriture immédiate et écriture différée. Un cache en écriture ignore entièrement le cache lors de l'écriture, le cache en écriture écrit dans le cache mais ne considère l'opération terminée que lorsqu'elle a été écrite dans le stockage. Le cache de réécriture écrit dans le cache, puis considère l'opération comme terminée, en s'appuyant sur le cache pour le transférer vers le stockage si nécessaire.
L'écriture autour peut être utile si vous vous attendez à un grand volume d'écritures car elle minimise l'attrition du cache. Cela signifie cependant qu'une opération qui lit ensuite l'une de ces données écrites sera confrontée à au moins un échec de cache la première fois. Les caches à écriture immédiate mettent immédiatement en cache les opérations d'écriture, ce qui signifie que le résultat peut être servi à partir du cache la première fois qu'il est demandé. Cependant, pour être considérée comme complète, une opération d'écriture doit également écrire les données sur le disque, ce qui ajoute de la latence. Un cache à écriture différée présente le même avantage qu'une écriture immédiate, permettant aux données écrites d'être immédiatement servies à partir du cache. Cependant, il ne nécessite pas d'opérations d'écriture pour écrire sur le disque. Cela réduit la latence d'écriture, mais comporte un risque de perte de données si le cache est volatil et qu'il ne termine pas l'écriture des données dans le stockage avant la coupure de courant.
Comment supprimer des données du cache ?
L'un des facteurs limitants de tout cache est sa capacité. Un grand cache prend beaucoup de temps à rechercher, annulant une bonne partie de l'avantage d'utiliser un cache en premier lieu. Les technologies de mémoire utilisées pour la mise en cache ont également tendance à être plus chères que la mémoire à partir de laquelle elles sont mises en cache. Si ce n'était pas le cas, il est probable que ce niveau de mémoire aurait changé de technologie de mémoire pour améliorer les performances. Ces deux facteurs signifient que les caches ont tendance à être relativement petits, en particulier par rapport au support de stockage à partir duquel ils sont mis en cache. La RAM a moins de capacité que le stockage et le cache CPU a moins de capacité que la RAM. Le cache SLC a moins de capacité que la mémoire TLC.
Tout cela signifie qu'il est souvent nécessaire de faire sortir les données du cache pour libérer de l'espace pour les nouvelles données qui doivent être mises en cache. Il existe une gamme d'approches différentes à cet égard. "Le moins fréquemment utilisé", préfère supprimer les entrées de cache qui ont le plus petit nombre d'accès. Cela peut être utile pour prédire quelles entrées auront le moins d'effet sur les futurs échecs de cache, mais comptabiliserait également les entrées ajoutées très récemment comme ayant un faible nombre d'accès, ce qui peut entraîner un cache baratte.
"Le moins récemment utilisé" préfère supprimer les entrées de cache qui n'ont pas été utilisées depuis un certain temps. Cela suppose qu'ils ne sont pas utilisés actuellement, mais ne tient pas compte s'ils ont été fortement utilisés il y a quelque temps. "Le plus récemment utilisé" préfère supprimer les entrées de cache les plus récemment utilisées, en supposant qu'elles ont été utilisées et qu'elles n'auront pas besoin d'être réutilisées. La meilleure approche est généralement une combinaison des trois, informée par les statistiques d'utilisation.
Informations obsolètes et risques de sécurité
Le principal risque des caches est que les informations qu'ils contiennent peuvent devenir obsolètes. Une entrée de cache est considérée comme obsolète lorsque les données d'origine ont été mises à jour, laissant l'entrée de cache obsolète. Il est important de vérifier régulièrement que la copie en direct diffusée correspond toujours à la copie en cache.
Dans les sites Web en particulier, il est également extrêmement important d'identifier quelles données peuvent et ne peuvent pas être mises en cache. Par exemple, il est parfaitement acceptable qu'un gros fichier JavaScript immuable soit mis en cache. Cela évite à l'utilisateur de le télécharger à chaque fois et peut même profiter aux autres utilisateurs servis par le même cache. Cependant, vous ne pouvez pas mettre en cache les données spécifiques à la session. Imaginez ce qui se passerait si vous naviguiez vers une application de messagerie tout en étant connecté en tant que vous-même, pour constater que vous étiez servi avec une version en cache des messages d'un autre utilisateur. Heureusement, les serveurs Web peuvent spécifier quelles ressources peuvent et ne peuvent pas être mises en cache et ces problèmes sont généralement bien connus, il y a donc peu de problèmes comme celui-ci.
Conclusion
Un cache est une partie de la mémoire qui peut stocker certaines données récemment utilisées dans une méthode de stockage dont l'accès est plus rapide qu'il ne le serait pour terminer à nouveau le processus d'accès aux données normal. Un cache a généralement une capacité limitée, ce qui signifie qu'il doit supprimer les entrées une fois qu'il est plein. Les caches sont généralement transparents pour l'utilisateur, ce qui signifie que la latence est la seule indication que le résultat a été servi via un cache.