Neu Stabilität und Performance optimieren

lroehrs

Aktives Mitglied
10. September 2020
7
0
Moin!

Ein Kunde von uns hat Anfang kommende einen TV Auftritt und die ersten Lasttest zeigen bereits, dass der Shop höchstwahrscheinlich dem Ansturm nicht standhalten wird.

Eckdaten:
  • Shopversion: 4.06 (Build: 17)
  • PHP7.3
    • mit OPcache und APCu
  • Web/DB Cluster mit jeweils 32 Kernen
Sämtliche Software ist entsprechend aktuell, Objekt Cache ist aktiv und Sessions werden über Redis gesteuert.
Bei dem Lasttest in dem nur GET Abfragen stattfanden komme ich nicht über ca. 350rps bei nahzue 100% CPU Last auf dem Webserver.
Mit vergleichbaren Shopware Shops sind wir dabei bei mind. 850rps. Jeweils ohne Medien, entsprechend "nur" Seiten-Generierung.

Der JTL Cache habe ich ursprünglich auf Redis gesetzt, getestet jedoch auch auf Disk und tmpfs - kommt alles auf das ähnliche hinaus.
Ohne Last ist der Shop super schnell, da gibt es nichts zu beanstanden.


Bei einer Tideways-Prüfung fiel mir dann auf, dass jeder Aufruf über 20 SQL Abfragen entstehen.
Die Abfragen sind ohne Login o. ä., ich erwarte da eigentlich, dass mehr aus dem Cache beantwortet wird.
Ist das bei JTL so üblich?

Die Datenbankabfragen auf dem Datenbanken-Server fallen auch entsprechend hoch aus.

Hat jemand Tipps oder fällt ggf. noch jemanden eine Fehlkonfiguration auf?

Danke! :)
 

hula1499

Sehr aktives Mitglied
22. Juni 2011
5.389
1.315
Hm, witzige/interessante Beobachtung.

Wir haben/hatten diverse Promotions und in der ersten Stunde dann 10-15k Leute auf der Seite, davon dann rund 60-70% conversions.

Live-Tests/config:
Die CPU langweilt sich und geht nie über 5% (Strato D670, SSD, 64GB RAM)
REDIS
CDN für js/css/Bilder (nimmt natürlich viel Last ab)
ngix / sql voll auf RAM getrimmt (der geht dann aber auch auf ~90%)

An den Millionen DB Abfragen kannst leider nicht wirklich was machen.

Worauf du dich bei so einem kurzfristigen Ansturm einstellen kannst/musst:
.) nicht unerhebliche Anzahl von Doppelbestellnummern ausm Shop
.) Lagerstand Abgleichsprobleme: da Shop/ WaWi da recht zum stocken beginnen (puffer grosszügig einplanen, Abgleichintervalle runtersetzen)
.) solltest du mit Lagerbestand arbeiten und dieser während der Bestellungen ausgehen, bekommt dein Kunde auch diverse "Leerbestellungen" bedeutet: bezahlte Versandkosten ohne Produkte :D
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: lroehrs

FMoche

Moderator
Mitarbeiter
15. Dezember 2014
1.369
347
Halle (Saale)
Ahoi,

20 SQL-Abfragen pro Seite sind realistisch. Besucherstatistik und ein paar Kleinigkeiten werden immer direkt über die DB gemacht.
Für einen echten TV-Modus macht es aber auch keinen großen Unterschied - da wirst du um HTML-Caching nicht herumkommen.

Ich habe hier noch einen experimentellen Branch rumliegen, der für solche Fälle den Smarty- Cache nutzt und somit die aufwendigste Shoplogik umgeht.
Alternativ bietet sich als schnellste Möglichkeit der FastCGI-Cache an. Damit könnte man dann zumindest die Besucher abfedern, die keine Artikel im Warenkorb haben und nicht eingeloggt sind. Das sollte aber schon helfen.

Meine Testkonfiguration in nginx sieht ungefähr so aus:

Code:
upstream _php {
    server unix:/var/run/php/php7.4-fpm.sock;
}

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=JTLSHOP:350m inactive=180m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

server {
    set $skip_cache 1;
    if ($request_method = GET) {
        set $skip_cache 0;
    }
    if ($request_uri ~* "/(warenkorb.php|admin|jtl.php|warenkorb|cart|konto|account)"){
        set $skip_cache 1;
    }
    if ($http_cookie ~* "eSIdAdm|jtl_logged_in|jtl_no_cache|jtl_cart") {
        set $skip_cache 1;
    }

    location ~ \.php$ {
        try_files $uri $uri/ =404;
        fastcgi_pass _php;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_cache JTLSHOP;
        fastcgi_cache_valid 200 60m;
    }
}

Dazu dann ein Mini-Plugin, dass sobald ein Artikel in den Warenkorb gelegt wird den Cookie "jtl_cart" setzt und nach dem Login den Cookie "jtl_logged_in".


Hat aber alles seine Grenzen, was die Kompatibilität mit diversen Plugins anbelangt.
 
  • Gefällt mir
Reaktionen: lroehrs

lroehrs

Aktives Mitglied
10. September 2020
7
0
Das ist ja mal echt interessant.

Ich habe mir mal angeschaut, wie die Auslastung entsteht:

Code:
[2020-09-11 11:53:11]: FCGI Script: /index.php? Uid: 1001 Utime: 8
[2020-09-11 11:53:11]: FCGI Script: /index.php? Uid: 1001 Utime: 6
[2020-09-11 11:53:11]: FCGI Script: /index.php? Uid: 1001 Utime: 8
[2020-09-11 11:53:11]: FCGI Script: /index.php? Uid: 1001 Utime: 8

grep "2020-09-11 11:53:11" /home/var/log/scripts/fcgi | wc -l
369
grep "2020-09-11 11:53:12" /home/var/log/scripts/fcgi | wc -l
373
grep "2020-09-11 11:53:13" /home/var/log/scripts/fcgi | wc -l
360
grep "2020-09-11 11:53:14" /home/var/log/scripts/fcgi | wc -l
353
-----

Utime = CPU Sekunden * 100
360*0,08=28,8 ~29 Kerne


Das entsteht bei ca. 350 Request. Entsprechend ist es klar, dass der Webserver nahezu vollständig ausgelastet ist.
Anhand des Tideways Traces vermute ich, dass es durch Smarty Berechnungen kommt.

Der Nginx Cache Aufbau würden wir wahrscheinlich noch hinbekommen, der Auftritt ist jedoch am Montag.
Das entsprechend Plugin müsste durch den Kunden/Agentur erfolgen, wage etwas zu bezweifeln das es in der Zeit realisierbar ist.

> Ich habe hier noch einen experimentellen Branch rumliegen, der für solche Fälle den Smarty- Cache nutzt und somit die aufwendigste Shoplogik umgeht.
Wo ist der denn zu finden? :)
 

lroehrs

Aktives Mitglied
10. September 2020
7
0
Ich hab mit zwei Partner-Agenturen gesprochen, die folgendes Plugin erwähnten:

https://shop.knoell-marketing.de/JTL-Supercache

Auswirkung:

Code:
[2020-09-11 14:32:03]: FCGI Script: /index.php? Uid: 1001 Utime: 1
[2020-09-11 14:32:03]: FCGI Script: /index.php? Uid: 1001 Utime: 0
[2020-09-11 14:32:03]: FCGI Script: /index.php? Uid: 1001 Utime: 0
[2020-09-11 14:32:03]: FCGI Script: /index.php? Uid: 1001 Utime: 1
[2020-09-11 14:32:03]: FCGI Script: /index.php? Uid: 1001 Utime: 1
[2020-09-11 14:32:03]: FCGI Script: /index.php? Uid: 1001 Utime: 1
[2020-09-11 14:32:03]: FCGI Script: /index.php? Uid: 1001 Utime: 1

grep "2020-09-11 14:32:03" /home/var/log/scripts/fcgi | wc -l
1066
grep "2020-09-11 14:32:04" /home/var/log/scripts/fcgi | wc -l
1116
grep "2020-09-11 14:32:05" /home/var/log/scripts/fcgi | wc -l
1135

Bei einer CPU Last von ca. 65%.


Eine wird sich ggf. den Shop nochmal weiter anschauen, teile ich aber auch das Ergebnis aus diesem Thread mit.
Danke!
 

juergen-sfx

Offizieller Servicepartner
SPBanner
28. Februar 2013
35
2
Code:
...
    if ($request_uri ~* "/(warenkorb.php|admin|jtl.php|warenkorb|cart|konto|account)"){
        set $skip_cache 1;
    }
...

Hat aber alles seine Grenzen, was die Kompatibilität mit diversen Plugins anbelangt.

Ich mache mir da besonders in Hinblick auf Zahlungsplugins Sorgen. Müsste man da nicht die Anfragen z.B. von der PayPal IPN irgendwie ausschließen?
Ich sehe da z.B. in unseren Logs:
/includes/modules/notify.php auf das GET Anfragen abgesetzt werden.

Vielleicht könnte man hier im Thread die URLs sammeln, die man vom Caching ausschließen muss, das wäre toll.
 
  • Gefällt mir
Reaktionen: dsturm

lroehrs

Aktives Mitglied
10. September 2020
7
0
Vorab, vielen Dank an alle - ich bin überrascht und begeistert von der Unterstützung.
Mein Blick auf JTL ist inzwischen sogar richtig gut. :)



Der Abend verlief soweit gut, es gab zwar in der zweiten Welle einen temporären Ausfall, mit diesem haben wir jedoch aufgrund der kurzen Vorlaufzeit gerechnet.
Grund des Ausfalles scheint ein Hänger in der Datenbank gewesen zu sein - genaueres Details (Queries etc.) haben wir nicht geloggt und kann ich daher nicht melden.

Neben dem Caching Plugin haben wir noch Cloudflare aktiviert wodurch weniger als 1/4 der Request überhaupt an den Webserver ging.
Unglücklicherweise gab es dafür DNS-Probleme bei der Telekom. :/
Der Webserver war in der Spitze zu 30% ausgelastet.
 

lroehrs

Aktives Mitglied
10. September 2020
7
0
Glückwunsch, als Empfehlung da Du Cloudflare erwähnst, hier solltet Ihr den Webshopabgleich von Cloudflare ausschliessen um Abgleichprobleme zu vermeiden, dazu habe ich folgende Anleitung gefunden:

https://www.sfxonline.de/blog/jtl-wawi-jtl-shop-fuer-betrieb-mit-cloudflare-cdn-konfigurieren/

Stimmt, danke für die Ergänzung! Wurde bei unserem Kunden durchgeführt, für dritte die das hier lesen aber sicherlich wichtig.
 

juergen-sfx

Offizieller Servicepartner
SPBanner
28. Februar 2013
35
2
Glückwunsch, als Empfehlung da Du Cloudflare erwähnst, hier solltet Ihr den Webshopabgleich von Cloudflare ausschliessen um Abgleichprobleme zu vermeiden, dazu habe ich folgende Anleitung gefunden:

https://www.sfxonline.de/blog/jtl-wawi-jtl-shop-fuer-betrieb-mit-cloudflare-cdn-konfigurieren/
Heh, das kenn ich irgendwo her ;)

Alternativ kann man auch eine zweite dedizierte IP dafür nutzen. Hat den Vorteil, dass man diese eventuell über einen eigenen php-fpm Pool betreiben kann. Dadurch kann man die PHP Laufzeiten für Shop und Sync getrennt optimieren (Shop kurze Laufzeit um wenig Blockaden zu haben, Sync lange laufzeit.)
 
  • Gefällt mir
Reaktionen: Rainer S
Ähnliche Themen
Titel Forum Antworten Datum
Neu DP Internetmarke 2.0 vs. 1.0 – Vorteile, Stabilität und Umstieg? JTL-ShippingLabels - Ideen, Lob und Kritik 0
Neu Workflow mit UND / ODER - Bedingung erstellen JTL-Workflows - Ideen, Lob und Kritik 7
Ameise-Export: Umsatzsteuer stimmt nicht mit Differenz aus Netto und Brutto überein (insbesondere bei mehreren Steuersätzen) JTL-Wawi 1.11 0
Neu Amazon DIVID- und Lucid-Nummer User helfen Usern 0
Neu Bestände in-house und beim Lieferanten + Proforma-Rechnungen, wie? Arbeitsabläufe in JTL-Wawi 3
Neu Vater und Kinderartikel User helfen Usern - Fragen zu JTL-Wawi 11
Neu product_visibility bei JTL-Wawi und Shopware 6 Shopware-Connector 1
Probleme mit Worker und JTL-App JTL-Wawi 2.0 4
Neu Shopware 5 connector und WawI 1.11.06 bis 1.11.8 Shopware-Connector 1
Bilder unter Versand- und Zahlungsart unterschiedlich groß Einrichtung JTL-Shop5 0
Neu Widerrufsbutton: Jeder, der den Button betätigt, kann das Widerrufsformular ausfüllen und absenden - auch ohne Bestellung? Allgemeine Fragen zu JTL-Shop 64
Neu Problem mit Dantezeile und fehlerhafte Angebotsgültigkeit. Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 2
Neu JTL Pro Edition – Lizenzumstellungen und Abrechnungsfragen Smalltalk 42
Neu JTL Shop 5 und Klarna Plugins für JTL-Shop 0
Inaktive Verkaufskanäle lassen sich nicht löschen – erscheinen nach Löschen und Speichern erneut JTL-Wawi 1.11 0
Neu Neuentwicklung - Helpdesk für JTL Wawi - Eure Ideen und Wünsche? User helfen Usern - Fragen zu JTL-Wawi 4
Neu POS im Kundencenter buchen, aber wie und wo? Allgemeine Fragen zu JTL-POS 2
Neu Probleme mit Ninepoint und TikTok Shop Schnittstellen Import / Export 6
Neu 5.6.1 Bug bei Versandarten mit Kalkulation durch Artikelmenge und Staffelpreisen JTL-Shop - Fehler und Bugs 2
Neu Ältere Young Fashion Kollektion: Mit Kaufland, TikTok & Influencer schnell hochziehen und abverkaufen? Dienstleistung, Jobs und Ähnliches 1
Neu JTL samt Kaufland & TikTok kurz hochschießen und dann schließen/abverkaufen? Business Jungle 7
Plan und Produce - Produktionsbuchung JTL-Wawi 2.0 1
Neu Best Practices für den Export und die Automatisierung von täglichen Berichten in JTL‑WaWi User helfen Usern - Fragen zu JTL-Wawi 2
Plötzliche Preissenkungen auf ebay und amazon JTL-Wawi 1.10 2
Neu Bankdaten in Wawi V1.11.7 werden vererbt und nicht aktualisiert User helfen Usern - Fragen zu JTL-Wawi 2
Kunde kauft über Amazon und dann über Ebay - Mailversand JTL-Wawi 1.10 10
Neu Workflow automatisch bei Warenausgang für Bestand und Puffer JTL-Wawi - Ideen, Lob und Kritik 12
Seit umzug auf neuen Server und vorherigem update auf 2.0, startet worker nicht... JTL-Wawi 2.0 4
Neu Alte Produktbilder erscheinen im JTL-Shop trotz Löschung und neuem Upload immer wieder – JTL-Wawi enthält nur neue Bilder JTL-Wawi - Fehler und Bugs 16
Neu Bilder importieren mit "vorhandene Bilder vor dem Import entfernen und neu importieren" > eigenartiges Verhalten JTL-Ameise - Fehler und Bugs 2
Neu Gewährleistungs- und Garantielabel ab 27.09.2026 Betrieb / Pflege von JTL-Shop 1
Neu Pickliste wird auf Packtisch und in Wawi unter Picklisten nicht angezeigt. JTL-WMS / JTL-Packtisch+ - Fehler und Bugs 1
Rechnungsversand per eMail hin und wieder nicht erfolgreich JTL-Wawi 1.9 1
Neu Buchungsdatenservice richtig nutzen und Einrichten User helfen Usern - Fragen zu JTL-Wawi 0
Neu Filter und Sortierung komplett ausschalten Allgemeine Fragen zu JTL-Shop 4
Neu Shop Bestellungen und Abonnements möglich? User helfen Usern - Fragen zu JTL-Wawi 1
Neu Für die Weiterentwicklung und Betreuung unserer bestehenden Systemlandschaft suchen wir einen erfahrenen Freelancer (m/w/d) mit fundierten Kenntnissen JTL-Wawi App 1
Permanente / Laufende Inventur ohne Lagerplatz und ohne WMS mobil JTL-Wawi 1.10 2
Neu welche Sync Benutzer Daten in Shop und WAWI bei neu-Hosting über JTL Allgemeine Fragen zu JTL-Shop 0
Neu Abgleich erstellt neue Artikel aber ohne Bestand und Bestandsführung WooCommerce-Connector 2
Ameisen-Vorlagen Attribute und Eigene Felder lassen sich nicht speichern JTL-Wawi 1.11 2
Neu JTL WMS und WMS APP - UDI Codes Arbeitsabläufe in JTL-WMS / JTL-Packtisch+ 0
Neu Bildsortierung und Personalisierung eBay-Anbindung - Fehler und Bugs 4
welche Sync Benutzer Daten in Shop und WAWI bei neu-Hosting über JTL JTL-Wawi 1.11 0
Neu In welcher Datenbank-Tabelle sind Wertelisten und deren IDS von Eigenen Felder gespeichert? User helfen Usern - Fragen zu JTL-Wawi 8
Neu Kundenkonto mit UID und Bestellung als Gast JTL-Shop - Fehler und Bugs 14
Neu 12.400 Versandumschläge B4 / 6.400 Braun und 6.000 Weiß mit Faltböden / Klappböden Dienstleistung, Jobs und Ähnliches 4
Neu Ständig neue Angebote von JTL und Fallen bei Unaufmerksamkeit Smalltalk 26
Export Zahlungen Amazon marketplace bei Kombi OSS und FBA erfolgt nach JTL2DATEV unvollständig JTL-Wawi 1.9 0
Neu Abfrage Pakete nach Gewicht, Menge und durchschnittliches Gewicht Eigene Übersichten in der JTL-Wawi 0

Ähnliche Themen