Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Magento 2 Performance: Every Second Counts


Published on

On the web, every second counts. Studies have shown that a 1 second delay in load time can cost a mid-sized eCommerce company $2.5 million per year in lost revenue. Let’s look at what Magento 2 has done to improve performance and how we can take things a step further to ensure the Magento 2 sites we build and maintain are well designed, well written and very, very fast.

Presented at php[world] 2016.

Published in: Software
  • I really love the stats you have provided, it illustrated how important it is to fix slow performance. Magento 2 is not slow by default. A reason why it can be slow sometimes is that users are unable to configure it properly or sometimes extensions are not configured correctly. Also, Magento 2 is resource intensive. You must ensure the server is capable enough to handle it.
    Are you sure you want to  Yes  No
    Your message goes here

Magento 2 Performance: Every Second Counts

  1. 1. 20162016
  2. 2. @JoshuaSWarren #phpworld Magento 2 Performance: Every Second Counts
  3. 3. @JoshuaSWarren #phpworld About Me • PHP-Based Ecommerce Developer Since 1999 • Magento Developer Since 2008; Magento 2 Dev Since 2014 • Magento Master • Founder of Creatuity, Magento Enterprise Solution Partner
  4. 4. @JoshuaSWarren #phpworld Performance Matters
  5. 5. @JoshuaSWarren #phpworld 47% of consumers expect a page to load in 2 seconds
  6. 6. @JoshuaSWarren #phpworld 40% abandon a website that takes more than 3 seconds to load
  7. 7. @JoshuaSWarren #phpworld Each 1 second delay causes at least a 7% drop in conversions
  8. 8. @JoshuaSWarren #phpworld If a site sells $1,000 per day, a 1 second delay could cost $25,000/year
  9. 9. @JoshuaSWarren #phpworld If a site sells $100,000 a day, a 1 second delay can cost $2.5 million/year
  10. 10. @JoshuaSWarren #phpworld Improving the load time for mobile users by 1 second can increase conversion rates 27%
  11. 11. @JoshuaSWarren #phpworld Load time is money
  12. 12. @JoshuaSWarren #phpworld If a bug caused 40% of visitors to leave, should you fix it?
  13. 13. @JoshuaSWarren #phpworld Poor performance is a bug.
  14. 14. @JoshuaSWarren #phpworld And it’s a bug for developers to solve.
  15. 15. @JoshuaSWarren #phpworld Magento 2 Performance Out of the Box
  16. 16. @JoshuaSWarren #phpworld Given the budget, Magento 2 can scale to any level and remain very, very fast
  17. 17. @JoshuaSWarren #phpworld Complex customizations, if not handled properly, can slow any site down significantly
  18. 18. @JoshuaSWarren #phpworld Infrastructure Matters
  19. 19. @JoshuaSWarren #phpworld All the performance optimizations in the world can’t compensate for bad hardware
  20. 20. @JoshuaSWarren #phpworld Please don’t host your ecommerce site on $5/month discount hosting
  21. 21. @JoshuaSWarren #phpworld Ensure Your Environment is Well Configured • Utilize Redis for cache & session storage • If appropriate, split your web server and database onto separate servers • Run PHP 7
  22. 22. @JoshuaSWarren #phpworld Now that your infrastructure is optimized…
  23. 23. @JoshuaSWarren #phpworld Performance is a State of Mind
  24. 24. @JoshuaSWarren #phpworld There are thousands of ways to implement a feature
  25. 25. @JoshuaSWarren #phpworld Take the time to find the right way
  26. 26. @JoshuaSWarren #phpworld The Right Way • Provides the desired functionality • Minimizes technical debt and maintenance costs • Does not reduce or slow site performance
  27. 27. @JoshuaSWarren #phpworld Ivan’s Rules • Ivan Chepurnyi, Magento performance expert • • Ivan has four rules that changed my (dev) life
  28. 28. @JoshuaSWarren #phpworld Ivan’s Rules • Minimize amount of I/O operations to bare minimum • Make I/O operations as lightweight as possible • Spend time on requirement analysis • Analyze the possible data impact
  29. 29. @JoshuaSWarren #phpworld In other words…
  30. 30. @JoshuaSWarren #phpworld Performance problems tend to stem from too much I/O or I/O that’s too slow
  31. 31. @JoshuaSWarren #phpworld In Magento 2, generally I/O = MySQL database operations
  32. 32. @JoshuaSWarren #phpworld Efficient MySQL Usage • Avoid full table scans, avoid temporary tables and avoid the join buffer • Multiple simple queries tend to be faster overall than one large, complex query • Think about the underlying database usage triggered by the code you write
  33. 33. @JoshuaSWarren #phpworld Don’t Be Afraid • Don’t be afraid to create new tables when needed • Creating a new table to contain the data you need can be faster than triggering complex queries and JOINs • Don’t be afraid to try something new - the core code doesn’t always use the fastest approach
  34. 34. @JoshuaSWarren #phpworld Don’t Be Afraid • Don’t fear MySQL. The more you learn about MySQL, query optimization and how MySQL executes queries, the better you will become at performance optimization
  35. 35. @JoshuaSWarren #phpworld But what if you didn’t write the code on a site that’s running slowly?
  36. 36. @JoshuaSWarren #phpworld Real World Examples
  37. 37. @JoshuaSWarren #phpworld Finding Performance Issues
  38. 38. @JoshuaSWarren #phpworld You’ll need a profiler…
  39. 39. @JoshuaSWarren #phpworld Code Profiler • No, not the late 90’s TV show • A tool to measure the performance of your PHP code, including the time it takes to run and the resources it consumes • There are a many options for profiling your code
  40. 40. @JoshuaSWarren #phpworld Profiling Options • xdebug • xhprof • • There are many options, but…
  41. 41. @JoshuaSWarren #phpworld Rifleman’s Creed This is my rifle. There are many like it, but this one is mine. Without me, my rifle is useless. Without my rifle, I am useless.
  42. 42. @JoshuaSWarren #phpworld Hunting For Slow Code…
  43. 43. @JoshuaSWarren #phpworld Profiler’s Creed This is my profiler. There are many like it, but this one is mine. Without me, my profiler is useless. Without my profiler, I am useless.
  44. 44. @JoshuaSWarren #phpworld • I’ve chosen as my profiler of choice • I recommend it, but these techniques will work with any profiler, some just make it easier than others • Blackfire provides substantially more than what I can show today, so today we’ll just focus on performance profiling
  45. 45. @JoshuaSWarren #phpworld What can Blackfire Do? • How about point you to a way to make a page 99% faster? • Before: • After:
  46. 46. @JoshuaSWarren #phpworld Let’s review the profiles in detail…
  47. 47. @JoshuaSWarren #phpworld Reviewing A Profile • Total load time is 4 minutes 57 seconds • One call makes up 4 minutes 54 seconds - PDOStatement:execute select main_table.*, ... from sales_flat_order_grid as main_table left join sales_order_custom on sales_order_custom.order_id = main_table.entity_id left join orderarchive as orderarchive_tbl on orderarchive_tbl.order_id = main_table.entity_id where (orderarchive_tbl.order_group_id is null or orderarchive_tbl.order_group_id = ?) order by created_at desc limit ?
  48. 48. @JoshuaSWarren #phpworld Reviewing A Profile • I/O - database I/O is our bottleneck • We’re breaking Ivan’s rules - lots of I/O, and it’s not lightweight • In this case, we discovered a simple solution - not only were there multiple LEFT JOINs, they were being performed with no indexes!
  49. 49. @JoshuaSWarren #phpworld Let’s review the ‘after’ profile now…
  50. 50. @JoshuaSWarren #phpworld Reviewing A Profile • Reduced the time needed for this SQL query from 4 minutes 54 seconds to 550 milliseconds.
  51. 51. @JoshuaSWarren #phpworld Adventures in Magento 2 profiling on conference wifi…
  52. 52. @JoshuaSWarren #phpworld Writing Fast Magento 2 Code
  53. 53. @JoshuaSWarren #phpworld Build a Culture & Process of Performance • Each new commit, pull request or build should trigger a profiling run of all key pages • Any significant decreases in performance should trigger a failed build alert
  54. 54. @JoshuaSWarren #phpworld Build a Culture & Process of Performance • Spend time talking about performance when designing solutions • Share your experience and the trends you notice with your teammates and other Magento developers
  55. 55. @JoshuaSWarren #phpworld Writing Fast Magento 2 Code • Avoid the database as much as possible • When database access is required, use simple, well-indexed queries • If you see a need to access the filesystem…
  56. 56. @JoshuaSWarren #phpworld When Slow I/O Can’t Be Avoided • Move it to a background or periodic process • Utilize as much caching as possible • Design it in such a way that it impacts as few sessions as possible • Major difference between slowing down every page view on a site versus slowing down every cart completion
  57. 57. @JoshuaSWarren #phpworld Test and profile multiple potential implementations.
  58. 58. @JoshuaSWarren #phpworld Advanced M2 Optimization • The following tips are thanks to Max Pronko - https:// - @max_pronko • Based on Max’s real world experience as CTO of a merchant that uses Magento 2
  59. 59. @JoshuaSWarren #phpworld Advanced M2 Optimization • Disable unused core modules - for instance, if you don’t offer downloadable products, disable Magento_Downloadable • Disable reports and features you don’t use • Remove any blocks you aren’t using from your theme
  60. 60. @JoshuaSWarren #phpworld Advanced M2 Optimization • If your site only offers one language, disable inline translation • Move as many of your scripts as possible to load async
  61. 61. @JoshuaSWarren #phpworld Homework
  62. 62. @JoshuaSWarren #phpworld php[world] sessions • DCPHP User Group Meeting: PHP Performance Profiling Using Blackfire • Tonight, 7PM, Ash Grove B • Magento 2 Development Best Practices • Friday, 10AM, Ash Grove A
  63. 63. @JoshuaSWarren #phpworld Future Events • Meet Magento World - Online Conference in December - • Magento 2 Performance Training - January 18th-20th in Orlando with Ivan Chepurnyi - • Magento Imagine 2017 - April 3rd-5th in Las Vegas - 

  64. 64. @JoshuaSWarren #phpworld Remember that performance is a state of mind
  65. 65. @JoshuaSWarren #phpworld Poor performance is a bug
  66. 66. @JoshuaSWarren #phpworld Go try a profiler on a Magento site, identify one performance problem and solve it
  67. 67. @JoshuaSWarren #phpworld Tweet at me @JoshuaSWarren with what the problem was and how you solved it. I bet it’s I/O related…
  68. 68. @JoshuaSWarren #phpworld Q&A