Magento Enterprise Slow Product Save (/ w und / wo Solr-Integration)

7

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_processedFeld in der Datenbank nur sehr wenig zu nutzen, wenn die Solr-Integration vorhanden ist.

  1. Ist jemand auf dieses Problem gestoßen?
  2. Welche Maßnahmen haben Sie ergriffen?
  3. 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.

John-jh
quelle
Haben Sie versucht, den Index für die DB-Tabelle neu zu erstellen? Meistens ist der Index auf der Tabelle der Grund.
andy1786
Es gibt keinen Index für catalogogsearch_query, es wäre nicht wirklich notwendig, wie die Daten verwendet werden. Das Problem ist eher eine Ineffizienz bei größeren Datensätzen mit Magento-Kerncodestruktur.
John-jh

Antworten:

5

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.shzum 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):

diff --git a/app/code/core/Enterprise/CatalogSearch/Model/Index/Action/Fulltext/Refresh.php b/app/code/core/Enterprise/CatalogSearch/Model/Index/Action/Fulltext/Refresh.php
index c6273a1..95e6d4c 100644
--- a/app/code/core/Enterprise/CatalogSearch/Model/Index/Action/Fulltext/Refresh.php
+++ b/app/code/core/Enterprise/CatalogSearch/Model/Index/Action/Fulltext/Refresh.php
@@ -668,7 +668,7 @@ class Enterprise_CatalogSearch_Model_Index_Action_Fulltext_Refresh
     protected function _resetSearchResults()
     {
         $adapter = $this->_getWriteAdapter();
-        $adapter->update($this->_getTable('catalogsearch/search_query'), array('is_processed' => 0));
+        $adapter->update($this->_getTable('catalogsearch/search_query'), array('is_processed' => 0), array('is_processed != 0'));
         $adapter->delete($this->_getTable('catalogsearch/result'));

         $this->_app->dispatchEvent('enterprise_catalogsearch_reset_search_result', array());
diff --git a/app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php b/app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php
index ee8b1c3..1d89146 100755
--- a/app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php
+++ b/app/code/core/Mage/CatalogSearch/Model/Resource/Fulltext.php
@@ -299,7 +299,7 @@ class Mage_CatalogSearch_Model_Resource_Fulltext extends Mage_Core_Model_Resourc
     public function resetSearchResults()
     {
         $adapter = $this->_getWriteAdapter();
-        $adapter->update($this->getTable('catalogsearch/search_query'), array('is_processed' => 0));
+        $adapter->update($this->getTable('catalogsearch/search_query'), array('is_processed' => 0), array('is_processed != 0'));
         $adapter->delete($this->getTable('catalogsearch/result'));

         Mage::dispatchEvent('catalogsearch_reset_search_result');

Und zuletzt gab es eine Empfehlung, der is_processedSpalte einen Index hinzuzufügen :

ALTER TABLE `database`.`catalogsearch_query` ADD INDEX `IDX_CATALOGSEARCH_QUERY_IS_PROCESSED` (`is_processed`) COMMENT '';

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

if (!$this->_isFulltextOn()) {
    return $this;
}

zu Beginn execute()für diese Klassen:

  • Enterprise_CatalogSearch_Model_Index_Action_Fulltext_Refresh
  • Enterprise_CatalogSearch_Model_Index_Action_Fulltext_Refresh_Changelog
  • Enterprise_CatalogSearch_Model_Index_Action_Fulltext_Refresh_Row

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 Indexeingestellt ist Update on Save. Wenn Sie den Katalogsuchindex so einstellen, Update when scheduleddass die Geschwindigkeit erheblich verbessert wird.

Update 03.03.2015

In der Zwischenzeit erklärte der Enterprise-Support, warum dies $this->_isFulltextOn()veraltet ist:

Wir haben $ this -> _ isFulltextOn () aus der Ausführungsmethode entfernt, weil wir den aktuellen mysql_fulltext-Indexer überarbeitet haben, um die tatsächliche Indexierungsarbeit zu kapseln und den SOLR-Index für die Katalogsuche anzupassen, um das neue Mview-basierte Indexermodell zu verwenden.

Das Enterprise_CatalogSearch-Modul hat ein neues Indexermodell implementiert, das Changelog für die teilweise Neuindizierung verwendet. Wenn derzeit SOLR als Katalogsuchmaschine verwendet wird, greift der Indexer catalogogsearch_fulltext auf das alte Indexermodell zurück. Wir verwenden das neue Indexermodell im Enterprise_CatalogSearch-Modul, wenn SOLR als Katalogsuchmaschine festgelegt ist.

Wenn der Händler beim Speichern von Produkten die Volltextindizierung überspringen möchte, bitten Sie ihn, den Indexmodus zu ändern, um ihn planmäßig zu aktualisieren.

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.

Matthias Zeis
quelle
Ich bin gerade dabei zu untersuchen, ob der Suchindex so eingestellt ist, dass er planmäßig aktualisiert wird, anstatt beim Speichern aktualisiert zu werden. Unter 1 Sekunde Produkt sparen im Moment von 15-30 Sekunden. Es ist keine Korrektur für den Prozess, aber die alternative Indexmethode führt dazu, dass der inkrementelle Indexplan die Änderungen und nicht die Benutzeranforderung behandelt. Sie müssen nur untersuchen, ob der geplante Indexer unter demselben Problem leidet.
John-jh
-2

Ü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

Stuart
quelle
Es hat überhaupt nichts mit den Protokolldateien zu tun. Ich habe jeden Teil des Prozesses mit xdebug durchlaufen und es handelt sich lediglich um die oben erwähnte Abfrage, die 5 Mal ausgeführt wird und jedes Mal 3 Sekunden oder länger dauert, da jede Zeile in der Tabelle catalogogsearch_query (über 400.000 Zeilen) aktualisiert wird.
John-jh
Ich bin anderer Meinung, da die Größe Ihrer gesamten Datenbank alle Abfragen beeinflussen kann, die für die Größe nicht relevant sind. Wenn, wie ich zuvor gesehen habe, die log_ * -Tabellen 80% der Datenbankgröße einnehmen, wird der Speicher innodb_buffer_pool verschwendet. Da die Magento-Standardsuche die Relevanz gemäß der ausgeführten Abfrage immer auf 0 setzt, sollten Sie die Änderung dieser Option überprüfen: System → Konfiguration → Katalog → Katalogsuche → Suchtyp
Stuart
Die Datenbank ist unter 6 GB (winzig). Die Protokolle werden nach 30 Tagen vom Cron gereinigt. Wir verwenden Solr, nicht MySQL Fulltext, daher ist das Problem im verlinkten Beitrag nicht ganz da. Wie ich bereits sagte, werden mehr als 400.000 Zeilen in catalogogsearch_query nur fünf Mal aktualisiert, wenn ein Produkt gespeichert wird. Dies wird langsam sein und von dem, was ich im Moment herausfinden kann, wird es nicht benötigt. Es setzt die Relevanz nicht auf 0, sondern setzt den Wert is_processing auf 0
john-jh
-3

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.

Acornia
quelle
Dies liegt nicht an der Funktionalität von Drittanbietern. Wenn Sie das Problem noch einmal lesen, finden Sie eine vollständige Aufschlüsselung dessen, was passiert, wie und warum.
John-jh
Falsch, aus geschäftlicher Sicht arbeiteten auf Websites mit Solr über 100.000 Produkte, 15 Geschäfte und nie ein Problem. Jetzt kann es an unzureichenden Servern oder einer Erweiterung oder benutzerdefinierten Funktionalität liegen, aber der Kern funktioniert bei viel größeren Installationen einwandfrei. Der Kern ist nicht das Problem, jetzt kann es Ihre Site sein und wie sie mit dem Kern interagiert, aber das ist etwas anderes.
Acornia
Wie viele Zeilen in der Tabelle catalogogsearch_query? Core Magento EE ruft bei jeder Produktspeicherung fünfmal "UPDATE catalogsearch_querySET is_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.
John-jh