Problem:
Die Produktersparnis ist in den letzten 12 Monaten zunehmend langsamer geworden
Hintergrund:
- Magento Enterprise 1.14.1 (Problem auch in 1.13.0.2 vorhanden)
- ~ 15.000 Produkte, ~ 700 Kategorien, 2 Geschäfte
- Solr 3.6
Ermittlung:
Nachdem das langsamere Speichern des Produkts zu einem Problem wurde, untersuchen wir das langsame Abfrageprotokoll und stellten fest, dass dieselbe Abfrage auftauchte: Sie "UPDATE `catalogsearch_query` SET `is_processed`=0"
kam nach etwa 2-3 Sekunden und wurde auf lokaler Ebene ausgeführt. Dies stieg auf 7-10 Sekunden.
Der Grund für diese langsame Abfrage ist, dass die Site suchintensiv ist und mehr als 400.000 Zeilen in der Tabelle catalogogsearch_query enthalten sind, die alle mit einer 0 aktualisiert werden. Dies ist keine große Datenmenge, die in einer MySQL-Tabelle gespeichert werden soll, sondern eine riesige Menge an Updates für solch ein häufiges Ereignis.
Um die Sache nach dem xdebugging des Prozesses noch schlimmer zu machen, trifft Magento 5 Mal während jedes Produkts auf die Methode Mage_CatalogSearch_Model_Resource_Fulltext :: resetSearchResults ().
5 mal * 3 Sekunden führen also dazu, dass jeder Produktspeicherung 15 Sekunden hinzugefügt werden. 5-mal scheint übertrieben und es scheint ein Versehen zu sein, dass resetSearchResults () am Ende des von diesem Beobachter ausgelösten Prozesses so oft aufgerufen wird.
Weitere Untersuchungen scheinen dieses is_processed
Feld in der Datenbank nur sehr wenig zu nutzen, wenn die Solr-Integration vorhanden ist.
- Ist jemand auf dieses Problem gestoßen?
- Welche Maßnahmen haben Sie ergriffen?
- Irgendwelche Vorschläge für die Annäherung?
Meine ersten Gedanken sind, den Prozess neu zu strukturieren, um die Abfrage in der Datei catalogogsearch_query zu entfernen, nachdem die Auswirkungen vollständig untersucht wurden.
quelle
Antworten:
Dieses Problem tritt beim Upgrade von EE 1.13.0.2 auf 1.14.1.0 auf. Wir erleben dies bei der Massenaktualisierung von Produktattributen und Lagerbeständen in Cronjobs. In 1.13 dauern die Jobs ~ 3 Sekunden bzw. ~ 90 Sekunden. In 1.14 sind es eher ~ 10 Minuten und ich möchte nicht wissen, wie lange.
Es gibt einen EE-Patch
PATCH_SUPEE-4945_EE_1.14.0.1_v2.sh
zum langsamen Speichern des Produkts. Sie können es beim Support anfordern.Ein weiterer Tipp, den ich gefunden habe, war, nur die Zeilen zu aktualisieren, die noch nicht auf 0 gesetzt sind (natürlich ändern Sie die Kerndatei nur vorübergehend, um zu testen, ob sie Auswirkungen auf Sie hat):
Und zuletzt gab es eine Empfehlung, der
is_processed
Spalte einen Index hinzuzufügen :Ich habe sie alle ausprobiert und obwohl sie geringfügige Leistungsverbesserungen brachten, brachte mich keiner von ihnen in die Nähe der Leistung von EE 1.13.
Eine einfache Lösung (an der Oberfläche) wäre das Zurücksetzen
zu Beginn
execute()
für diese Klassen:Wenn ich das mache, wird der folgende Code nicht ausgeführt, da Solr für die Verwendung konfiguriert ist. Da das Kernteam diese Methode für 1.14 abgelehnt hat, ist sie allerdings hässlich und ich werde versuchen, mich um jeden Preis davon fernzuhalten.
Ich untersuche dies erst seit gestern, also hoffe ich, dass ich eine richtige Lösung finden kann.
Update 09.02.2015
Ich fand heraus , durch eine xdebug Profil Dump zu schaffen , dass die Kommunikation zwischen Magento und Solr die meiste Zeit in Anspruch nimmt
System > Configuration > Advanced > Index Management > Index Options > Catalog Search Index
eingestellt istUpdate on Save
. Wenn Sie den Katalogsuchindex so einstellen,Update when scheduled
dass die Geschwindigkeit erheblich verbessert wird.Update 03.03.2015
In der Zwischenzeit erklärte der Enterprise-Support, warum dies
$this->_isFulltextOn()
veraltet ist:Die offizielle Lösung besteht also darin, den Indexmodus auf zu ändern
Update when scheduled
. Wir verwenden es jetzt seit einigen Wochen ohne Probleme. Wenn Ihr Cron jede Minute läuft, tritt nur eine geringe Verzögerung auf, bis die Suche aktualisiert wird.quelle
Überprüfen Sie auch, ob Ihre Protokolltabellen sauber und nicht aufgebläht sind. Dies kann normalerweise 95% der Datenbankgröße und Leistungseinbußen ausmachen, wenn es nicht korrekt verwaltet wird.
Führen Sie diesen Befehl auf der SSH-Konsole in Ihrem Website-Stammverzeichnis aus:
php -f shell / log.php status
und sicher zu reinigen
php -f shell / log.php sauber
quelle
Wir haben immer festgestellt, dass das Ändern der Kernfunktionalität eine ganze Reihe von Problemen mit sich bringt. Jetzt besteht die hohe Wahrscheinlichkeit, dass benutzerdefinierte Funktionen oder eine Erweiterung das Problem verursachen. Am einfachsten ist es natürlich, all dies auszuschalten und dann zu versuchen, vorzugsweise eine Site-Kopie. Wir haben in der Vergangenheit festgestellt, dass ein Abschneiden und ein erneuter Index helfen können, wiederum bei einem Backup. Wir verwenden ein anderes Setup, das vorbeugend ist und daher nicht auf diese Probleme eingeht, aber das wäre in Ihrem Fall nicht anwendbar.
quelle
catalogsearch_query
SETis_processed
= 0" auf, was bedeutet, dass ~ 400.000 fünfmal aktualisiert werden müssen. Das sind 2.000.000 Zeilenaktualisierungen pro Produktspeicherung. 400.000 Updates in 2 Sekunden würde ich nicht als langsam einstufen.