Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Performances PHP chez M6Web

Performances PHP chez M6Web

Retour d'experience qui survole les axes sur lesquels nous travaillons chez m6web, ayant trait aux optimisations de nos sites.

kennydee

May 23, 2012
Tweet

More Decks by kennydee

Other Decks in Programming

Transcript

  1. M6Web }  Filiale digitale du groupe M6 }  + de

    70 sites web }  Le MVNO M6Mobile avec Orange }  Le Replay et produits dérivés des programmes télé }  Un comparateur de prix }  Diversification : Qooq / Panorabanques / Habbo … }  Interactivité antenne (Sms, audiotel …)
  2. M6Web en quelques chiffres }  Mysql : }  + de

    16000 requêtes SQL / seconde }  + de 500Go de données }  Varnish : }  7Go de cache utile }  4800 clients/seconde }  Trafic sortant : 1Gb/seconde }  VU Mars 2012 (Nielsen): 11,6M }  CA 2011 : 102,1M€ }  EBITA 2011 : 34,6M€
  3. Performance === Crédibilité }  « Any pause before responding to

    a simple question "does this dress make me look big ?" qualifies the inevitable response "absolutely not" as less certain. » Source : http://radar.oreilly.com/2011/04/why- speed-matters.html
  4. Cache d’OpCode « Le "Alternative PHP Cache" (APC) est un

    cache d'opcode libre et ouvert pour PHP. Son objectif est de fournir un framework libre, ouvert et robuste pour la mise en cache et l'optimisation de code intermédiaire PHP. »
  5. Profiling PHP : XhProf Automatisé grâce à une console de

    débuggage sur nos espaces de développement http://pecl.php.net/package/xhprof
  6. eregi vs preg vs strpos Remplacement d’un eregi par un

    preg_match( /i ) dans notre gestion de cache interne : gain 40% cpu sur la PF ! http://www.exinsidephp.com/ 2010/07/02/optimisation-les-posix-ereg- et-les-pcre-preg/
  7. ErrorHandler Interception de toutes les erreurs en production (Warning, Fatal,

    UserNotice etc). Interception des Fatals : Un script Python reçoit l’access Log sur l’entrée standard, parse l’error log en même temps et les associe via le pid du process Apache pour log.
  8. Génération d’images à la volée ImageMagick (utilise 1 cœur CPU)

    Passage à GraphicsMagick (utilise les 24 cœurs) => gain de 30%CPU Modification de GraphicsMagick pour n’utiliser que 2 cœurs env OMP_NUM_THREADS=2 /usr/local/bin/gm ... http://www.graphicsmagick.org/ benchmarks.html
  9. Explain/Profiling Query Cache Liste des requêtes et Explain dans notre

    console de débuggage. Utilisation occasionnelle du profiling mysql Pour le Query Cache, éviter les fonctions non déterministes now() et rand() notamment
  10. Réplication Master/slave Ecritures concentrées sur les master, et lectures sur

    les slaves Sharding par database Disques SSD sur certains pools
  11. Percona Monitoring Tools 1/2 pt-heartbeat è Monitorer le lag de

    réplication pt-index-usage è Détecte les index en doublons, les +/ - utilisés pt-kill è Vérifie en tâche de fond si des requêtes doivent être killées pt-query-advisor è Donne des conseils sur les requêtes SQL lentes pt-query-digest è Stats sur les requêtes, nombre, temps de réponse et d'exécution, distribution… pt-slave-find è Liste les slaves et leur états
  12. Percona Monitoring Tools 2/2 pt-table-checksum è Vérifie la cohérence des

    données entre master et slaves pt-table-sync è En cas de différence pt-tcp-model è A partir d'une capture tcpdump donne le temps de réponse des requêtes SQL (depuis la réception jusqu'à la fin de l'envoi) pt-upgrade è Avec un set de requêtes, exécutée sur deux machines différentes (moteur,version de mysql), check les différences sur les temps de réponse, les plans d'exécution MySQL, les résultats retournés etc…
  13. Recherche FullText avec Sphinx ! http://www.sphinxsearch.com Utilisation de Sphinx en

    mode API pour toutes les recherches de nos sites. Interdiction d’utiliser Mysql pour des recherches !
  14. NginX Certains projets en php-fpm Les projets en Https Les

    projets où l’on délivre des fichiers statiques (Ex : Livefeed : 4000 cx HTTP/seconde/ serveur chaque soir avec Gzip, 1000 hits/ seconde max avec mod gzip static)
  15. Cache HTTP : Varnish HTTP Reverse proxy (Charge CPU moyenne

    < 5%) Le keep-alive permet l’établissement de connexions persistantes. Absorbe très bien les pics de charge (renvoi d’audience antenne notamment)
  16. Cache HTTP : Varnish Gros soulagement des frontaux lors de

    la mise en place (Nb de threads sur le graph) https://www.varnish-cache.org/
  17. Cache page + Clé/Valeur via (Memcached/Redis) Très performant et persistant

    : Répond à toute nos problématiques de cache applicatif. + Gestion des piles de travail.
  18. StatsD + Graphite Graphite + StatsD (© Etsy) modifié Pour

    monitorer tous nos applicatifs http://graphite.wikidot.com/ https://github.com/etsy/statsd
  19. Le client StatsD : •  Incrément/ Décrement •  Timer Applicatif

    StatsD Métrique Métrique Métrique Le serveur StatsD : •  Reçoit •  Agrège pendant 2 secondes •  Envoie a Graphite
  20. Hack de StatsD Modification du client PHP pour envoyer moins

    de paquets UDP => Utilisation du register_shutdown_function pour envoyer les données Découpage en paquets (MTU à 1500 octets pour Node.js (limitation logicielle/ hardware), 1472 octets max, 28 octets de header) Plusieurs démons Node.js avec un LBL sur les nodes sur un CRC32 de la chaîne modulo le nombre de serveurs
  21. Etats des lieux Perf Back-End }  15% du temps passé

    }  3% du temps passé Perf Front-End }  85% du temps passé }  97% du temps passé Source : http://www.webperformancetoday.com/ 2011/04/20/desktop-vs-mobile-web-page-load- speed/ Web Mobile
  22. Diminuer le nombre de requêtes HTTP Afin d’éviter un maximum

    de RTT (Round Trip Time) Sprites CSS / Regroupement des JS et CSS http://www.sitioweb.fr/blog/3-technical/ 3-sprite-packing-algorithm
  23. Images => CSS https://github.com/bluesmoon/ pngtocss Remplacer les images de dégradé

    (pngtocss) et les bords arrondis par des équivalents CSS 3
  24. Regroupement CSS et Js intelligent Regrouper les multiples Js et

    Css en fonction du rubriquage de votre site.
  25. Cache HTTP / Expires Définir une durée de cache pour

    chaque élément de vos sites : Ex : ExpiresByType dans la conf Apache http://httpd.apache.org/docs/2.0/mod/ mod_expires.html
  26. Javascript externe : Asynchrone Charger les scripts qui le permettent

    en Asynchrone afin de ne pas bloquer le chargement des autres éléments. var e = document.createElement('script’); e.async = true; e.src = document.location.protocol + '// connect.facebook.net/fr_FR/all.js’; document.getElementById('fb- root').appendChild(e);
  27. Widgets ou scripts Tiers Attention à l’intégration des widgets Facebook,

    Twitter, ou tags Adsense & co … Lazyload / Cron … http://stevesouders.com/p3pc/
  28. Lazyloading Ne charger certains contenus que lorsque l’utilisateur peut le

    visualiser. var lazyLoadEnable = false, delay = 500, selector = '#shopper-widget'; function lazyLoad(){ if(!lazyLoadEnable && $(window).scrollTop() + $ (window).height() > ($(selector).offset().top - delay)){ lazyLoadEnable = true; <!-- Code here à } } $(window).scroll(lazyLoad); lazyLoad();
  29. Compression des images Jpg/Png OptiPng / Jpegtran / Pngcrush /

    Smush.it / ImageMagick GraphicMagick …
  30. Synthetic User Monitoring Instance Privée de WebPageTest Waterfall Charts /

    Vidéos comparatives IE / Firefox / Chrome http://www.webpagetest.org
  31. Real User Monitoring Navigation Timing API (spéc HTML5) Utilisation de

    l'image Object JS (new Image()) avec les paramètres relevés Node.Js : Serveur HTTP (200 ok sans contenu) et agrège les données pour les envoyer à Graphite