Optimizing Drupal: A Practical Performance Checklist

Illustrated infographic summarizing: Optimizing Drupal: A Practical Performance Checklist

By Greg Nowak. Updated 15 October 2026.

A slow Drupal site usually reaches the business as a complaint: a campaign page takes too long, a form feels unresponsive, or staff wait every time they save content. The useful first question is where the waiting happens and what it prevents people from doing.

Use this checklist to agree on the diagnosis with your developer, agency, and hosting team. Start with important journeys, make targeted changes, and ask for evidence that the experience improved before commissioning a larger rebuild or infrastructure upgrade.

Start with four journeys and a baseline

Choose a landing page, a typical content page, a search or listing page, and a conversion journey. Include a logged-in workflow if customers or staff depend on one. Record the URL, device, login state, and the action that feels slow. Keep these conditions consistent when comparing results.

PageSpeed Insights provides a starting point. Field data reflects real visitors; lab tests help reproduce problems. Missing field data means there is insufficient coverage, so consider your own real-user monitoring, particularly for authenticated journeys.

Google's Web Vitals guidance sets the good-experience thresholds at LCP of 2.5 seconds or less, INP of 200 milliseconds or less, and CLS of 0.1 or less, assessed at the 75th percentile and separately for mobile and desktop. These cover loading, responsiveness, and visual stability. A Lighthouse score alone cannot confirm all three.

Match the symptom to the investigation

Ask the team to show which part of the request or interaction takes the time. This keeps the next task specific enough to estimate and assign.

Drupal performance triage: where to look first and who should investigate
Symptom First investigation Likely owner
Public pages stay slow on repeat visits Compare server response times and Drupal/CDN cache headers Drupal developer and hosting team
Logged-in pages or searches are slow Profile Views, database queries, custom blocks, and external calls Backend developer
The main image appears late Check image size, discovery time, and loading priority Frontend developer and content team
Menus, filters, or forms hesitate Record the interaction and inspect JavaScript work Frontend developer and script owners
Content moves while loading Check space reserved for images and delayed components Theme developer

Check what Drupal can reuse

Internal Page Cache reuses complete pages for anonymous visitors and assumes those visitors receive identical content. Anonymous carts or session-specific blocks need a deliberate alternative, such as disabling this module and using Dynamic Page Cache. A CDN or reverse proxy may already handle full-page caching.

At admin/config/development/performance, the browser and proxy maximum-age setting controls downstream caching, not Internal Page Cache's lifetime. Before increasing it, agree how published changes will reach visitors. Drupal's Internal Page Cache documentation explains the distinction.

Dynamic Page Cache supports reuse around personalized content. Have the developer inspect restrictive or missing cacheability metadata: tags identify dependencies, contexts identify variations, and maximum age describes freshness.

BigPipe can send the reusable page structure before streaming personalized components. It improves perceived loading but does not remove expensive backend work. The BigPipe documentation recommends Dynamic Page Cache alongside it. Reserve space for streamed components so they do not push other content around.

Run a repeatable cache check

From the appropriate Drupal application environment, list enabled cache modules:

drush pm:list --status=enabled --type=module | grep -E 'page_cache|dynamic_page_cache|big_pipe'

If missing modules fit the site's caching design, test enabling them in staging, then deploy the configuration through the normal release process:

drush pm:enable page_cache dynamic_page_cache big_pipe -y

Make two anonymous GET requests to the same public page. Replace the example with its final URL, avoiding redirects:

for request in 1 2; do
  curl -sS -D - -o /dev/null https://www.example.com/ | grep -iE '^(HTTP/|cache-control:|age:|x-drupal-cache:|x-drupal-dynamic-cache:)'
done

A first X-Drupal-Cache: MISS followed by HIT is normal; two hits may mean the page was already cached. A CDN can replay stored Drupal headers, so compare its cache status too. A Dynamic Page Cache miss alone is not a failure when Internal Page Cache serves the response.

Reduce browser work and avoid outdated fixes

Check production CSS and JavaScript aggregation, then inspect what each page loads. Attach gallery or filter libraries only where those components appear. Drupal's asset-library documentation explains conditional attachment. If a custom library declares a version, update it when its CSS or JavaScript changes: since Drupal 10.1.2, that version affects aggregate hashes. Omitting it uses file contents instead.

If an older checklist recommends AdvAgg, revisit it. Its maintainers describe AdvAgg as obsolete on Drupal 10.1 and later and recommend uninstalling it. Test removal with core aggregation in staging.

Serve appropriately sized responsive images, include dimensions, and avoid lazy-loading the main image visible on arrival. Review chat, tracking, video, and consent scripts with their owners. After changing script loading, test menus, validation, and form submission.

Give every fix a finish line

Prioritize by user impact, affected traffic, confidence in the diagnosis, and effort. Each task needs an owner, a baseline, an acceptance check, and a rollback approach. For a listing page, that might mean comparing response times under the same filters and confirming results remain correct.

After release, repeat comparable tests, check publishing and personalization, and complete the enquiry or transaction journey. Review field trends as fresh visits accumulate. Keep a short record of what changed and whether it helped.

If responsibility keeps bouncing between Drupal, hosting, and suppliers, Greg can help investigate the bottleneck and coordinate the work. Talk to Greg about your Drupal site's performance; bring a few slow URLs and any reports you already have.

Related on GrN.dk

Need help with this kind of work?

Talk to Greg about your Drupal site's performance Get in touch with Greg.

Sources

Seneste artikler

Når kunden beder om indsigt, kan AI hjælpe med at samle materiale fra WordPress og Microsoft 365. Se, hvordan I holder styr på datakilder, ansvar og kontrol.

Når en ingrediens ændres, kan menukortet kræve rettelser, selv om opskriftsdatoen står stille. Sådan kan AI hjælpe med gennemgang og godkendelse i WordPress.

Når checkout fejler, skal driftspartneren have noget konkret at arbejde med. Se, hvordan AI, dmesg og journalctl kan samle sporene i en brugbar driftssag.

Brug oktober til at afprøve daglige AI-forslag til genbestilling før Black Friday. Få styr på Shopify-data, leveringstid og budget, før forslagene bliver til indkøb.

Jeg lærte serverdrift ved at ødelægge mine egne servere. Jeg søger en, der vil stå ved siden af mig, mens jeg gør det, og så gøre det selv ugen efter.

Jeg er god til at bygge og dårlig til at ringe. Her er, hvem jeg vil have ved siden af mig, hvad der er lettest at sælge, og hvordan vi deler det.

AI kan samle onboardingopgaverne før første arbejdsdag. Se, hvordan lederen godkender konkret adgang, og hvordan åbne opgaver bliver fulgt til dørs.

En AI-assistent kan svare på spørgsmål og føre kunder til booking. Her er de konkrete grænser for pris, levering, personoplysninger og kontakt med en medarbejder.

Et sikkert AI-workflow kan omsætte Meet- og Teams-transskripter til godkendte beslutninger og opgaver i Jira eller Asana – uden at slippe kontrollen.

AI kan finde opsigelsesfrister og prisreguleringer i leverandørkontrakter, sende usikre fund til godkendelse og oprette de rette påmindelser.