Cache nach warmup über 100GB groß

Hallo,
ich stoße in letzter Zeit so ziemlich an meine Grenzen, was das Verständnis vom Cache betrifft.
In vielen Foreneinträgen ist die Rede von „wenn der Cache über 2-3 GB groß ist, etwas nicht in Ordnung ist“.
Bei mir ist es um ein vielfaches höher, was vermultich überhaupt nicht richtig ist.

Ausgangssituation:
https://www.alternative-haustechnik.de/
Ich lasse 02:00 Uhr nachts den Cache leeren und 02:30 Uhr den Cache wieder aufwärmen.
Das Aufwärmen ist gegen 07:00 Uhr fertig.
Danach ist mein Http-Reverse-Proxy auf ca. 110GB gestiegen:

 

(das riecht doch schon danach, das hier etwas nicht stimmt).

Zu meiner Umgebung:
Ich nutze einen Hosting Performance+ Managed V-Server (mit SSD Festplatte):

 

 

Mein Webshop besitzt folgende Ausgangssituation:
Ca. 110.000 Artikel, davon ca. 50.000 als Varianten angelegt, mit bis zu 500 Varianten pro Artikel.

Im Großen und Ganzen läuft der Shop, aber die Größe des Caches macht mir schon Sorgen.

Mein Provider schrieb folgendes:

> Laut mySQL slow-query-log gibt es auch einige Abfragen die sehr umfangreich sind.
>
> >Query_time: 5.230499 Lock_time: 0.000138 Rows_sent: 1 Rows_examined:
> >5247205 # Time: 170203 10:15:21 # User@Host: 
> >localhost [] # Query_time: 5.230499 Lock_time: 0.000138 Rows_sent: 1
> >Rows_examined: 5247205 SET timestamp=1486113321; SELECT
>
> >MIN(ROUND(defaultPrice.price * availableVariant.minpurchase * ((100 -
> IFNULL(priceGroup.discount, 0)) / 100) * (( (CASE tax.id WHEN 1 THEN 
> 19 WHEN 4 THEN 7 END) + 100) / 100) * 1, 2)) as cheapest_price FROM 
> s_articles product INNER JOIN >s_articles_details variant ON 
> variant.id = product.main_detail_id
>
> > AND variant.active = 1
>
> > AND product.active = 1 INNER JOIN s_core_tax tax ON 
> > tax.id = product.taxID INNER JOIN s_articles_categories_ro
> > productCategory2 ON productCategory2.articleID = product.id
>
> > AND productCategory2.categoryID IN (3658) LEFT JOIN 
> > s_articles_avoid_customergroups avoidCustomerGroup ON 
> > avoidCustomerGroup.articleID = product.id
>
> > AND avoidCustomerGroup.customerGroupId IN (1) INNER JOIN 
> > s_articles_details availableVariant ON availableVariant.articleID = 
> > product.id
>
> > AND availableVariant.active = 1 LEFT JOIN 
> > s_core_pricegroups_discounts priceGroup ON priceGroup.groupID = 
> > product.pricegroupID
>
> > AND priceGroup.discountstart = 1
>
> > AND priceGroup.customergroupID = '1'
>
> > AND product.pricegroupActive = 1 INNER JOIN 
> > s_articles_prices defaultPrice ON defaultPrice.articledetailsID = 
> > availableVariant.id
>
> > AND defaultPrice.pricegroup = 'EK'
>
> > AND defaultPrice.from = 1 LEFT JOIN s_articles_prices 
> > customerPrice ON customerPrice.articleID = product.id
>
> > AND customerPrice.pricegroup = 'EK'
>
> > AND customerPrice.from = 1
>
> > AND availableVariant.id = customerPrice.articledetailsID
>
> >INNER JOIN s_articles_attributes productAttribute ON
>
> >productAttribute.articledetailsID = variant.id WHERE
>
> >avoidCustomerGroup.articleID IS NULL GROUP BY product.id ORDER BY
>
> >cheapest_price DESC LIMIT 1 >OFFSET 0;

> Prinzipiell sollte man hier den Shopware Support (falls möglich) 
> kontaktieren und hinsichtlich der Optimierungsmöglichkeiten bei ihrem 
> Artikelstamm bzw. der Kategorisierung befragen.

Ich vermutete schon sämtliche Einstellungen/Plugins, aber bisher hat sich noch nichts verringert.
Könnte es mU. an den vielen Errorlogs liegen (Legacy media url detected.) - sprich die Bilderumleitungen? Die muss ich mal noch händisch in jedem Artikel ändern.
Könnte es mU. am mitho404-Weiterleitungsplugin liegen?
Ich vermute aber mal, dass es an etwas ganz anderen liegt, worüber ich aktuell noch grüble und ggf. durch eure Hilfe drauf kommen könnte.

Habe ich etwas vergessen zu erwähnen?
Die vielen Variantenartikel liegen unter:
Heizkörper von Kermi online bestellen | Alternative Haustechnik GmbH
Purmo Heizkörper jetzt günstig online kaufen - inkl. Telefonberatung ? | Alternative Haustechnik GmbH
60.000 Einzelartikel liegen unter:
https://www.alternative-haustechnik.de/ersatzteile/

 

Vielleicht habt Ihr Tipps für mich.

Ich glaube eher, dass dein Cache nie komplett leer geworden ist. 100GB löscht ein Cronjob nicht mal eben.

Hast du das mal überprüft? Also ob er nach dem Löschen auch wirklich leer ist?

@Moritz Naczenski schrieb:

Ich glaube eher, dass dein Cache nie komplett leer geworden ist. 100GB löscht ein Cronjob nicht mal eben.

Hast du das mal überprüft? Also ob er nach dem Löschen auch wirklich leer ist?

Danke für die Rückmeldung, ich habe soeben den Cache komplett geleert (über das Backend), die Abfrage dauerte ca. 5-10 Sek.:

Ich werde jetzt mal zusätzlich auf unserem Server noch den production Ordner umbennen und komplett löschen.
Danach lass ich den Cache noch einmal aufwärmen und berichte dann.

Leider ist mein Cache nach folgenden Aktionen immer noch so riesig.

  • Cache im Backend geleert und production Ordner umbenannt und gelöscht
  • Testumgebung als Unterordner der Liveumgebung gelöscht (ggf. kam hier etwas durcheinander)
  • Thumbnails neu generieren lassen und alte Leichen entfernt

Er baut aber wiederrum den Cache auf über 100GB auf.

Hätte jemand noch einen Tipp wo ich nachschauen könnte?

Mach das gleiche doch mal in einer Testumgebung ohne Plugins

@Moritz Naczenski schrieb:

Mach das gleiche doch mal in einer Testumgebung ohne Plugins

Ok, werde dann mal eine neue Testumgebung aufsetzen und es versuchen. Melde mich wieder.

@Moritz Naczenski schrieb:

Mach das gleiche doch mal in einer Testumgebung ohne Plugins

Hallo Herr Naczenski,
ich habe jetzt in einer Testumgebung alle Plugins deaktiviert und den Cache aufgewärmt -> leider wieder das gleiche Ergebnis.
Ich habe so langsam die Vermutung, das etwas mit der s_search_index nicht passt.
Weder über das Backend noch per CLI cron passiert hier glaube ich etwas, die Tabelle ist meines Achtens viel zu groß:

Versuche ich den seach_index im Backend manuell aufzubauen, ist er nach ca. 2 Minuten fertig.
Baue ich ihn per cron im Backend auf, kommt als Ausgabe: „Processing Refresh search index“ und es passiert nichts weiter.
Wenn ich ihn per cron CLI aufbaue, gibt er mir nach 1 Minute folgendes zurück: „Creating the search index. This may take a while depending on the shop size. The search index was created successfully.“ -> das heißt für mich, dass er fertig ist.
Leere ich die Tabelle s_seach_index direkt in der DB und baue sie wieder auf, ist sie nach nichtmal einer Minute fertig mit der entsprechenden Anzahl wie im Screenshot oben.

Ist das alles so korrekt oder ist „hier der Hund bereits begraben“?

Hätten Sie noch einen Tipp für mich?

Hast du die Test Umgebung neu installiert oder das alte kopiert und Plugins deaktiviert?

@Wulffmedia schrieb:

Hast du die Test Umgebung neu installiert oder das alte kopiert und Plugins deaktiviert?

1zu1 kopiert und dann die Plugins deaktiviert.

@haustechnik‍ Die Tabelle und das beschriebene Verhalten ist völlig korrekt. Das ist auch ein reiner Index für die Suche im Frontend. (Dieser wird über verschiedenste Wege, bis hin zum Liveaufbau bei Frontend-Aktionen erstellt) 

Die Datenbankeinträge (Suche in Shopware generell) hängt nicht mit dem Cache bzw. Cache-Ordner zusammen. 

Die Größe des Caches liegt ja immer an den Einstellungen, Intervall des Neuaufbaus und natürlich an der Anzahl der Artikel etc. - Jede Seite wird ja als HTML weggespeichert. Machst du nun Änderungen, hast viele Artikel oder kurze Aktualisierungszyklen des Caches, dann wird dieser auch deutlich größer!

Sebastian

@SebastianKlöpper schrieb:

Die Größe des Caches liegt ja immer an den Einstellungen, Intervall des Neuaufbaus und natürlich an der Anzahl der Artikel etc. - Jede Seite wird ja als HTML weggespeichert. Machst du nun Änderungen, hast viele Artikel oder kurze Aktualisierungszyklen des Caches, dann wird dieser auch deutlich größer!

Vielen Dank für Ihre Rückmeldung.
Nochmal kurz zum Verständnis.
Wir lassen den Cache 1x in der Nacht leeren und ihn im Anschluss wieder neu aufbauen. Die Anzahl der Artikel beträgt ~100.000 mit vielen Varianten.
Es wird fast täglich an den Artikeln gearbeitet und geändert, sodass diese per RestAPI wieder hochgeladen werden (nur die geänderten).
Da ich oft im Forum gelesen habe, dass der Cache auch bei vielen Artikeln nicht ansatzweise an die 100GB kommen sollte (bei täglicher Aufwärmung), habe ich mir meine Gedanken gemacht. Wenn das Verhalten aber normal ist bzw. sein kann, verstehe ich noch nicht ganz, warum der bei uns so stark anwächst.
Ich könnte zwar 2x täglich den Cache leeren und wieder aufwärmen, nur sehe ich da keine Vorteile, da er direkt nach dem aufwärmen (ca. 3h Laufzeit) wieder bei 100GB ist.

Sind jetzt in den 100000 Artikeln die Varianten schon eingerechnet, oder kommen die noch dazu?
Wenn durchschnittlich 100000 Artikel 100 Varianten haben, sind das schon 10 Mio Artikel. Schätzen wir die html-Größe auf 10kb pro Datei, sind wir schon nahe dran an 100Gig.

@sonic schrieb:

Sind jetzt in den 100000 Artikeln die Varianten schon eingerechnet, oder kommen die noch dazu?

Es sind insgesamt inkl. Variantenkinder 107.000 Artikel, ich habe nochmal genau nachgeschaut.

Ich werde es dann aber soweit abhaken, wenn es normal ist. Der Server und die Geschwindigkeit sind in Ordnung mit aufgewärmten Cache und deaktiviertem Invalidierung.
Es kam mir nur ziemlich groß vor.

Installier es mal neu und zieh nur die wichtigen Daten über, also DB, Bilder etc. Sollte das verhalten weiterhin sein ist es wohl normal. Wenn nicht muss man weiter suchen.

Wenn du oft Artikel-Updates fährst, dann wird auch jedesmal der Cache invalidiert - das macht SW ja auch ohnehin in definierten Intervallen. Je nach Frequenz kann es also auch 10x Dateien im Cache geben pro Detailseite über den Tag verteilt.

Hallo,

die Anzahl der Varianten ist nach dem Cache-Aufwärmen nicht ausschlaggebend für die Anzahl der Dateien im HTTP-Proxy und dessen Größe auf der Festplatte. Im Performance Modul ist die Anazahl der Dateien im Cache angegeben. Woher die kommen ist unerheblich, um zu beurteilen, ob die Gesamtgröße ungewöhnlich ist. D

Die Gesamtgröße des Caches dividiert durch die Anzahl der Dateien ergibt die Größe pro Datei. Sollte so um die 30-35 kb liegen. Das ist etwas mehr als eine durchschnittliche Artikeldetailseite von Shopware in der Regel aufweist. Die sind ungefähr 20kb groß. Wenn die Dateigröße im Proxy deutlich größer ist als die 30kb, dann müsste man schauen, ob die Dateigrößen der Seiten (ohne Bilder) im Shop dies rechtfertigen. 

Je nach Dateisystem bzw. Storage-Lösung des Hostings wird der Proxy theoretisch mit zunehmender Dateianzahl langsamer.

Die Aufwärmzeit ist doch gut und riecht nicht danach, dass etwas nicht in Ordnung ist. Die Konfiguration des Proxies kann man aber wahrscheinlich noch optimieren.

 

1 „Gefällt mir“

@Moritz Naczenski schrieb:

Wenn du oft Artikel-Updates fährst, dann wird auch jedesmal der Cache invalidiert - das macht SW ja auch ohnehin in definierten Intervallen. Je nach Frequenz kann es also auch 10x Dateien im Cache geben pro Detailseite über den Tag verteilt.

Wenn ich die Funktion im Backend deaktiviere, sollte er das aber eigtl. nicht machen oder? Sprich die „Automatische-Cache-Invalidierung“.

@hth, vielen Dank für die Erklärung, das leuchtet ein.
„Die Konfiguration des Proxies kann man aber wahrscheinlich noch optimieren“ - was kann man sich darunter genau vorstellen?

Hallo @haustechnik‍

Die „Automatische Cache Validierung“ sollte nicht inaktiviert werden. Die Konsequenz wäre, den HTTP-Proxy jedes Mal komplett manuell leeren zu müssen. Und dann müsste dieser komplett neu aufgebaut werden - manuell oder live beim Zugriff durch die Kunden. 

Die Optimierung des HTTP-Proxy-Caches folgt dem klassischen Vorgehen, dafür kann man jedes Lehrbuch/Tutorial zu Rate ziehen (automatische Invalidierung, Life-Time-Cycles, Filesystem - evtl. im RAM …) . Was genau sinnvoll ist, hängt von der individuellen Shopsituation ab.  

 

Danke für eure Antworten, ich konnte einiges rausziehen und umsetzen.

Also wenn durch die Größe des Caches die Performance nicht beeinträchtigt ist, dann ist ja alles ok und du bist erstmal der Rekordhalter mit dem größten Cache…
Also alles Banane… :wink:

Die Angabe im Forum mit 2-3 GB Cache wäre dabei differenziert zu betrachten.
Wenn die “kleinen Shops” diese Aussage treffen, muss das nicht dann auch gleich auf dich zutreffen.

Schätze dich glücklich, dass dein Shopware & Hosting das trotzdem locker wuppt.
Ist doch irgendwie auch geil, ne?!