58
Une partie de cache-cache Frédéric Bouchery

Breizhcamp 2014 : Une partie de Cache-Cache

Embed Size (px)

DESCRIPTION

Présentation sur les caches faite au Breizhcamp 2014 à Rennes

Citation preview

Page 1: Breizhcamp 2014 : Une partie de Cache-Cache

Une partie de cache-cacheFrédéric Bouchery

Page 2: Breizhcamp 2014 : Une partie de Cache-Cache

Qui suis-je ?

Frédéric Bouchery

➔ Développeur depuis 1983 (Ouïlle)

➔ Expérience professionnelle depuis 1996

➔ Expert PHP (pratique depuis 1999)

➔ Aujourd'hui, Lead Developer pour le groupe CCM Benchmark

[email protected]➔ http://fr.linkedin.com/in/bouchery/➔ @FredBouchery

Page 3: Breizhcamp 2014 : Une partie de Cache-Cache

LE LEADER FRANCAISSUR INTERNET

Page 4: Breizhcamp 2014 : Une partie de Cache-Cache

Google sites

Facebook

Microsoft sites

CCM Benchmark

Yahoo ! sites

Wikimedia found.

Orange sites 20,4

21

21,8

23,2

29,8

35,3

43,7

Source: comScore MMX, France, Age 6+, Avril 2013

Top des sites en France - Visiteurs Uniques (en millions)

87ième au classement mondial avec 60 millions de VU

Page 5: Breizhcamp 2014 : Une partie de Cache-Cache

L'informatique, c'est l'art de passer des mois à essayer de gagner des millisecondes !

Page 6: Breizhcamp 2014 : Une partie de Cache-Cache

2 4 6 8 10

25%

50%

Temps dechargement (s)

Abandon

Page 7: Breizhcamp 2014 : Une partie de Cache-Cache
Page 8: Breizhcamp 2014 : Une partie de Cache-Cache

chargement des ressources scripts bloquants temps de réponse serveur

Page 9: Breizhcamp 2014 : Une partie de Cache-Cache

Une aide précieuse

Les caches

Page 10: Breizhcamp 2014 : Une partie de Cache-Cache

Cache de navigateur

Web storage

Cache partagé

Cache de données

Cache d'OP-code

Cache de requêtes

Navigateur

Proxy

Reverse Proxy

Serveur d'applications

Services externesBase de données

Page 11: Breizhcamp 2014 : Une partie de Cache-Cache

La chaîne de caches n'est pas toujours bien maîtrisée.La chaîne de caches n'est pas toujours bien maîtrisée.

Page 12: Breizhcamp 2014 : Une partie de Cache-Cache

Expires: Sat, 26 Jul 1997 05:00:00 GMT Last-Modified: Fri, 16 May 2014 20:00:43 GMT Cache-Control: no-store, no-cache, must-revalidateCache-Control: post-check=0, pre-check=0Pragma: no-cache

Page 13: Breizhcamp 2014 : Une partie de Cache-Cache

Cache-Control:max-age=31536000Date:Wed, 21 May 2014 14:58:17 GMTETag:"984209107"Expires:Thu, 21 May 2015 14:58:17 GMTLast-Modified:Wed, 21 May 2014 12:32:09 GMTVary:Accept-Encoding

Page 14: Breizhcamp 2014 : Une partie de Cache-Cache

Navigateur

Proxy

Application

Webservice

BdD

1 23

4

5

Page 15: Breizhcamp 2014 : Une partie de Cache-Cache

Sans contraintes, les caches appliquent des règles par défaut

Page 16: Breizhcamp 2014 : Une partie de Cache-Cache

Ne laissez pas lesnavigateurs / Proxies

gérer le cache pour vous !

Toutes vos réponses devraient contenir un « Cache-Control » !

Page 17: Breizhcamp 2014 : Une partie de Cache-Cache

Ctrl F5

L'enfer du ...

- C'est corrigé- Non, ça ne fonctionne pas sur mon poste !?- Essayes avec un Ctrl+F5 !- Ha oui, là, c'est bon ….

Page 18: Breizhcamp 2014 : Une partie de Cache-Cache

F5

Cache-Control: max-age=0If-Modified-Since: Xxx, xx xxx xxxx xx:xx:xx GMT

Sauf Internet Explorer qui ne donne pas de « Cache-Control »

Page 19: Breizhcamp 2014 : Une partie de Cache-Cache

Ctrl F5

Cache-Control: no-cachePragma: no-cache

Sauf Internet Explorer qui ne donne pas de « Pragma »

Page 20: Breizhcamp 2014 : Une partie de Cache-Cache

Sauf que …

Ne fonctionne plus avec les ressources chargées par Ajax !

Après le « window.onload », le navigateur prend dans son cache

Page 21: Breizhcamp 2014 : Une partie de Cache-Cache

Toutes les ressources statiques devraient être :Cache-control: public, max-age=30000000

Last-Modified: Xxx, xx xxx xxxx xx:xx:xx GMT

Une modification

Un nouveau nom !Ou un paramètre dans l'URL

Page 22: Breizhcamp 2014 : Une partie de Cache-Cache

Cache navigateur important quand PV/VU est élevé

Cache navigateur important quand PV/VU est élevé

Page 23: Breizhcamp 2014 : Une partie de Cache-Cache

Beaucoup de visiteurs oblige à exploiter les caches partagésBeaucoup de visiteurs oblige à exploiter les caches partagés

Page 24: Breizhcamp 2014 : Une partie de Cache-Cache

Pages dynamiques

Time To Live (TTL)

Page 25: Breizhcamp 2014 : Une partie de Cache-Cache

« Hit ratio » sur 24 heures

Page 26: Breizhcamp 2014 : Une partie de Cache-Cache
Page 27: Breizhcamp 2014 : Une partie de Cache-Cache

Nombre total d'URLs

1.441.531

Les 100ières représentent

9% des PV

Page 28: Breizhcamp 2014 : Une partie de Cache-Cache

1 mois 2 mois 3 mois 6 mois 1 an

5 min 9 % 7 % 6 % 4 % 3 %

15 min 22 % 18 % 15 % 11 % 7 %

30 min 37 % 31 % 26 % 18 % 11 %

1 h 56 % 47 % 40 % 28 % 17 %

2 h 73 % 60 % 52 % 36 % 22 %

3h 78 % 64 % 55 % 38 % 24 %

6h 80 % 66 % 57 % 39 % 25 %

12 h 80 % 66 % 57 % 40 % 25 %

24 h 80 % 67 % 57 % 40 % 25 %

TTL

Longueur de la traîneHit-ratio

Page 29: Breizhcamp 2014 : Une partie de Cache-Cache

Si on augmente le TTL :

➔ Augmente le hit-ratio ➔ Risque de saturation mémoire➔ Contenu surgelé

Page 30: Breizhcamp 2014 : Une partie de Cache-Cache

Cache à 2 niveaux

URL très demandées (> 4 req/h ?):Cache chaud en mémoire

Longue traîne :Cache froid en fichier (NoSQL?)

Page 31: Breizhcamp 2014 : Une partie de Cache-Cache

Politique d'éviction :LRU, LFU, GDFS, etc. ?

Faux problème !

Page 32: Breizhcamp 2014 : Une partie de Cache-Cache

Augmenter la mémoire en répartissant (sharding)

Supprimer des paramètres variants non utilisés par la page

Page 33: Breizhcamp 2014 : Une partie de Cache-Cache

Supprimer l'entêteVary: Accept-Encoding

Firefox et IE gzip,deflate

Chrome gzip,deflate,sdch

Opera gzip,deflate,lzma,sdch

Envoyez systématiquement du gzip

Page 34: Breizhcamp 2014 : Une partie de Cache-Cache

« J'ai besoin parfois de rafraîchir avant la fin du TTL »

Page 35: Breizhcamp 2014 : Une partie de Cache-Cache

Pour rafraîchir un contenu, éviter d'effacer le cache !

Risque de « ruée »(Thundering herd)

Page 36: Breizhcamp 2014 : Une partie de Cache-Cache

Périmer artificiellement le contenu et activer le « stale cache »

Forcer les « miss » pour des adresses internes ou une entête spécifique

Page 37: Breizhcamp 2014 : Une partie de Cache-Cache

Exemple de solution

Écriture

Requête de la page (Async)+

« Miss » sur le cache à 2 niveaux

Page 38: Breizhcamp 2014 : Une partie de Cache-Cache

Autre possibilité

Écrire directement dans le cache de longue traîne (fichier)

Pré-construction de cache

Page 39: Breizhcamp 2014 : Une partie de Cache-Cache

Invalidation de plusieurs pages

Multi-taggage des contenus

Page 40: Breizhcamp 2014 : Une partie de Cache-Cache

Modification de design

Évitez la « grande purge »

Crawling + « Miss »ou purge du cache de longue traîne

Une action à planifier !

Page 41: Breizhcamp 2014 : Une partie de Cache-Cache

Cache partiel

Les Edge Side Includes

<esi:include />Pas besoin de plus

Page 42: Breizhcamp 2014 : Une partie de Cache-Cache

Entête : 1 heure

Navigation3 heures Article : 1 mois

Comment5 minutes

compte(pass)

Page 43: Breizhcamp 2014 : Une partie de Cache-Cache

3 Solutions se démarquent

Apache à la traîne … mais ...

➔ Varnish➔ Nginx➔ Squid

Page 44: Breizhcamp 2014 : Une partie de Cache-Cache

Varnish est la solution qui offre aujourd'hui le plus de possibilité

Bonus : Nginx + Redis = accès direct au cache

Nginx reste plus performant sur les contenus statiques

Page 45: Breizhcamp 2014 : Une partie de Cache-Cache

Trop de contenus privés ?

Cache applicatif

Page 46: Breizhcamp 2014 : Une partie de Cache-Cache

2 types de cache

➔ Partagé (distant)➔ Non partagé (local)

Page 47: Breizhcamp 2014 : Une partie de Cache-Cache

Serveur

ServeurHTTP

CacheMémoireshard 1

Serveur

ServeurHTTP

CacheMémoireshard 2

Serveur

ServeurHTTP

CacheMémoireshard 3

Cache partagé réparti

Page 48: Breizhcamp 2014 : Une partie de Cache-Cache

Attention, sans sharding

Risque de désynchronisationA chaque rafraîchissement, un résultat différent

Page 49: Breizhcamp 2014 : Une partie de Cache-Cache

2 Solutions se démarquent

➔ Memcached➔ Redis

Autres solutions moins performantes :Les « NoSQL » (MongoDB, CouchDB, Cassandra, etc.)ou base avec table en mémoire (ex : MySQL + Memory Engine)

Page 50: Breizhcamp 2014 : Une partie de Cache-Cache

Memcached est la solution qui semble la plus performante

Bonus : Redis permet de faire du message queuing

Redis est beaucoup plus riche en fonctionnalité

Page 51: Breizhcamp 2014 : Une partie de Cache-Cache

Content Delivery Network

Oui, pour les sites internationaux

Serveur

Utilisateur

Page 52: Breizhcamp 2014 : Une partie de Cache-Cache

Pour les développeurs PHP ...

Page 53: Breizhcamp 2014 : Une partie de Cache-Cache

Optimiser le temps de traitement

Réduire le temps de parsing du code

Cache d'OP-Code

Page 54: Breizhcamp 2014 : Une partie de Cache-Cache

Utilisation d'APC comme cache applicatif est bien plus performant qu'un Memcached

Limité en mémoire (actuellement max 512 Mio)

Page 55: Breizhcamp 2014 : Une partie de Cache-Cache

PHP 5.5 embarque un cache d'OP-Code

Extension PECL : APCu

Page 56: Breizhcamp 2014 : Une partie de Cache-Cache

Exploiter le cache d'OP-Code en générant des scripts PHP qui retournent des tableaux

<?php return array('id' => 'Ma donnée'

);

<?php$data = include 'script.php';

<?php$content = var_export($data, true);file_put_contents('script.php', '<?php return ' . $content .';');

script.php

Page 57: Breizhcamp 2014 : Une partie de Cache-Cache

Pour résumer

✔ Maîtrisez vos caches

✔ Trouvez le bon TTL en fonction du contexte

✔ Réfléchir à la stratégie d'invalidation

✔ Plusieurs niveaux de cache

✔ Étudier le comportement des internautes

✔ Suivre les évolutions des solutions

Page 58: Breizhcamp 2014 : Une partie de Cache-Cache

Merci de votre attention

[email protected]➔ http://fr.linkedin.com/in/bouchery/➔ @FredBouchery