Zum Inhalt springen
Zapolu

Performance-Audit: Deep Dive (Beispielbericht)

Das vollständige Ergebnis eines Magento-Performance-Audits an einem fiktiven Shop: elf Befunde, jeder mit seinem Beleg, den Kosten der Behebung und einem nach Ertrag sortierten Plan. Am Ende stehen die Prüfbefehle, damit Sie dieselben Checks auf Ihrem Shop laufen lassen können.

Herunterladen

Dies ist ein Muster. Den Kunden „Acme Outdoor s.r.o.“ gibt es nicht, und die identifizierenden Details sind verändert. Die Befunde und die Zahlen sind aus echten Performance-Audits zusammengesetzt und anonymisiert: aus Audits, die Luboš Zápotočný in zehn Jahren E-Commerce-Engineering durchgeführt hat, noch vor der Gründung dieser Praxis. Es sind keine Aufträge, die unter der Marke Zapolu durchgeführt wurden; die Marke hat noch keine eigene Kundenhistorie. Der Nachweis dieser früheren Arbeit steht auf der Seite Über uns. Das Muster zeigt die Form: womit ein Befund belegt wird, was seine Behebung kostet und wie die Arbeit sortiert wird. Ein fertiger Bericht behandelt jeden Befund so ausführlich wie unten F1; dieses Muster kürzt sechs der elf, damit es lesbar bleibt.

KundeAcme Outdoor s.r.o. (fiktiv)
Shopacme-outdoor.example (Magento 2.4.6, Luma-Frontend)
StackVarnish 7, Redis 7, MySQL 8, 2 App-Nodes hinter einem Load Balancer
Berichtsdatum5. Juni 2026
Felddaten7. Mai bis 3. Juni 2026 (28 Tage)
APM-Traces21. Mai bis 3. Juni 2026 (14 Tage) und ein Lasttest
WerkzeugeNew Relic, CrUX, Lighthouse, k6, varnishstat, MySQL Slow Log
AutorLuboš Zápotočný, Zapolu s.r.o.
EngagementDeep Dive, 7 Arbeitstage, Festpreis

Für einen kurzen Überblick lesen Sie Abschnitt 1 und Abschnitt 5. Alles dazwischen ist die Beweisführung.

1. Zusammenfassung

Die Langsamkeit des Shops entsteht serverseitig. Das Feld-LCP liegt auf Katalogseiten bei 4,6 s (p75) (Ziel: ≤ 2,5 s), getrieben von einer TTFB von 1,9 s. Die TTFB ist hoch, weil der Full-Page-Cache faktisch deaktiviert ist: Varnish beantwortet nur 34 % der Katalog-Requests, und 38 % der gesamten Serverzeit entfallen auf das Rendern von Produktseiten, im Schnitt 2,2 s pro Request. Am Kampagnenabend des 26. Mai erreichte der Checkout 6,1 s (p95) und 3,4 % der Requests schlugen fehl, während die CPU der Applikationsserver nie über 12 % kam.

Es folgen elf Befunde. Sieben davon kosten einen Arbeitstag oder weniger, und zwei dieser sieben (F2 und F8) sind Änderungen an reinen Konfigurationsdateien. Die Zeilen 1 bis 6 des Fix-Plans beseitigen jeden Ausfall, den ein Kunde spürt: Der Checkout fällt in der Spitze nicht mehr aus, und das Checkout-p95 während Kampagnen sinkt von 6,1 s auf 1,9 s. Largest Contentful Paint erreicht Googles Schwelle von 2,5 s mit diesen Zeilen allein nicht. Das Budget:

StandWas sich ändertKategorie-LCPProdukt-LCP
heute4,6 s4,6 s
nach Zeile 2F1, Katalog-TTFB 1,9 s → 1,2 s3,9 s3,9 s
nach Zeile 5F5, Produkt-Hero-Bilder3,9 s3,3 s
nach Zeile 7F4 vorläufig, tote Tags und Deferral3,5 s2,9 s
nach Zeile 8F4, der Storefront-Neubau2,7 s2,1 s

Unter die Schwelle bringt die Produktseiten erst der Neubau in Zeile 8. Kategorieseiten enden bei 2,7 s und damit weiter darüber; was den Rest schließen würde, haben wir nicht untersucht (Abschnitt 6). Die Zeilen sind nach Ertrag sortiert; der Plan lässt sich an jeder Stelle anhalten.

In Geld ausgedrückt: Am Kampagnenabend des 26. Mai endeten in drei Stunden rund 230 Checkouts mit einem Fehler. Beim durchschnittlichen Bestellwert von 1 800 CZK sind das 414 000 CZK an versuchten Bestellungen, die fehlschlugen, also rund 17 000 € bei 24,3 CZK je Euro, und die Kunden, die den Checkout nach sechs Sekunden Wartezeit abgebrochen haben, sind darin nicht enthalten. Die übrigen Befunde geben wir in Millisekunden an; eine Umsatzzahl wäre für sie spekulativ, daher lassen wir sie weg.

2. Was wir gemessen haben, und wie

  • Real-User-Metriken: Core Web Vitals aus einer 28-Tage- CrUX-Abfrage, segmentiert nach Seitentyp (Home / Kategorie / Produkt / Checkout). Synthetische Lighthouse-Läufe dienten nur der Reproduktion von Befunden, nicht deren Bewertung. Wo der Shop gegenüber Googles Schwellwerten steht:

    Metrik (p75, Felddaten)ShopSchwelleUrteil
    LCP4,6 s< 2,5 sfällt durch
    INP280 ms< 200 msfällt durch
    CLS0,04< 0,1besteht
    FCP2,9 s< 1,8 sfällt durch
    TTFB1,9 s< 0,8 sfällt durch
  • Server-seitiges Tracing: New-Relic-Transaktionsprofil über 14 Tage, das zeigt, wohin die Serverzeit wirklich geht:

    TransaktionAnteil an der ServerzeitØ Antwort
    catalog/product/view38 %2,2 s
    catalog/category/view17 %1,8 s
    Checkout-REST (Warenkorb + Versand)11 %1,4 s (6,1 s p95 in der Spitze)

    Dazu das MySQL Slow Query Log, das Profil externer Dienste und Varnish-Hit/Miss-Statistiken je URL-Muster aus varnishstat.

  • Lasttest: ein Replay des Traffic-Verlaufs vom Kampagnenabend des 26. Mai (0 → 420 req/s über 20 Minuten) gegen Staging, mit demselben Cache-Zustand wie in Produktion.

  • Konfigurations-Review: PHP- und OPcache-Einstellungen, Composer-Autoloader, env.php, die Varnish-VCL und MySQL-Einstellungen, jeweils gegen Magentos dokumentierte Empfehlungen, nach oben angepasst, wo die Codebasis über den dokumentierten Wert hinauswächst.

  • Bundle- und Asset-Audit: was beim ersten Aufruf einer Produktseite ausgeliefert wird, was das Rendern blockiert und was unnötige Last ist.

Die meisten Befunde zitieren den exakten Befehl oder die exakte Query, die wir verwendet haben: einerseits, damit Ihr Team unsere Arbeit nachprüfen kann, andererseits, weil dieselben Prüfbefehle auf jedem Magento-Shop laufen, auch auf Ihrem. Abschnitt 7 sammelt sie, damit sie unverändert laufen. Zu jeder Zahl unten steht, woher sie kommt, und die Befundtabelle trägt eine Spalte, die sagt, ob die erwartete Wirkung gemessen, unter Last reproduziert oder geschätzt wurde.

3. Befunde im Überblick

Hoch: Kunden sind betroffen, oder Umsatz hängt davon ab. Mittel: das Team ist täglich betroffen, oder Daten werden still beschädigt. Niedrig: kleiner Aufwand, der ein reales Betriebsrisiko beseitigt.

#BefundSchweregradAufwandErwartete WirkungGrundlage
F1Full-Page-Cache ist faktisch deaktiviert und lässt sich nicht invalidierenHoch1–2 Tage−700 ms TTFB (p75) im Kataloggemessen
F2PHP-Runtime und Autoloader für Magento falsch konfiguriertHoch0,5 Tage−400 ms bei jedem ungecachten Requestgeschätzt
F3Checkout blockiert auf einem synchronen ERP-BestandsabrufHoch3–5 Tage−2,8 s Checkout-p95 in der Spitze; keine Timeout-Fehler mehrLasttest
F4Frontend liefert 2,3 MB JavaScript aus, renderblockierendHochProjekt−1,2 s LCP (Zwischenlösungen: −0,4 s)geschätzt
F5Produktbilder: 1,6-MB-PNGs, keine responsiven GrößenMittel1 Tag−0,6 s LCP auf Produktseitengemessen
F6Indexer auf „Update on Save“ belassenMittel0,5 TageAdmin-Speichern 30 s → ~2 s; Bestandsdrift endetgeschätzt
F7PHP-FPM-Pool durch Session-Locks in der Spitze erschöpftHoch2 TageCheckout übersteht Kampagnen-TrafficLasttest
F8Kein Grace-Modus in VarnishNiedrig0,5 TageFängt die Welle nach jedem Cache-Flush abgeschätzt
F9Zwei Extensions beobachten dasselbe Event; eine ist verwaistMittel1 Tag−300 ms beim Hinzufügen zum Warenkorbgemessen
F1041 GB tote Indexer-Temp-Tabellen in MySQLNiedrig0,5 TageBackups 60 % kleiner; Restore etwa halb so langgemessen
F11Admin-Bestellgrid filtert auf einer unindizierten SpalteNiedrig0,5 TageBestellgrid 12 s → unter 1 sgeschätzt

Grundlage sagt, woher die erwartete Wirkung stammt. Gemessen: wir haben es auf diesem Shop beobachtet. Lasttest: wir haben es auf Staging unter Kampagnenlast reproduziert. Geschätzt: es folgt aus Profil und Konfiguration, beobachtet hat es noch niemand.

4. Befunde im Detail

F1: Full-Page-Cache ist faktisch deaktiviert und lässt sich nicht invalidieren (Hoch)

Was wir sahen. Varnish meldet auf Katalog-URLs eine Hit-Rate von 34 %. Für einen Katalog dieser Größe, bei diesem Crawler-Anteil, sind über 90 % normal. Jede Kategorie- und Produktseite trägt X-Magento-Cache-Debug: MISS. Es gibt zwei unabhängige Ursachen:

  1. Eine angepasste default.xml markiert einen Header-Block (einen Store-Switcher, der die Kunden-Session liest) als cacheable="false". In Magento macht ein einziger uncachebarer Block im Layout die gesamte Seite uncachebar. Der Block kam mit einem Extension-Update im November 2025; die Hit-Rate brach in derselben Woche ein.
  2. Varnish ist im Admin aktiviert (system/full_page_cache/caching_application = 2), aber in der env.php fehlt die Sektion http_cache_hosts; Magento kann also gar keine Purge-Requests an Varnish senden. Das Team behilft sich mit einem Varnish-Neustart nach jedem Deploy, und genau deshalb sind Deploys problematisch (siehe F8).

So haben wir es verifiziert:

$ curl -sI https://acme-outdoor.example/zelte | grep -i cache-debug
X-Magento-Cache-Debug: MISS
# auf jeder geprüften Katalog-URL

$ grep -R 'cacheable="false"' app/design app/code | wc -l
1
# der Store-Switcher-Block, default.xml

$ php -r 'var_export(array_key_exists("http_cache_hosts", (include "app/etc/env.php")));'
false
# Magento kann Varnish nicht purgen

Fix. Den Switcher über eine Private-Content-Sektion rendern (Customer-Data-JS), damit die Seite cachebar bleibt (das dokumentierte Muster für session-abhängige Fragmente), und http_cache_hosts in env.php ergänzen, damit die Tag-basierte Invalidierung funktioniert und die Neustarts enden können.

Aufwand / Wirkung / Risiko. 1–2 Tage inklusive Regressionstests. Erwartet: −700 ms TTFB (p75) auf Katalogseiten (gemessen: gecachte Katalogantworten in 80 ms vs. 1,9 s ungecacht). Risiko: gering; beide Änderungen sind begrenzt und pro Deploy reversibel.

F2: PHP-Runtime und Autoloader für Magento falsch konfiguriert (Hoch)

Was wir sahen. Die Codebase umfasst ~125 000 PHP-Dateien; OPcache ist auf 10 000 konfiguriert. Der Composer-Autoloader wurde nie optimiert: vendor/composer/autoload_static.php enthält keine Class-Map, und die New-Relic-Traces zeigen ganze Sekunden in der ObjectManager-Factory-Auflösung auf kalten Pfaden. Aktuell versus empfohlen:

EinstellungAktuellEmpfohlen
opcache.max_accelerated_files10 000100 000
opcache.memory_consumption128512
opcache.validate_timestampsOn, Revalidierung alle 2 sOff; Reset beim Deploy
opcache.enable_cliOffOn (Indexer und Crons sind auch PHP)
realpath_cache_size4M32M
realpath_cache_ttl1207200
Composer-Autoloadernicht optimiertdump-autoload --optimize im Build

So haben wir es verifiziert:

$ find . -type f -name '*.php' | wc -l
124862
# PHP-Dateien in der Codebase

$ php -i | grep 'opcache.max_accelerated_files'
opcache.max_accelerated_files => 10000
# fasst 8 % davon

$ grep -c 'classMap' vendor/composer/autoload_static.php
0
# Autoloader wurde nie optimiert

Warum. Mit diesen Werten prüft und kompiliert PHP laufend einen großen Teil der Codebase neu; die Profile schreiben über die Hälfte der ungecachten Renderzeit dem Klassenladen und Seitenaufbau zu, nicht der Geschäftslogik.

Fix. Eine Konfigurationsänderung plus ein Build-Schritt. Die einzige Kopplung, die zu respektieren ist: Mit abgeschaltetem validate_timestamps muss die Deploy-Pipeline beim Release den OPcache zurücksetzen. Den genauen Schritt für Ihre aktuelle Pipeline haben wir im Fix-Plan dokumentiert.

Aufwand / Wirkung / Risiko. 0,5 Tage. Geschätzt −400 ms bei jedem ungecachten Request (und schnellere Crons und Indexer als Nebeneffekt). Risiko: gering, sofern der Deploy-Schritt zusammen mit der Konfiguration landet.

F3: Checkout blockiert auf einem synchronen ERP-Bestandsabruf (Hoch)

Was wir sahen. Im Versandschritt zeigt der Trace einen synchronen HTTPS-Call auf den Bestands-Endpoint des ERP mit 3-Sekunden-Timeout und einem Retry; das Profil externer Dienste schreibt 92 % der gesamten externen Wartezeit diesem einen Endpoint zu. Unter Kampagnenlast wird das ERP langsam, die Calls schöpfen ihren Timeout voll aus, und Checkout-Requests stauen sich. Genau daher kommen die 6,1 s p95 und die 3,4 % Fehler. Der Lasttest reproduziert es auf Staging.

Warum. Die Echtzeit-Bestandsbestätigung kam nach einem Überverkaufs-Vorfall im Jahr 2025. Die Absicht ist richtig, nur legt sie die Latenz eines Drittsystems in jeden einzelnen Checkout.

Fix. Den Bestandsabgleich aus dem Request-Pfad nehmen: gegen den lokalen Bestand reservieren, asynchron bestätigen, bei Abweichung alarmieren. Der Schutz vor Überverkauf bleibt erhalten, und der Checkout wartet nicht mehr auf das ERP. Dasselbe Muster beschreiben wir im Beitrag warum ERP und Shop beim Bestand auseinanderlaufen.

Aufwand / Wirkung / Risiko. 3–5 Tage inklusive Abweichungs-Alarm. Entfernt ~2,8 s aus dem Checkout-p95 in der Spitze und die Timeout-Fehler vollständig (beides im Lasttest mit gestubbtem Call gemessen). Risiko: mittel; es braucht eine schriftliche Freigabe des neuen Überverkaufs-Fensters (geschätzt < 0,1 % der Kampagnenbestellungen, gegenüber heute 3,4 % fehlschlagender Checkouts).

F4: Frontend liefert 2,3 MB JavaScript aus (Hoch)

Was wir sahen. Der erste Aufruf einer Produktseite lädt 2,3 MB JavaScript in 61 Dateien; die Main-Thread-Blockierung liegt auf einem Mittelklasse-Smartphone bei 2,9 s. Hinter vier der vierzehn Marketing-Tags steht kein funktionierendes Konto mehr.

Warum. Teils die Luma-Frontend-Architektur, teils acht Jahre angesammelte Tags; kein einzelner Tag dominiert die Summe.

Fix, kurzfristig (dieses Quartal). Die vier toten Tags entfernen, das Analytics-Bundle verzögern, das Bewertungs-Widget unterhalb des Folds lazy laden. Geschätzt −0,4 s LCP, 2 Tage.

Der richtige Fix (separate Entscheidung). Ein Storefront-Neubau auf Hyvä. Er ersetzt die JavaScript-Schicht von Luma, statt Teile davon nur zu verzögern; über die Payload entscheidet dann die Architektur und nicht die Pflege einzelner Tags. Es ist ein Projekt von 6–10 Wochen und verdient ein eigenes, sauber geschnittenes Angebot, keine Zeile in einer Fix-Liste. Wir nennen es hier, damit die kurzfristige Schätzung oben nicht als das Maximum gelesen wird, das erreichbar ist.

F7: PHP-FPM-Pool durch Session-Locks in der Spitze erschöpft (Hoch)

Was wir sahen. Im Lasttest beginnen die Fehler bei ~280 req/s, während die CPU bei 12 % sitzt. Die FPM-Statusseite zeigt alle Worker belegt; die Traces zeigen Warten auf Redis-Session-Locks: Kunden, die die Bestellbestätigungsseite wiederholt abfragen, halten Locks, die jeden weiteren Request derselben Session in die Warteschlange zwingen.

Fix. Session-Locking für die Polling-Endpoints deaktivieren, die Worker-Zahl auf das anheben, was der Speicher-Headroom real erlaubt (die aktuelle Zahl stammt von einem kleineren Instanztyp), und einen Alarm für die FPM-Auslastung ergänzen; dieser Ausfall blieb unbemerkt, weil die CPU-Graphen unauffällig aussahen.

Aufwand / Wirkung / Risiko. 2 Tage inklusive Wiederholung des Lasttests. Zusammen mit F3 übersteht Staging 420 req/s mit einem Checkout-p95 von 1,9 s. Risiko: gering.

F5, F6, F8, F9, F10, F11 kurz

  • F5 Bilder: die Produkt-Heroes sind 1,6-MB-PNGs, in einer einzigen Größe an jedes Gerät ausgeliefert. WebP-Konvertierung + responsive Größen über das CDN: 1 Tag, −0,6 s LCP auf Produktseiten (an einer konvertierten Stichprobe gemessen).

  • F6 Indexer: beim Massenimport im Februar 2026 auf „Update on Save“ umgestellt und nie zurück. Admin-Produktspeichern dauert 30 s, und die Abweichung zwischen Shop-Bestand und Lagerrealität geht auf Reindex-Races zurück. Geplantes Indexieren wiederherstellen: 0,5 Tage. Die 30 s sind gemessen; die Zahl nach dem Fix ist eine Schätzung.

  • F8 Varnish Grace: jeder Cache-Flush schickt heute die volle Traffic-Welle auf PHP. Der Grace-Modus liefert veraltete Objekte aus, bis der Cache wieder gefüllt ist: 0,5 Tage. Die Wirkung ist eine Schätzung.

  • F9 Doppelte Observer: zwei Extensions abonnieren dasselbe Checkout-Event; eine ist seit 2023 vom Anbieter verwaist und lädt bei jedem Aufruf das Quote neu. Entfernen (ihr Feature ist ungenutzt): 1 Tag inklusive Verifikation, −300 ms beim Hinzufügen zum Warenkorb (im Trace gemessen).

  • F10 Datenbank-Hausputz: die Datenbank trägt 41 GB catalogrule_product__temp*-Tabellen (Überbleibsel abgebrochener Indexer-Läufe aus einer älteren Magento-Version, die nie aufräumte) plus eine eigene Queue-Tabelle mit 12 Millionen Zeilen ohne Retention. Eine information_schema-Query findet sie:

    mysql> SELECT COUNT(*) tables, ROUND(SUM(data_length+index_length)
        -> /1024/1024/1024, 1) gb FROM information_schema.tables
        -> WHERE table_name LIKE 'catalogrule\_product\_\_temp%';
    +--------+------+
    | tables | gb   |
    +--------+------+
    |     96 | 41.2 |
    +--------+------+
    

    Überbleibsel löschen und Pruning ergänzen: 0,5 Tage. Backups schrumpfen von 68 GB auf 27 GB; die Restore-Zeit halbiert sich ungefähr, was aus der Größenänderung geschätzt ist und vor allem an dem Tag zählt, an dem ein Restore wirklich gebraucht wird.

  • F11 Admin-Bestellgrid: eine für das Fulfillment-Team ergänzte Spalte filtert auf einem unindizierten Attribut; das Grid lädt 12 s und bindet dabei jedes Mal einen Worker. Eine Index-Migration: 0,5 Tage. Die 12 s sind gemessen; die Zahl nach dem Fix ist eine Schätzung.

5. Der Plan, sortiert nach Ertrag pro Aufwand

ReihenfolgePunkteAufwandWas Sie bekommen
1F2 + F81 TagJeder ungecachte Request −400 ms; Cache-Flushes verursachen keine Lastspitze mehr
2F11–2 TageKatalog-TTFB −700 ms; Deploys brauchen keinen Varnish-Neustart mehr
3F6 + F10 + F111,5 TageAdmin wieder benutzbar; Bestandsdrift endet; Backups halbiert
4F72 TageCheckout fällt in der Spitze nicht mehr aus
5F5 + F92 TageProduktseiten-LCP −0,6 s; Hinzufügen zum Warenkorb −300 ms
6F33–5 TageCheckout-p95 unter 2 s während Kampagnen
7F4 kurzfristig2 TageLCP −0,4 s, bis die Storefront-Entscheidung fällt
8F4 Neubauseparates AngebotProduktseiten-LCP innerhalb der 2,5-s-Schwelle

Die Zeilen 1–6 ergeben zusammen 10,5 bis 13,5 Engineering-Tage und beheben jeden Ausfall, den ein Kunde spüren kann. Sie können nach jeder Zeile aufhören; die Arbeit bis dahin steht für sich. Zeile 6 ist die einzige, die die Architektur des Bestellpfads berührt. Wer auch immer sie umsetzt: Lassen Sie das Design von einem erfahrenen Engineer prüfen.

Messen Sie nach Zeile 6 mit derselben Felddaten-Abfrage nach, mit der dieser Bericht begonnen hat. Bewegen sich die Zahlen nicht wie vorhergesagt, kontaktieren Sie uns, und wir ermitteln die Ursache.

6. Was wir nicht geprüft haben

Sicherheitslage, SEO, Barrierefreiheit und Codequalität außerhalb der profilierten heißen Pfade liegen außerhalb des Umfangs dieses Engagements. Das Audit deckt die Standard-Store-View ab; die B2B-Store-View teilt den Stack, wurde aber nicht separat vermessen. Das Budget in Abschnitt 1 lässt Kategorieseiten 0,2 s über der 2,5-s-Schwelle, und woran das liegt, haben wir nicht ermittelt: Das braucht einen Durchgang durch die Kategorie-Templates, den dieses Engagement nicht umfasste. Eine Zugriffs-Einschränkung: Unser Audit-Benutzer konnte im Messfenster den Varnish-Admin-Socket nicht lesen; die Varnish-Laufzeitzähler stammen daher aus varnishstat-Snapshots des Hosters statt aus Live-Inspektion.

7. Anhang: die Prüfbefehle für Ihren eigenen Shop

Das sind die Read-only-Prüfungen, mit denen dieses Audit begonnen hat. Sie laufen auf jedem Magento 2 und brauchen nichts außer einer Shell und einem Datenbank-Client. Führen Sie sie aus, bevor Sie irgendjemanden mit einem Audit beauftragen, uns eingeschlossen: Fallen alle Prüfungen unauffällig aus, liegt das Problem an einer Stelle, die dieser Bericht nicht abdeckt.

1. Liefert der Full-Page-Cache tatsächlich aus? Rufen Sie eine Katalog-URL zweimal ab und lesen Sie den Debug-Header.

$ curl -sI https://ihr-shop.example/eine-kategorie | grep -i cache-debug

In Ordnung: HIT beim zweiten Aufruf. Jedes Mal MISS ist F1.

2. Macht irgendetwas die Seiten uncachebar? Ein einziger Block mit cacheable="false" irgendwo im Layout macht die ganze Seite uncachebar.

$ grep -R 'cacheable="false"' app/design app/code | wc -l

In Ordnung: 0.

3. Kann Magento Varnish überhaupt purgen?

$ php -r 'var_export(array_key_exists("http_cache_hosts", (include "app/etc/env.php")));'

In Ordnung: true, wenn Varnish der konfigurierte Cache ist.

4. Fasst OPcache die ganze Codebase? Vergleichen Sie die beiden Zahlen.

$ find . -type f -name '*.php' | wc -l
$ php -i | grep 'opcache.max_accelerated_files'

In Ordnung: die zweite Zahl ist größer als die erste.

5. Optimiert der Build den Composer-Autoloader?

$ grep -c 'classMap' vendor/composer/autoload_static.php

In Ordnung: jeder Wert ungleich 0.

6. Laufen die Indexer nach Zeitplan?

$ php bin/magento indexer:show-mode

In Ordnung: jede Zeile meldet „Update by Schedule“. Alles auf „Update on Save“ ist F6. (Befehl und Modusnamen nach Adobes Indexer-CLI-Referenz, geprüft am 1. August 2026.)

7. Wie viel totes Gewicht liegt in der Datenbank?

mysql> SELECT COUNT(*) tables, ROUND(SUM(data_length+index_length)
    -> /1024/1024/1024, 1) gb FROM information_schema.tables
    -> WHERE table_name LIKE '%\_\_temp%';

In Ordnung: eine Handvoll Tabellen. Der Shop in diesem Bericht hatte 96 davon, mit 41 GB.

8. Worauf wartet der Checkout? Diese Prüfung braucht Ihr APM statt einer Shell: Öffnen Sie die Checkout-Transaktion, gruppieren Sie nach externem Dienst und lesen Sie den Anteil an der Gesamtzeit. In diesem Bericht entfielen 92 % davon auf einen einzigen Endpoint, und das ist F3.

8. Nächste Schritte

Den Fix-Plan kann jedes kompetente Team umsetzen, auch Ihr eigenes: jeder Befund benennt die konkrete Änderung, die zu machen ist. Wenn wir ihn umsetzen sollen: Die Zeilen 1–6 passen in ein zwei- bis dreiwöchiges Festpreis-Engagement zu unseren üblichen Engagement-Bedingungen.

Fragen zu einzelnen Befunden: info@zapolu.com, oder vereinbaren Sie ein Gespräch und bringen Sie Ihre eigenen Zahlen mit; im Gespräch sagen wir Ihnen, ob sich ein Audit lohnt.