View
331
Download
2
Category
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
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