Une partie de cache-cache
Frédéric Bouchery
Qui suis-je ?
Frédéric Bouchery
➔ Développeur depuis 1983 (Ouïlle)
➔ Expérience professionnelle depuis 1996
➔ Expert PHP (...
LE LEADER FRANCAIS
SUR INTERNET
Google sites
Facebook
Microsoft sites
CCM Benchmark
Yahoo ! sites
Wikimedia found.
Orange sites 20,4
21
21,8
23,2
29,8
35,...
L'informatique, c'est l'art de passer des mois à
essayer de gagner des millisecondes !
2 4 6 8 10
25%
50%
Temps de
chargement (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 ...
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, mus...
Cache-Control:max-age=31536000
Date:Wed, 21 May 2014 14:58:17 GMT
ETag:"984209107"
Expires:Thu, 21 May 2015 14:58:17 GMT
L...
Navigateur
Proxy
Application
Webservice
BdD
1 2
3
4
5
Sans contraintes, les caches
appliquent des règles par défaut
Ne laissez pas les
navigateurs / Proxies
gérer le cache pour vous !
Toutes vos réponses devraient contenir un « Cache-Cont...
Ctrl F5
L'enfer du ...
- C'est corrigé
- Non, ça ne fonctionne pas sur mon poste !?
- Essayes avec un Ctrl+F5 !
- Ha oui, ...
F5
Cache-Control: max-age=0
If-Modified-Since: Xxx, xx xxx xxxx xx:xx:xx GMT
Sauf Internet Explorer qui ne donne pas de « ...
Ctrl F5
Cache-Control: no-cache
Pragma: 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...
Toutes les ressources statiques devraient être :
Cache-control: public, max-age=30000000
Last-Modified: Xxx, xx xxx xxxx x...
Cache navigateur important quand
PV/VU est élevé
Cache navigateur important quand
PV/VU est élevé
Beaucoup de visiteurs oblige à
exploiter les caches partagés
Beaucoup 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 %
...
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ête
Vary: Accept-Encoding
Firefox et IE gzip,deflate
Chrome gzip,deflate,sdch
Opera gzip,deflate,lzma,sdch
...
« 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 en...
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 à plan...
Cache partiel
Les Edge Side Includes
<esi:include />
Pas besoin de plus
Entête : 1 heure
Navigation
3 heures
Article : 1 mois
Comment
5 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 r...
Trop de contenus privés ?
Cache applicatif
2 types de cache
➔ Partagé (distant)
➔ Non partagé (local)
Serveur
Serveur
HTTP
Cache
Mémoire
shard 1
Serveur
Serveur
HTTP
Cache
Mémoire
shard 2
Serveur
Serveur
HTTP
Cache
Mémoire
s...
Attention, sans sharding
Risque de désynchronisation
A chaque rafraîchissement, un résultat différent
2 Solutions se démarquent
➔ Memcached
➔ Redis
Autres solutions moins performantes :
Les « NoSQL » (MongoDB, CouchDB, Cassa...
Memcached est la solution qui semble la plus
performante
Bonus : Redis permet de faire du message queuing
Redis est beauco...
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 ...
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é...
Pour résumer
✔ Maîtrisez vos caches
✔ Trouvez le bon TTL en fonction du contexte
✔ Réfléchir à la stratégie d'invalidation...
Merci de votre
attention
➔ fbouchery@ccmbenchmark.com
➔ http://fr.linkedin.com/in/bouchery/
➔ @FredBouchery
Breizhcamp 2014 : Une partie de Cache-Cache
Breizhcamp 2014 : Une partie de Cache-Cache
Prochain SlideShare
Chargement dans…5
×

Breizhcamp 2014 : Une partie de Cache-Cache

666 vues

Publié le

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

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
666
Sur SlideShare
0
Issues des intégrations
0
Intégrations
10
Actions
Partages
0
Téléchargements
6
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Breizhcamp 2014 : Une partie de Cache-Cache

  1. 1. Une partie de cache-cache Frédéric Bouchery
  2. 2. 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
  3. 3. LE LEADER FRANCAIS SUR INTERNET
  4. 4. 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
  5. 5. L'informatique, c'est l'art de passer des mois à essayer de gagner des millisecondes !
  6. 6. 2 4 6 8 10 25% 50% Temps de chargement (s) Abandon
  7. 7.  chargement des ressources  scripts bloquants  temps de réponse serveur
  8. 8. Une aide précieuse Les caches
  9. 9. 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
  10. 10. 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.
  11. 11. 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-revalidate Cache-Control: post-check=0, pre-check=0 Pragma: no-cache
  12. 12. Cache-Control:max-age=31536000 Date:Wed, 21 May 2014 14:58:17 GMT ETag:"984209107" Expires:Thu, 21 May 2015 14:58:17 GMT Last-Modified:Wed, 21 May 2014 12:32:09 GMT Vary:Accept-Encoding
  13. 13. Navigateur Proxy Application Webservice BdD 1 2 3 4 5
  14. 14. Sans contraintes, les caches appliquent des règles par défaut
  15. 15. Ne laissez pas les navigateurs / Proxies gérer le cache pour vous ! Toutes vos réponses devraient contenir un « Cache-Control » !
  16. 16. 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 ….
  17. 17. F5 Cache-Control: max-age=0 If-Modified-Since: Xxx, xx xxx xxxx xx:xx:xx GMT Sauf Internet Explorer qui ne donne pas de « Cache-Control »
  18. 18. Ctrl F5 Cache-Control: no-cache Pragma: no-cache Sauf Internet Explorer qui ne donne pas de « Pragma »
  19. 19. Sauf que … Ne fonctionne plus avec les ressources chargées par Ajax ! Après le « window.onload », le navigateur prend dans son cache
  20. 20. 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
  21. 21. Cache navigateur important quand PV/VU est élevé Cache navigateur important quand PV/VU est élevé
  22. 22. Beaucoup de visiteurs oblige à exploiter les caches partagés Beaucoup de visiteurs oblige à exploiter les caches partagés
  23. 23. Pages dynamiques Time To Live (TTL)
  24. 24. « Hit ratio » sur 24 heures
  25. 25. Nombre total d'URLs 1.441.531 Les 100ières représentent 9% des PV
  26. 26. 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îne Hit-ratio
  27. 27. Si on augmente le TTL : ➔ Augmente le hit-ratio ➔ Risque de saturation mémoire ➔ Contenu surgelé
  28. 28. Cache à 2 niveaux URL très demandées (> 4 req/h ?): Cache chaud en mémoire Longue traîne : Cache froid en fichier (NoSQL?)
  29. 29. Politique d'éviction : LRU, LFU, GDFS, etc. ? Faux problème !
  30. 30. Augmenter la mémoire en répartissant (sharding) Supprimer des paramètres variants non utilisés par la page
  31. 31. Supprimer l'entête Vary: Accept-Encoding Firefox et IE gzip,deflate Chrome gzip,deflate,sdch Opera gzip,deflate,lzma,sdch Envoyez systématiquement du gzip
  32. 32. « J'ai besoin parfois de rafraîchir avant la fin du TTL »
  33. 33. Pour rafraîchir un contenu, éviter d'effacer le cache ! Risque de « ruée » (Thundering herd)
  34. 34. Périmer artificiellement le contenu et activer le « stale cache » Forcer les « miss » pour des adresses internes ou une entête spécifique
  35. 35. Exemple de solution Écriture Requête de la page (Async) + « Miss » sur le cache à 2 niveaux
  36. 36. Autre possibilité Écrire directement dans le cache de longue traîne (fichier) Pré-construction de cache
  37. 37. Invalidation de plusieurs pages Multi-taggage des contenus
  38. 38. Modification de design Évitez la « grande purge » Crawling + « Miss » ou purge du cache de longue traîne Une action à planifier !
  39. 39. Cache partiel Les Edge Side Includes <esi:include /> Pas besoin de plus
  40. 40. Entête : 1 heure Navigation 3 heures Article : 1 mois Comment 5 minutes compte (pass)
  41. 41. 3 Solutions se démarquent Apache à la traîne … mais ... ➔ Varnish ➔ Nginx ➔ Squid
  42. 42. 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
  43. 43. Trop de contenus privés ? Cache applicatif
  44. 44. 2 types de cache ➔ Partagé (distant) ➔ Non partagé (local)
  45. 45. Serveur Serveur HTTP Cache Mémoire shard 1 Serveur Serveur HTTP Cache Mémoire shard 2 Serveur Serveur HTTP Cache Mémoire shard 3 Cache partagé réparti
  46. 46. Attention, sans sharding Risque de désynchronisation A chaque rafraîchissement, un résultat différent
  47. 47. 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)
  48. 48. Memcached est la solution qui semble la plus performante Bonus : Redis permet de faire du message queuing Redis est beaucoup plus riche en fonctionnalité
  49. 49. Content Delivery Network Oui, pour les sites internationaux Serveur Utilisateur
  50. 50. Pour les développeurs PHP ...
  51. 51. Optimiser le temps de traitement Réduire le temps de parsing du code Cache d'OP-Code
  52. 52. Utilisation d'APC comme cache applicatif est bien plus performant qu'un Memcached Limité en mémoire (actuellement max 512 Mio)
  53. 53. PHP 5.5 embarque un cache d'OP-Code Extension PECL : APCu
  54. 54. 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
  55. 55. 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
  56. 56. Merci de votre attention ➔ fbouchery@ccmbenchmark.com ➔ http://fr.linkedin.com/in/bouchery/ ➔ @FredBouchery

×