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.259
1.195
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
345
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 Ab Version 1.9.6.0: XRechnung 3.0.2 und ZUGFeRD News, Events und Umfragen 0
Neu XRechnung/E-Rechnung und verschiedene eMail-Empfänger JTL-Wawi - Ideen, Lob und Kritik 1
Neu "Noch X € und wir versenden kostenfrei" hat einen Fehler Betrieb / Pflege von JTL-Shop 0
Preiskalkulation auf Grundlage von Lieferantenpreise und Lieferantenbestand JTL-Wawi 1.8 1
Neu Wasserzeichen auf Lieferschein und Rechnung auf ganze A4 Seite User helfen Usern - Fragen zu JTL-Wawi 5
Neu Connector Verhalten mit Tracking Nummern und Versandbestätigungen Shopify-Connector 0
otto.de Anbindung und Einrichtung in JTL Wawi JTL-Wawi 1.9 0
dbo.tFile und tZahlungsabgleichLogeintrag - kann man hier gefahrlos Datensätze löschen? JTL-Wawi 1.9 5
Anlage neuer Artikelstamm und Erstinventur Lager JTL-Wawi 1.9 1
Neu Breadcrumb Navigation bei Kategorie-, Hersteller- und Merkmallisten verschieden JTL-Shop - Fehler und Bugs 0
Artikelstatistik richtig einstellen und verstehen JTL-Wawi 1.9 2
Aktuelle Störung der SCX-Schnittstelle und weiterer JTL-Systeme Störungsmeldungen 1
Neu Fehlermeldungen und kaputte Designvorlage eBay-Anbindung - Fehler und Bugs 0
Seite Artikel->Sonderpreise und Sonderpreiskationen definieren JTL-Wawi 1.9 0
Neu SQL Server kein Mandant auswählbar und Dienst lässt sich nicht starten Installation von JTL-Wawi 2
Schnittstelle für Zalando, Kaufland und Otto JTL-Wawi 1.9 5
Neu Ameise-Vorlage per SQL abrufen und Daten als Ergebnis erhalten JTL Ameise - Eigene Exporte 1
Neu Übersicht Verkauf mit Artikelmenge und durchschnittlichem VK netto Eigene Übersichten in der JTL-Wawi 6
Neu Gehosteter Shop nicht mehr aufrufbar und auch kein admin-Login mehr möglich JTL-Shop - Fehler und Bugs 3
JTL-Vouchers und Shopify Allgemeine Fragen zu JTL-Vouchers 3
Neu Spam Newsletteranmeldungen und Shop Anmeldungen Allgemeine Fragen zu JTL-Shop 3
Neu Shopify Versandkosten und Mindestbestellwert Shopify-Connector 0
Neu 1.2.3.8 startet nicht und stürtzt sofort ab User helfen Usern - Fragen zu JTL-Wawi 11
Neu SQL DB läuft mit Fehler voll und crasht Server JTL-Shop - Fehler und Bugs 1
Neu Workflow und Version für Vorhaben Starten mit JTL: Projektabwicklung & Migration 3
Neu Bestellungen und Kunden werden nicht importiert JTL-Shop - Fehler und Bugs 10
Filter und Workflows nicht auf Vaterartikel anwendbar JTL-Workflows - Fehler und Bugs 0
Neu In Filiale umbuchen mit Packungsgröße und dort mit JTL-POS einzeln "verkaufen" User helfen Usern - Fragen zu JTL-Wawi 3
Neu POS GTIN Suche und Wawi ausbuchen JTL-POS - Fehler und Bugs 0
Neu TSE (RKSV) und USB-Reader - Android 14 JTL-POS - Fehler und Bugs 0
Neu Neueste Version Paypal Checkout: Rechnungskauf mit Ratepay und Paypal-Kreditkarte sind nicht verfügbar. Plugins für JTL-Shop 21
Neu 🎉 Neues Plugin: "Versandkosten und Lieferzeit automatisch beziehen - ShipMonk Extension" 🎉 Plugins für JTL-Shop 1
Neu Artikel per Dropshipping versenden und selbst versenden Arbeitsabläufe in JTL-Wawi 1
Neu Anfägerfragen und Installtion auf ngix server Installation / Updates von JTL-Shop 13
Neu 🎉 Neues Plugin: "Versandkosten und Lieferzeit automatisch beziehen - DHL-Express Extension" 🎉 Plugins für JTL-Shop 3
Neu Wichtige Infos zu GPSR-Attributen für JTL-eazyAuction und kommende JTL-Wawi Version 1.9.6.0 Einrichtung und Installation von JTL-eazyAuction 148
Überschriften und Titel in Angeboten JTL-Wawi 1.9 3
Rechnungen an Ebay und Amazon Kunden immer digital zusenden JTL-Wawi 1.9 0
Neu Gibt es keinen Gambio Connector mehr mehr mit PHP8 und höher? Gambio-Connector 4
Neu WooCommerce und JTL Wawi lassen sich nicht verbinden WooCommerce-Connector 3
Neu Übersetzung Shop und einiger Produkte Betrieb / Pflege von JTL-Shop 2
Neu Biete: Bastel- und Schreibwarenartikel aus Ladenauflösung Dienstleistung, Jobs und Ähnliches 0
Neu Exchange Online, OAuth und Send As JTL-Wawi - Ideen, Lob und Kritik 2
Mollie und die Wawi JTL-Wawi 1.8 5
Neu Wawi OpenTrans und MyFactory User helfen Usern 0
Neu Doppelte Artikel und SEO User helfen Usern - Fragen zu JTL-Wawi 0
Neu 2 Warenwirtschaften in 1 Haupt und 1 Mandant Umwandeln User helfen Usern - Fragen zu JTL-Wawi 5
Neu Toplevel-Banner hinzufügen und/oder über Wawi Steuern Allgemeine Fragen zu JTL-Shop 0
Neu Artikel- und Versandgewicht bei Stücklisten wird nicht nachberechnet JTL-Version 1.8.12.2 JTL-Wawi - Fehler und Bugs 4
Variationsertikel erstellen und in Woocommerce einbinden JTL-Wawi 1.9 4

Ähnliche Themen