magento 2 performance: every second counts
TRANSCRIPT
20162016
@JoshuaSWarren #phpworld
Magento 2 Performance: Every Second Counts
@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
@JoshuaSWarren #phpworld
Performance Matters
@JoshuaSWarren #phpworld
47% of consumers expect a page to load in 2 seconds
@JoshuaSWarren #phpworld
40% abandon a website that takes more than 3 seconds to load
@JoshuaSWarren #phpworld
Each 1 second delay causes at least a 7% drop in conversions
@JoshuaSWarren #phpworld
If a site sells $1,000 per day, a 1 second delay could cost $25,000/year
@JoshuaSWarren #phpworld
If a site sells $100,000 a day, a 1 second delay can cost $2.5 million/year
@JoshuaSWarren #phpworld
Improving the load time for mobile users by 1 second can increase
conversion rates 27%
@JoshuaSWarren #phpworld
Load time is money
@JoshuaSWarren #phpworld
If a bug caused 40% of visitors to leave, should you fix it?
@JoshuaSWarren #phpworld
Poor performance is a bug.
@JoshuaSWarren #phpworld
And it’s a bug for developers to solve.
@JoshuaSWarren #phpworld
Magento 2 Performance Out of the Box
@JoshuaSWarren #phpworld
Given the budget, Magento 2 can scale to any level and remain very, very fast
@JoshuaSWarren #phpworld
Complex customizations, if not handled properly, can slow any site down
significantly
@JoshuaSWarren #phpworld
Infrastructure Matters
@JoshuaSWarren #phpworld
All the performance optimizations in the world can’t compensate for bad hardware
@JoshuaSWarren #phpworld
Please don’t host your ecommerce site on $5/month discount hosting
@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
@JoshuaSWarren #phpworld
Now that your infrastructure is optimized…
@JoshuaSWarren #phpworld
Performance is a State of Mind
@JoshuaSWarren #phpworld
There are thousands of ways to implement a feature
@JoshuaSWarren #phpworld
Take the time to find the right way
@JoshuaSWarren #phpworld
The Right Way
• Provides the desired functionality
• Minimizes technical debt and maintenance costs
• Does not reduce or slow site performance
@JoshuaSWarren #phpworld
Ivan’s Rules
• Ivan Chepurnyi, Magento performance expert
• https://ivanchepurnyi.github.io
• Ivan has four rules that changed my (dev) life
@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
@JoshuaSWarren #phpworld
In other words…
@JoshuaSWarren #phpworld
Performance problems tend to stem from too much I/O or I/O that’s too slow
@JoshuaSWarren #phpworld
In Magento 2, generally I/O = MySQL database operations
@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
@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
@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
@JoshuaSWarren #phpworld
But what if you didn’t write the code on a site that’s running slowly?
@JoshuaSWarren #phpworld
Real World Examples
@JoshuaSWarren #phpworld
Finding Performance Issues
@JoshuaSWarren #phpworld
You’ll need a profiler…
@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
@JoshuaSWarren #phpworld
Profiling Options
• xdebug
• xhprof
• blackfire.io
• There are many options, but…
@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.
@JoshuaSWarren #phpworld
Hunting For Slow Code…
@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.
@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
@JoshuaSWarren #phpworld
What can Blackfire Do?• How about point you to a way to make a page 99% faster?
• Before:
• After:
@JoshuaSWarren #phpworld
Let’s review the profiles in detail…
@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 ?
@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!
@JoshuaSWarren #phpworld
Let’s review the ‘after’ profile now…
@JoshuaSWarren #phpworld
Reviewing A Profile
• Reduced the time needed for this SQL query from 4 minutes 54 seconds to 550 milliseconds.
@JoshuaSWarren #phpworld
Adventures in Magento 2 profiling on conference wifi…
@JoshuaSWarren #phpworld
Writing Fast Magento 2 Code
@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
@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
@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…
@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
@JoshuaSWarren #phpworld
Test and profile multiple potential implementations.
@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
@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
@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
@JoshuaSWarren #phpworld
Homework
@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
@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
@JoshuaSWarren #phpworld
Remember that performance is a state of mind
@JoshuaSWarren #phpworld
Poor performance is a bug
@JoshuaSWarren #phpworld
Go try a profiler on a Magento site, identify one performance problem and
solve it
@JoshuaSWarren #phpworld
Tweet at me @JoshuaSWarren with what the problem was and how you solved it.
I bet it’s I/O related…
@JoshuaSWarren #phpworld
Q&A