Breizhcamp 2014 : Une partie de Cache-Cache

Preview:

DESCRIPTION

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

Citation preview

Une partie de cache-cacheFrédéric Bouchery

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

➔ fbouchery@ccmbenchmark.com➔ http://fr.linkedin.com/in/bouchery/➔ @FredBouchery

LE LEADER FRANCAISSUR INTERNET

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

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

2 4 6 8 10

25%

50%

Temps dechargement (s)

Abandon

chargement des ressources scripts bloquants temps de réponse serveur

Une aide précieuse

Les caches

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

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.

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

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

Navigateur

Proxy

Application

Webservice

BdD

1 23

4

5

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

Ne laissez pas lesnavigateurs / Proxies

gérer le cache pour vous !

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

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 ….

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 »

Ctrl F5

Cache-Control: no-cachePragma: no-cache

Sauf Internet Explorer qui ne donne pas de « Pragma »

Sauf que …

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

Après le « window.onload », le navigateur prend dans son 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

Cache navigateur important quand PV/VU est élevé

Cache navigateur important quand PV/VU est élevé

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

Pages dynamiques

Time To Live (TTL)

« Hit ratio » sur 24 heures

Nombre total d'URLs

1.441.531

Les 100ières représentent

9% des PV

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

Si on augmente le TTL :

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

Cache à 2 niveaux

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

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

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

Faux problème !

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

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

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

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

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

Risque de « ruée »(Thundering herd)

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

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

Exemple de solution

Écriture

Requête de la page (Async)+

« Miss » sur le cache à 2 niveaux

Autre possibilité

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

Pré-construction de cache

Invalidation de plusieurs pages

Multi-taggage des contenus

Modification de design

Évitez la « grande purge »

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

Une action à planifier !

Cache partiel

Les Edge Side Includes

<esi:include />Pas besoin de plus

Entête : 1 heure

Navigation3 heures Article : 1 mois

Comment5 minutes

compte(pass)

3 Solutions se démarquent

Apache à la traîne … mais ...

➔ Varnish➔ Nginx➔ Squid

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

Trop de contenus privés ?

Cache applicatif

2 types de cache

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

Serveur

ServeurHTTP

CacheMémoireshard 1

Serveur

ServeurHTTP

CacheMémoireshard 2

Serveur

ServeurHTTP

CacheMémoireshard 3

Cache partagé réparti

Attention, sans sharding

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

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)

Memcached est la solution qui semble la plus performante

Bonus : Redis permet de faire du message queuing

Redis est beaucoup plus riche en fonctionnalité

Content Delivery Network

Oui, pour les sites internationaux

Serveur

Utilisateur

Pour les développeurs PHP ...

Optimiser le temps de traitement

Réduire le temps de parsing du code

Cache d'OP-Code

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

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

PHP 5.5 embarque un cache d'OP-Code

Extension PECL : APCu

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

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

Merci de votre attention

➔ fbouchery@ccmbenchmark.com➔ http://fr.linkedin.com/in/bouchery/➔ @FredBouchery

Recommended