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.285
1.222
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 Schweiz - Probleme mit Netto-/Bruttobeträgen und Steuerhandling bei Amazon Marketplace Facilitator in JTL-Wawi Amazon-Anbindung - Fehler und Bugs 0
Neu JTL Shop Anzeige Fehler Amazon Pay Button und Paypal Pay Button Allgemeine Fragen zu JTL-Shop 1
Neu Problem mit der Verbindung von JTL-Wawi (1.5.48.2) und WooCommerce (Version 9.5.2) User helfen Usern - Fragen zu JTL-Wawi 0
portokasse und Sndungsnummer JTL-Wawi 1.9 2
Statistik X und Y Achse tauschen JTL-Wawi 1.9 7
Neu Aufträge über LS-POS erstellen und digitale Unterschrift anknüpfen Arbeitsabläufe in JTL-Wawi 0
Neu (voraussichtliches) Lieferdatum und Leistungsdatum Arbeitsabläufe in JTL-Wawi 1
Neu Wawi 1.9.5.4, Ameise Preise glätten für Ebay Vorlagen und laufende Angebote?? User helfen Usern - Fragen zu JTL-Wawi 0
Neu Kundenstamm und durschnittlicher Bestellwert insgesamt User helfen Usern - Fragen zu JTL-Wawi 2
Neu Cloudflare und JTL Shop - Problem oder zu empfehlen? Allgemeine Fragen zu JTL-Shop 9
Neu Vorlagen in Version 1.9.6.5 und Eigene Felder? Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Gebinde anlegen und Eingabe im Auftrag JTL-Wawi 1.9 1
Neu Postbank und MT940/ CAMT.53 User helfen Usern - Fragen zu JTL-Wawi 2
Neu Versandkosten nach Preisstaffel (Gewicht) und Warenwert Betrieb / Pflege von JTL-Shop 1
Neu Wawi und Shop vorerst vom anderen Rechner Installation von JTL-Wawi 1
Neu Unterschiedliche Rechnungs Mailvorlagen für B2B und B2C Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 1
Neu Zwei Wawi Dropshipping und Warenbestand Übertragung User helfen Usern - Fragen zu JTL-Wawi 4
Neu Was passiert wenn ich Amazon Aufträge, Lieferscheine und Rechnungen per SQL aus der WAWI-Datenbank lösche? User helfen Usern - Fragen zu JTL-Wawi 0
Neu Update Shop von 5.2 auf 5.3 und 5.4, Schritt 2: JTL-Shop-Dateien aktualisieren Installation / Updates von JTL-Shop 25
Neu Probleme mit JTLShippingLabels und DPD JTL-ShippingLabels - Fehler und Bugs 0
Neu Suchen Freelancer für Support JTL wawi und shop sowie Anbindung an die Markplätze Dienstleistung, Jobs und Ähnliches 1
Neu Etsy und JTL? Allgemeine Fragen zu JTL-Shop 6
Neu Shop Design Desktop und Mobil unabhängig voneinander Bearbeiten Allgemeine Fragen zu JTL-Shop 2
Neu Cloudflare und Weiterleitungen im Shop Betrieb / Pflege von JTL-Shop 4
Rechnung korrigieren, Zahlungsart und Artikelbezeichnung JTL-Wawi 1.9 1
Neu Besten Hosting-Anbieter für Wawi und JTL-Shop Starten mit JTL: Projektabwicklung & Migration 6
Neu Arbeitsabauf Suche und Anlage von Kunden Arbeitsabläufe in JTL-Wawi 0
Neu GPRS Plugin Infos doppelt und in Artikelliste Plugins für JTL-Shop 2
Neu "Einheit Bezugsmenge" wird nicht immer exportiert und kann gar nicht importiert werden JTL-Ameise - Fehler und Bugs 3
Hersteller-Adresse mit auf Artikel-Etikett und Rechnung JTL-Wawi 1.9 4
Frage vor Serverwechsel und Umzug Einrichtung JTL-Shop5 8
Neu Bestellung erst nach >1h synchronisiert. - Worker mit Connector und Woocommerce Onlineshop-Anbindung 0
Neu DPD Senungsstatus unbekannt, nächste Aktualisierung leer und keine Versandemails JTL-Track&Trace - Ideen, Lob und Kritik 0
Neu Hilfe bei korrekter Variable für Umsatzsteuer-Summe und dotLiquid-Übersicht Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 0
Neu Probleme mit dem Meta-Crawler und 403 Fehler beim Meta-Datenfeed Upload User helfen Usern 0
Neue Kategorien und neue Kategorienbilder werden nicht angezeigt JTL-Wawi 1.9 0
x-Rechnung und Zugferd JTL-Wawi 1.9 61
Neu Alternative für B2B Market gesucht – Kundengruppen und JTL-Connector WooCommerce-Connector 0
"Speichern, Rechnung erstellen und ausgeben" funktioniert nicht mehr JTL-Wawi 1.9 1
Neu 1.9.5.4, Ameise und Preise importieren für das Feld "Standardpreis in neuen angelegte Vorlagen" JTL-Ameise - Fehler und Bugs 3
Neu DotLiquid Formel für Lieferadresse mail und wenn nicht vorhanden dann Rechnungsadresse mail verwenden Druck-/ E-Mail-/ Exportvorlagen in JTL-Wawi 2
Neu Biete: Windows Server optimiert für JTL und MS SQL Standard Lizenz (8 Monate alt, 42% unter Neupreis) Dienstleistung, Jobs und Ähnliches 1
Neu GPSR und Attribute User helfen Usern - Fragen zu JTL-Wawi 8
Neu Lager Ampel Text Attribut ampel_text_gruen mit Shop 5.34 und Wawi 1.8.12.2 funktioniert nicht JTL-Wawi - Fehler und Bugs 1
Neu Blogbeitrags Titelbilder und Rechtliche informationen seit update auf 5.4 nicht sichtbar/ausgeblendet. JTL-Shop - Fehler und Bugs 6
1.9.5.4 und Shop 5.3.3 fehlende Beschreibung im Shop durch Workflow, bin genervt JTL-Wawi 1.9 2
JTL Shipping: Artikelgewicht und Zusatzgewicht aus der Versandeinstellung wird nicht addiert JTL-ShippingLabels - Ideen, Lob und Kritik 2
Otto-Anbindung über JTL Wawi und Produkt-Upload JTL-Wawi 1.9 0
Neu Zahlungsarten werden nicht angezeigt... Secupay, Paypal Checkout und Shop-Zahlungsarten gleichzeitig möglich? Plugins für JTL-Shop 0
Neu Rundungen nach Shop-Import - 3. und 4. Nachkommestellen entfernen? WooCommerce-Connector 0

Ähnliche Themen