Drupal Camp Kiev 2012 - High Performance Drupal Web Sites


Published on

Published in: Technology
  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Drupal Camp Kiev 2012 - High Performance Drupal Web Sites

  1. 1. High PerformanceDrupal Web Sites 360° jbguerraz@skilld.fr
  2. 2. Whos that punk ?!● A French nerd !● Used to manage complex IT projects for the last 10 years● And many more nights on performances issues ... :)● ... who just created his own company
  3. 3. Summary Cache Upload & Download Browser rendering Compression Drupal pages architecture Analyze
  4. 4. CacheWhat should we cache ? EVERY POSSIBLE THING !!!● PHP (opcode)● Computations (functions results)● Datas (views, DB requests)● Entities & Fields (nodes, comments, taxonomy terms, user profiles,…)● Images (imagecache/styles)● HTML (page, block, panel, pane, views)● Any static ressource (CSS, JS, SWF, SVG, PDF, ZIP, Video, Sound, …) jbguerraz@skilld.fr
  5. 5. CacheHow should we cache ?PHP (opcode) : // allocate one segment of 32Mb apc.shm_segments=1 apc.shm_size=32 // do not check if php file was updated apc.stat= 0● APC // never expire apc.ttl = 0● Eaccelerator (a bit faster, // use kernel anonymous memory seg fault) apc.mmap_file_mask = /dev/zero. jbguerraz@skilld.fr
  6. 6. CacheHow should we cache ? function mymodule_complex_calculation_crazy_cache() {Computations (functions results) : static $cache ; if (isset($cache)) { return $cache ; }● drupal_static (sometime static if big if ($cache = &drupal_static(__FUNCTION__)) { return $cache; amount of calls within a page load) } if ($cache = cache_get(my_cache_item, my_cache_bin)) { $cache = $cache->data; }● cache_set / cache_get (use your own else { bin if lot of data to store and/or need // some = complex_calculation(); kitten $cache heavy calculations that kills more control over your cache) cache_set(my_cache_item, $cache, my_cache_bin); } return $cache ; } jbguerraz@skilld.fr
  7. 7. Cache Note :How should we cache ? A custom cache bin require, at module install, to create a new cache table using the same schema as core cache tables (see table below). Copy/paste from :Datas (views, DB requests) : includes/system.install● Views cache Field Type Null cid varchar(255) no● Views per user cache data longblob yes● Own cache bin for DB requests (if expire int no somehow there is a good reason created int no to request DB directly) headers text yes serialized smallint no jbguerraz@skilld.fr
  8. 8. CacheHow should we cache ?Entities (nodes, comments, taxonomy terms, user profiles,…) : Entity cache Load 1 000 users● Entity cache 50 45 40 35 First load 30 Next loads seconds 25 20 15 10 5 0 No entity cache Entity cache jbguerraz@skilld.fr
  9. 9. CacheHow should we cache ?Images (imagecache/styles) :● ImageCache● ImageCache External jbguerraz@skilld.fr
  10. 10. CacheHow should we cache ?HTML (page, block, panel, pane, views) :● Panels Page Cache● Panels Hash Cache● Varnish● Varnish ESI jbguerraz@skilld.fr
  11. 11. CacheHow should we cache ?Any static ressource (CSS, JS, SWF, SVG, PDF, ZIP, Video, Sound, …) :● Varnish● Nginx● CDN far-future jbguerraz@skilld.fr
  12. 12. CacheWhat cache backends ? http://janezurevc.name/static/bcn_cache jbguerraz@skilld.fr
  13. 13. CacheWhat about cache invalidation ?● Cache actions● Cachetags● Views content cache● Expire● Entity cache flusher jbguerraz@skilld.fr
  14. 14. Upload & DownloadCookie free domainsCDN module in order to use static resources dedicated domain(s) which differ from main domain (for instance, static.mysite.com)$cookie_domain have to be set to main domain in settings.php (for instance www.mysite.com) jbguerraz@skilld.fr
  15. 15. Upload & DownloadAggregates● JS (Advanced aggregate) Note :● CSS (Advanced aggregate) Sprites are now obselete, use CSS embeded image instead● Images & CSS (CSS (for IE, images <32Kb can be embeded image) embeded)● Images (spritesheets) jbguerraz@skilld.fr
  16. 16. Upload & DownloadParrallelization● CDN (URL sharding)● Head.js CSS● Yepnopejs(Interesting but not yet drupal integrated) JS jbguerraz@skilld.fr
  17. 17. Browser renderingJS● Rendering sequence : request as soon as it parse ● JS in footer scope● Head.js / lab.js (defer) jbguerraz@skilld.fr
  18. 18. Browser renderingCSS● Translate3D, no DOM position change● Pay attention to selectors performances ! No CSS3 selectors (great but slow)● Avoid blinking > no JS to hide an element on load, hide by CSS and show from JS (perception matters!) jbguerraz@skilld.fr
  19. 19. CompressionWhat should we compress ?● Images● CSS● JS● HTML● «Any» static file jbguerraz@skilld.fr
  20. 20. CompressionHow should we compress ?Images● Imageapi optimize ● jpegtran ● advpng jbguerraz@skilld.fr
  21. 21. CompressionHow should we compress ?CSS● Advagg CSS compress● CSS Compressor ● faster than CSSTidy● gzip jbguerraz@skilld.fr
  22. 22. CompressionHow should we compress ?JS● Advagg JS compress● JSMin ● faster than JSMin+● Gzip jbguerraz@skilld.fr
  23. 23. CompressionHow should we compress ?HTML● Gzip jbguerraz@skilld.fr
  24. 24. CompressionHow should we compress ?Any static files● Gzip jbguerraz@skilld.fr
  25. 25. Drupal pages architectureHow to build a performant page ? USE AS FEW MODULES AS POSSIBLE ! ●Search_api (solr, mongo) ●Panels ●Mongodb ●Panels everywhere ●Redis ●Views ●Memcache ●Rules ●Elysia cron ●Entities jbguerraz@skilld.fr
  26. 26. Drupal pages architectureWhy homogeneity maters ? Blocks, panes, pick one !One single way of managing « blocks » helps using ESI caching for instance; it also makes easier the cache invalidation management for these «blocks». Keep it simple : one API to implement jbguerraz@skilld.fr
  27. 27. AnalyzeBrowser level● Gtmetrix.com● Yslow● Firebug● Chrome / Safari developer tools● Whichloadsfaster.com jbguerraz@skilld.fr
  28. 28. AnalyzeDrupal level● Devel● Watchdog (redirected to syslog if needed on live server) jbguerraz@skilld.fr
  29. 29. AnalyzePHP level● FirePHP / ChromePHP● Xhprof (eventually in addition to Xdebug)● PHP error log● PHP-FPM slow logs● MySQL Slow query logs jbguerraz@skilld.fr
  30. 30. AnalyzeSystem level● strace● tcpdump & wireshark jbguerraz@skilld.fr
  31. 31. Spasibo bolshoe !Your time now, any question ? Wanna get these slides ? Search for jbguerraz on Slideshare ;) jbguerraz@skilld.fr