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

Magento 2 Performance: Every Second Counts

Magento 2 Performance: Every Second Counts

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.

Joshua Warren

November 16, 2016

More Decks by Joshua Warren

Other Decks in Programming


  1. 2016 2016

  2. @JoshuaSWarren #phpworld Magento 2 Performance: Every Second Counts

  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. @JoshuaSWarren #phpworld Performance Matters

  5. @JoshuaSWarren #phpworld 47% of consumers expect a page to load

    in 2 seconds
  6. @JoshuaSWarren #phpworld 40% abandon a website that takes more than

    3 seconds to load
  7. @JoshuaSWarren #phpworld Each 1 second delay causes at least a

    7% drop in conversions
  8. @JoshuaSWarren #phpworld If a site sells $1,000 per day, a

    1 second delay could cost $25,000/year
  9. @JoshuaSWarren #phpworld If a site sells $100,000 a day, a

    1 second delay can cost $2.5 million/year
  10. @JoshuaSWarren #phpworld Improving the load time for mobile users by

    1 second can increase conversion rates 27%
  11. @JoshuaSWarren #phpworld Load time is money

  12. @JoshuaSWarren #phpworld If a bug caused 40% of visitors to

    leave, should you fix it?
  13. @JoshuaSWarren #phpworld Poor performance is a bug.

  14. @JoshuaSWarren #phpworld And it’s a bug for developers to solve.

  15. @JoshuaSWarren #phpworld Magento 2 Performance Out of the Box

  16. None
  17. None
  18. None
  19. None
  20. @JoshuaSWarren #phpworld Given the budget, Magento 2 can scale to

    any level and remain very, very fast
  21. @JoshuaSWarren #phpworld Complex customizations, if not handled properly, can slow

    any site down significantly
  22. @JoshuaSWarren #phpworld Infrastructure Matters

  23. @JoshuaSWarren #phpworld All the performance optimizations in the world can’t

    compensate for bad hardware
  24. None
  25. @JoshuaSWarren #phpworld Please don’t host your ecommerce site on $5/month

    discount hosting
  26. @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
  27. @JoshuaSWarren #phpworld Now that your infrastructure is optimized…

  28. @JoshuaSWarren #phpworld Performance is a State of Mind

  29. @JoshuaSWarren #phpworld There are thousands of ways to implement a

  30. @JoshuaSWarren #phpworld Take the time to find the right way

  31. @JoshuaSWarren #phpworld The Right Way • Provides the desired functionality

    • Minimizes technical debt and maintenance costs • Does not reduce or slow site performance
  32. @JoshuaSWarren #phpworld Ivan’s Rules • Ivan Chepurnyi, Magento performance expert

    • https://ivanchepurnyi.github.io • Ivan has four rules that changed my (dev) life
  33. @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
  34. @JoshuaSWarren #phpworld In other words…

  35. @JoshuaSWarren #phpworld Performance problems tend to stem from too much

    I/O or I/O that’s too slow
  36. @JoshuaSWarren #phpworld In Magento 2, generally I/O = MySQL database

  37. @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
  38. @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
  39. @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
  40. @JoshuaSWarren #phpworld But what if you didn’t write the code

    on a site that’s running slowly?
  41. None
  42. @JoshuaSWarren #phpworld Real World Examples

  43. @JoshuaSWarren #phpworld Finding Performance Issues

  44. @JoshuaSWarren #phpworld You’ll need a profiler…

  45. None
  46. @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
  47. @JoshuaSWarren #phpworld Profiling Options • xdebug • xhprof • blackfire.io

    • There are many options, but…
  48. @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.
  49. @JoshuaSWarren #phpworld Hunting For Slow Code…

  50. @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.
  51. @JoshuaSWarren #phpworld Blackfire.io • I’ve chosen Blackfire.io 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
  52. @JoshuaSWarren #phpworld What can Blackfire Do? • How about point

    you to a way to make a page 99% faster? • Before: • After:
  53. @JoshuaSWarren #phpworld Let’s review the profiles in detail…

  54. @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 ?
  55. @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!
  56. @JoshuaSWarren #phpworld Let’s review the ‘after’ profile now…

  57. @JoshuaSWarren #phpworld Reviewing A Profile • Reduced the time needed

    for this SQL query from 4 minutes 54 seconds to 550 milliseconds.
  58. @JoshuaSWarren #phpworld Adventures in Magento 2 profiling on conference wifi…

  59. @JoshuaSWarren #phpworld Writing Fast Magento 2 Code

  60. @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
  61. @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
  62. @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…
  63. None
  64. @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
  65. @JoshuaSWarren #phpworld Test and profile multiple potential implementations.

  66. @JoshuaSWarren #phpworld Advanced M2 Optimization • The following tips are

    thanks to Max Pronko - https:// www.maxpronko.com/ - @max_pronko • Based on Max’s real world experience as CTO of a merchant that uses Magento 2
  67. @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
  68. @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
  69. @JoshuaSWarren #phpworld Homework

  70. @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
  71. @JoshuaSWarren #phpworld Future Events • Meet Magento World - Online

    Conference in December - http://meet-magento.com/conference/meet-magento-world/ • Magento 2 Performance Training - January 18th-20th in Orlando with Ivan Chepurnyi - http://bit.ly/2eAo8cz • Magento Imagine 2017 - April 3rd-5th in Las Vegas - imagine.magento.com 

  72. @JoshuaSWarren #phpworld Remember that performance is a state of mind

  73. @JoshuaSWarren #phpworld Poor performance is a bug

  74. @JoshuaSWarren #phpworld Go try a profiler on a Magento site,

    identify one performance problem and solve it
  75. @JoshuaSWarren #phpworld Tweet at me @JoshuaSWarren with what the problem

    was and how you solved it. I bet it’s I/O related…
  76. @JoshuaSWarren #phpworld Q&A