RESOURCES / BLOGS /

How to Fix a Slow Magento 2 Store: A Technical Checklist

LET’S CONNECT

Have a Technology Challenge? Let’s Solve It.

Tell us what you want to improve, build, integrate or automate. Our experts will review your requirements and connect you with the right specialist.

Table of Contents

What You Will Know After Reading This

  • The Core Web Vitals targets Google applies to commerce pages: LCP under 2.5s, INP under 200ms, CLS under 0.1, measured at the 75th percentile of real visits.
  • How one cacheable="false" block bypasses Varnish, and why Redis session locking stalls checkout during spikes.
  • Which log tables to prune and how to keep indexers on schedule.
  • How to audit RequireJS, Knockout.js and third-party JavaScript that pushes INP past 200ms.
  • How to put a revenue figure on a performance audit.

Table of Contents


The Core Enterprise Reality: Why Standard Magento 2 Builds Crawl Under Load

A Magento 2 slow website is rarely a hardware problem: when Time to First Byte exceeds 800ms on cacheable pages, the cause is usually cache bypasses, bloated tables, or uncached AJAX, not RAM.

Most teams double the instance size, add PHP-FPM workers, and watch the store crawl again two weeks later. Extra capacity just runs the same wasteful work slightly faster.

On a cache miss, Magento merges layout XML, renders hundreds of blocks, runs every plugin and observer on the request, then loads EAV collections from tables holding years of unpruned rows. Add a 3x promotional spike and PHP-FPM workers queue behind Redis session locks and slow queries. LCP climbs past 4 seconds while CPU cores sit half idle.

That is why our Magento development and performance services begin with APM traces, Varnish hit ratios and slow-query logs before anyone touches instance sizes.

Struggling With Slow Page Speeds or Cart Abandonment? Stop guessing bottlenecks. Request a Magento performance audit to profile your database and cache layers with Ekfrazo’s senior engineers.

Diagnosing a Magento 2 Slow Website: Bottleneck Matrix and Revenue Math

Most Magento 2 slowdowns trace back to five bottlenecks: Varnish bypasses, Redis session locks, database bloat, JavaScript overhead and OpenSearch latency, each with a specific Core Web Vitals failure and fix.

Performance Bottleneck Root Technical Cause Core Web Vitals Impact Engineering Fix
Varnish full-page cache bypass cacheable="false" in a shared layout handle; dynamic blocks without ESI; utm_* params fragmenting cache TTFB jumps from ~50ms to 1–3s; LCP fails Remove page-level cacheable="false", use customer-data sections or ESI, strip marketing params in VCL
Redis session locking Sessions sharing an instance with cache; concurrent AJAX calls waiting on one lock Checkout TTFB balloons under concurrency; INP degrades Separate instances, tune max_concurrency, test disable_locking
Database bloat Unpruned report_event, customer_visitor, legacy log_visitor; swollen *_cl changelogs Slow collection loads on every cache miss Prune, archive, keep indexers on schedule
Magento page speed: JavaScript overhead Luma’s RequireJS/Knockout.js payload plus third-party trackers and widgets INP over 200ms; render-blocking delays LCP Advanced bundling, critical CSS, deferred third-party scripts
Adobe Commerce performance: OpenSearch latency Too many filterable attributes, heavy layered-nav aggregations, undersized JVM heap Slow category and search pages; LCP fails on PLPs Trim filterable attributes, right-size heap, tune search config

Scenario Math: What One Second of LCP Costs a $10M Merchant

Take 4,000,000 annual sessions, a 2.0% conversion rate and a $125 average order value: 80,000 orders, $10M GMV. Industry studies tie each extra second of load time to a 7–11% conversion drop.

  • At 7%: conversion falls to 1.86%, orders drop to 74,400, revenue lands at $9.3M. Loss: $700,000.
  • At 11%: conversion falls to 1.78%, orders drop to 71,200, revenue lands at $8.9M. Loss: $1.1M.

Recovering one second of LCP usually pays for an audit within a quarter.

Request Flow: Where Each Layer Breaks

[Browser Request] --> [Varnish Cache (ESI)] --> [Nginx / PHP-FPM] --> [Redis Session/Cache] --> [MySQL / OpenSearch Catalog Query]

[Browser Request]
       |
       v
[Varnish Cache (ESI)] ---- HIT (~20-50ms TTFB) ----> [Cached HTML + ESI fragments]
       |                    FAILS WHEN: cacheable="false", cookie/param variance
       | MISS / BYPASS
       v
[Nginx / PHP-FPM] ......... layout merge, block render, plugins, observers
       |                    FAILS WHEN: global observers, stacked around-plugins
       v
[Redis Session/Cache] ..... session lock, config/layout/block cache
       |                    FAILS WHEN: shared instance, lock contention, eviction
       v
[MySQL / OpenSearch Catalog Query]
                            FAILS WHEN: bloated tables, table scans, heavy aggregations

The Ekfrazo 5-Stage Magento Speed Optimization Checklist

Magento speed optimization works best in a fixed five-stage order: cache first, then sessions, database, front-end JavaScript and search, because each stage removes load that masks the next bottleneck.

Phase 1: Varnish Cache & Edge Side Includes (ESI) Optimization

Regenerate your VCL with bin/magento varnish:vcl:generate --export-version=6, then hunt for page-killing blocks:

grep -rn 'cacheable="false"' app/code app/design vendor --include=*.xml

One cacheable="false" block in default.xml disables full-page cache site-wide. Move per-customer content (mini-cart, wishlist count) into customer-data sections, or give shared dynamic blocks a ttl attribute so Magento serves them as <esi:include> holes. Strip gclid, fbclid and utm_* in vcl_recv. Target a 90%+ hit ratio on catalog pages, checked with varnishstat.

Phase 2: Redis Session Locking & Backend Cache Tuning

Put sessions on their own Redis instance, with an eviction policy that never drops live carts. In app/etc/env.php:

'session' => [
    'save' => 'redis',
    'redis' => [
        'host' => 'redis-session',
        'port' => '6379',
        'database' => '0',
        'max_concurrency' => '20',
        'break_after_frontend' => '5',
        'disable_locking' => '1', // enable only after regression-testing cart writes
    ],
],

On Magento 2.4.x, enable the L2 cache backend with preload_keys and use_stale_cache so cache regeneration storms stop stalling PHP-FPM.

Phase 3: Database Log Pruning & Index Optimization (data_staging_log, report_event)

Start with a size query:

SELECT table_name, ROUND((data_length + index_length)/1024/1024) AS size_mb
FROM information_schema.tables
WHERE table_schema = DATABASE()
ORDER BY size_mb DESC LIMIT 20;

Usual offenders: report_event, customer_visitor, magento_logging_event, cron_schedule, abandoned quote rows, plus data_staging_log and log_visitor left behind by migrations or custom modules. Archive what compliance needs, truncate the rest, and fix the cleanup crons. Set indexers to bin/magento indexer:set-mode schedule, confirm *_cl tables are draining, and enable long_query_time=1 to catch full table scans.

Phase 4: JavaScript Bundling, RequireJS, and Critical CSS Tuning

Native bundling ships oversized bundles that often hurt more than help. Replace it with page-type bundles (Magepack or r.js), then:

  • bin/magento config:set dev/css/use_css_critical_path 1 with a theme-level critical.css
  • Enable dev/js/minify_files and dev/template/minify_html in production mode
  • Preload the LCP hero image with fetchpriority="high" and never lazy-load it
  • Reserve space for customer-data blocks to keep CLS under 0.1
  • Use the Long Animation Frames API to find which module script blocks INP

Phase 5: OpenSearch Catalog Indexing & Query Latency Reduction

Every filterable attribute adds a layered-navigation aggregation, so keep only the ones shoppers use. Size the JVM heap at no more than 50% of node RAM and below roughly 31GB. Before go-live, load-test with bin/magento setup:perf:generate-fixtures setup/performance-toolkit/profiles/ce/large.xml and the bundled JMeter toolkit, targeting p95 search response under 300ms at peak concurrency.

Where Adobe Commerce Performance Projects Fail: Hidden Module and Bloat Traps

Adobe Commerce performance projects fail when teams tune servers while ignoring code: one global observer or unindexed filter query can add several hundred milliseconds to every uncached request.

1. Global observers. Extensions on controller_action_predispatch that call external APIs or load full collections on every page.

2. Stacked around-plugins. Three extensions wrapping getFinalPrice() triple interceptor work on every tile of a 48-item category page.

3. Custom filter table scans. Layered-nav filters built on varchar EAV attributes join catalog_product_entity_varchar without usable indexes.

4. Checkout AJAX storms. Modules that invalidate every customer-data section force repeated customer/section/load calls. Our guide to Magento checkout performance and AJAX optimization covers that fix in depth.

3 Questions CTOs Should Ask Agencies Before Buying Magento Performance Audits

  1. Will you profile with real-user CrUX data and APM traces (New Relic, Blackfire), or only Lighthouse scores?
  2. Will findings name the exact modules, layout handles and queries, with an estimated millisecond saving for each?
  3. How will you prove gains under load: which fixture profile, what concurrency, and which p95 targets?

Qualification Matrix: When to Tune vs. Replatform for Magento Page Speed

Tune your current build if it passes Core Web Vitals once caching and data issues are fixed; move to Hyvä or headless when Luma’s RequireJS and Knockout payload keeps mobile INP above 200ms after tuning.

Tune & Optimize If Move to Hyvä or Headless If
Mobile LCP fails mainly on TTFB, pointing to cache and database fixes Mobile INP stays above 200ms after bundling and third-party cleanup
Varnish hit ratio sits below 70% because of fixable cacheable="false" blocks The theme depends on dozens of Knockout.js widgets that need rewriting anyway
The monolith is stable and fits your roadmap You need multiple storefronts fed by one commerce API

How Ekfrazo Delivers Sub-Second Magento Commerce

Ekfrazo pairs a 5-stage technical audit with CX, EX and OX alignment, so sub-second pages show up as higher conversion, fewer support tickets and lower hosting spend under ISO/IEC-aligned governance.

Customers feel it when LCP and INP pass. Merchandisers feel it when reindexes stop blocking their work. Operations feel it when infrastructure matches real demand, which is why we map every audit to the Adobe Commerce high-traffic hosting requirements your peak season actually needs.

Find Out Exactly Where Your Store Loses Its Seconds

Our senior engineers profile every layer from Varnish to OpenSearch, then hand you a ranked fix list with projected LCP, INP and revenue impact.

Request a Magento performance audit

Frequently Asked Questions

Why is my Magento 2 website so slow?

A Magento 2 store is usually slow because pages bypass Varnish, Redis sessions lock under concurrency, log tables have grown past several gigabytes, or third-party JavaScript pushes INP beyond 200ms. Server size is rarely the root cause.

What Core Web Vitals scores should a Magento store target in 2026?

Aim for LCP under 2.5 seconds, INP under 200 milliseconds and CLS under 0.1, measured at the 75th percentile of real-user visits on mobile and desktop.

How long does Magento speed optimization take?

A focused audit takes one to two weeks. Cache, Redis and database fixes usually ship within two to four weeks, while front-end JavaScript refactoring or a Hyvä migration runs longer.

Does Adobe Commerce Cloud use Varnish for full-page caching?

Adobe Commerce on cloud infrastructure uses Fastly as its full-page cache and CDN instead of self-managed Varnish, so ESI rules, cache bypasses and hit ratios are tuned through Fastly VCL snippets.

Will moving to Hyvä fix a slow Magento 2 website?

Hyvä fixes front-end weight by replacing RequireJS and Knockout.js with Alpine.js and Tailwind, which improves LCP and INP. It will not fix Varnish bypasses, Redis locking or database bloat, so those need tuning first.

Table of Contents
FREE TECHNOLOGY ASSESSMENT

Not Sure Where to Start?

Get an expert review of your current technology landscape and a clear view of where to improve integration, automation, architecture and performance.

No-obligation discussion · Tailored recommendations

LET’S TALK

Have a Technology Challenge? Let’s Solve It.

Whether you are modernising legacy systems, integrating platforms or planning your next AI initiative, our specialists can help you plan the next step with confidence.