Magento Enterprise Slow Product Save(/ wおよび/ wo Solr統合)


7

問題:

製品の保存は過去12か月間で徐々に遅くなっています

バックグラウンド:

  • Magento Enterprise 1.14.1(この問題は1.13.0.2にも存在します)
  • 〜15,000製品、〜700カテゴリ、2店舗
  • Solr 3.6

調査:

遅い製品の保存が問題になった後、遅いクエリログを調査したところ、同じクエリがポップアップ表示さ"UPDATE `catalogsearch_query` SET `is_processed`=0"れたことがわかりました。ローカルで同じクエリを実行すると、最大7〜10秒かかりました。

この遅いクエリの理由は、サイトが検索の負荷が高く、catalogsearch_queryテーブル内の400,000行を超える行がすべて0で更新されているためです。これは、MySQLテーブルに格納するのに大量のデータではありませんが、このような頻繁なイベントで更新する膨大な量。

プロセスのxdebugging後に問題をさらに悪化させるには、各製品の間にMagentoがMage_CatalogSearch_Model_Resource_Fulltext :: resetSearchResults()メソッドを5回ヒットし、Enterprise_CatalogSearch_Model_Observer :: processProductSaveDeleteEvent()を呼び出すcatalog_product_save_commit_afterイベントのバックを保存します。

したがって、5回* 3秒は、15秒が各製品の節約に追加されます。5回はやり過ぎに思われ、このオブザーバーによってトリガーされたプロセスの最後にresetSearchResults()が何度も呼び出されるのは見落としのようです。

さらに調査するとis_processed、Solr統合が実施されている場合、データベースのこのフィールドはほとんど使用されないようです。

  1. 誰かがこの問題に遭遇しましたか?
  2. どのような行動をとりましたか?
  3. 近づくための提案はありますか?

私の最初の考えは、プロセスを再構築して、その影響を完全に調査した後、catalogsearch_queryのクエリを削除することです。


dbテーブルのインデックスを再構築してみましたか?ほとんどの場合、テーブルのインデックスが理由です。
andy1786 2015年

catalogsearch_queryのインデックスはありません。データの使用方法については、実際には必要ありません。問題は、Magentoのコアコード構造の大きなデータセットでは、非効率性です。
john-jh 2015年

回答:


5

現在、EE 1.13.0.2から1.14.1.0にアップグレードしているときにこの問題が発生しています。これは、cronjobsで製品属性と在庫を一括更新するときに発生します。1.13では、ジョブはそれぞれ〜3秒と〜90秒かかります。1.14では、約10分になり、長さを知りたくありません。

PATCH_SUPEE-4945_EE_1.14.0.1_v2.sh遅い製品の保存に関するEEパッチがあります。サポートにリクエストすることができます。

私が見つけた別のヒントは、まだ0に設定されていない行のみを更新することでした(もちろん、コアファイルを一時的に変更して、影響があるかどうかをテストします)。

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');

そして最後に、is_processed列にインデックスを追加することを推奨しました:

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

私はそれらすべてを試してみましたが、それらはマイナーなパフォーマンスの改善をもたらしましたが、EE 1.13のパフォーマンスに近いものはありませんでした。

(表面上で)簡単な修正は、追加することです

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

execute()これらのクラスの最初に:

  • Enterprise_CatalogSearch_Model_Index_Action_Fulltext_Refresh
  • Enterprise_CatalogSearch_Model_Index_Action_Fulltext_Refresh_Changelog
  • Enterprise_CatalogSearch_Model_Index_Action_Fulltext_Refresh_Row

その場合、Solrが使用されるように構成されているため、次のコードは実行されません。コアチームがこの方法を1.14で非推奨にしたので、それは醜いので、できるだけコストをかけないようにします。

私はこれを昨日から調査しているだけなので、適切な解決策をフォローアップできることを願っています。

更新09.02.2015

xdebugプロファイルダンプを作成して、MagentoとSolrの間の通信がほとんどの時間を占めることを確認しSystem > Configuration > Advanced > Index Management > Index Options > Catalog Search IndexましたUpdate on Save。カタログ検索インデックスを設定Update when scheduledすると、速度が大幅に向上します。

2015年3月3日更新

その間、エンタープライズサポートは、なぜ$this->_isFulltextOn()が廃止されるのかを説明しました。

現在のmysql_fulltextインデクサーをリファクタリングして実際のインデックス作成作業をカプセル化し、新しいMviewベースのインデクサーモデルを使用するようにカタログ検索SOLRインデックスを調整したため、$ this-> _ isFulltextOn()を実行メソッドから削除しました。

Enterprise_CatalogSearchモジュールは、変更ログを部分的な再インデックスに利用する新しいインデクサーモデルを実装しました。現在、SOLRがカタログ検索エンジンとして使用されている場合、catalogsearch_fulltextインデクサーは古いインデクサーモデルを使用するようにフォールバックします。SOLRがカタログ検索エンジンとして設定されている場合、Enterprise_CatalogSearchモジュールで新しいインデクサーモデルを利用します。

したがって、商人が製品の保存中に全文索引をスキップしたい場合は、スケジュールモードで更新するように索引モードを変更するように依頼してください。

したがって、公式の解決策は、インデックスモードをに変更することUpdate when scheduledです。数週間問題なく使用しています。cronが毎分実行されている場合、検索が更新されるまでわずかな遅延が発生します。


保存時に更新するのではなく、スケジュールに従って更新するように検索インデックスを設定することを検討しています。1秒未満の製品を取得すると、現時点では15〜30秒の節約になります。これはプロセスの修正ではありませんが、代替のインデックスメソッドを使用すると、ユーザーの要求ではなく、増分インデックススケジュールが変更を処理します。スケジュールされたインデクサーが同じ問題に苦しんでいるかどうかを調査する必要があるだけです。
john-jh 2015

-2

また、ログテーブルがクリーンで肥大化していないことも確認してください。これは、正しく維持されない場合、通常、データベースサイズの95%とパフォーマンスの低下を占める可能性があります。

ウェブサイトのルート内からSSHコンソールで次のコマンドを実行します。

php -f shell / log.phpステータス

安全に掃除する

php -f shell / log.php clean


ログファイルとはまったく関係ありません。xdebugを使用してプロセスのすべての部分を実行しました。これは、純粋に上記のクエリが5回実行され、catalogsearch_queryテーブルのすべての行(400,000以上の行)を更新するため、毎回3秒以上かかります。
john-jh 2015年

データベース全体のサイズは、サイズに関係なくすべてのクエリに影響を与える可能性があるため、同意しません。log_ *テーブルがデータベースサイズの80%を占めている前に見たように、それはinnodb_buffer_poolメモリが浪費されていることになります。デフォルトのMagento検索では、実行中のクエリに従って常に関連性が0に設定されるため、このオプションの変更を確認したい場合があります。システム→構成→カタログ→カタログ検索→検索タイプ同じ質問への関連回答:stackoverflow.com/questions / 9117162 /…
スチュアート、

データベースは6GB(小さい)未満であり、ログは30日後にcronによってクリーンアップされます。MySQL FulltextではなくSolrを使用しているため、リンクされた投稿の問題はそれほどありません。前に言ったように、catalogsearch_queryの400,000以上の行はすべて、各製品の5回の更新で更新が遅くなり、現時点で解決できるものは必要ありません。関連性を0に設定するのではなく、is_processing値を0に設定する
john-jh

-3

コア機能の変更を開始する必要がある場合、多くの問題が発生することは常にわかっています。これで、カスタム機能または拡張機能が問題を引き起こす可能性が高くなりました。明らかに最も簡単なのは、これらすべてをオフにしてから、できればサイトのコピーで試してみることです。過去に切り捨てとインデックス再作成が役立つことを過去に発見しましたが、これもバックアップです。予防的であり、したがってこれらの問題が発生しない別のセットアップで実行しますが、それはあなたのケースには当てはまりません。


サードパーティの機能によるものではありません。問題をもう一度読むと、何が起こっているのか、どのように、なぜ起こっているのかという完全な内訳があります。
john-jh

不正解です。ビジネスビューでは、Solr、10万を超える製品、15店舗を抱えるサイトで機能し、問題はありませんでした。現在、サーバーが不十分であるか、拡張機能またはカスタム機能が原因である可能性がありますが、コアは非常に大きなインストールで完全に正常に動作します。コアは問題ではありません。今やそれはあなたのサイトであり、コアとどのように相互作用するかかもしれませんが、それは何か違うものです。
Acornia 2015年

しかし、catalogsearch_queryテーブルには何行ありますか?Core Magento EEは、製品の保存ごとに"UPDATE catalogsearch_querySET is_processed= 0"を5回呼び出します。つまり、約400,000回5回更新する必要があります。これは、製品の保存ごとに2,000,000行の更新です。2秒で40万回の更新は遅いとは言えません。
john-jh 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.