インデックスは無効化され、継続的 indexer_reindex_all_invalid
実行されます
この記事では、継続的なインデックス再作成に起因するパフォーマンスの問題がサイトで発生した場合に、問題に対して考えられる回避策を提供します。 これは、cron ジョブが継続的に実行され、reindex でキャッシュ indexer_reindex_all_invalid
クリーンアップされることが原因です。
影響を受ける製品とバージョン
- Adobe Commerce(クラウドおよびオンプレミス) 2.4.0 以降(Category Permissions はAdobeCommerceのみの機能なので、Magento Open Sourceには影響しません)。
問題
New Relic One のエラーログには、1 秒を超える時間で何度も実行されている(つまり、何かを処理している) indexer_update_all_views
が表示されます。
原因:
コア Adobe Commerce インポーターを(手動または cron で)実行すると、複数のコアモジュールをまたいだ一連のプラグインが実行され、無効化するインデックスが決定されます。
この問題は、Commerce Admin で Category Permissions モジュールが有効になっている場合に発生します。 これが true の場合、モジュールのプラグインは、インポートの実行時に常に製品およびカテゴリインデックス(およびリンクインデックス)を無効にします。 標準の読み込みタイプを調べると、それらがすべて Category Permissions に影響します。 無効化が必要です。
さらに、サイトで B2B モジュールが有効になっている場合、Shared Catalog がアクティブになると、Category Permissions のモジュールがオンになりロックされます。 Shared Catalog をオフにするとロックは解除 Category Permissions れますが、オフに切り替えることはできません。
MySQL データベース内 cron ログを確認しています :
MySQL データベースにログインすると、ロー reindex all indexes ルプロセスの cron
ログを確認できます。
これは 必ず 何度も表示されますが、重要な要因は、プロセスが 2 つの可能なことの 1 つを実行することです。
プロセスが実行できるのは、次の 2 つのうちいずれかのみです。
- なし:0~1 秒(1 秒以下)かかります。プロセスは、何か実行する必要があるかどうかを確認し、何も実行する必要がない場合は停止します。
- すべてを Reindex る:それは常に時間がかかります – 通常分。
通常、このプロセスの発生件数を多数確認したいのですが、実行時間は 1 秒未満です。
したがって、マーチャントはこの MySQL クエリを使用して、実行に 1 秒を超える 時間がかかるトランザクションを検索できます。
SELECT TIMESTAMPDIFF(SECOND, executed_at, finished_at) AS period FROM cron_schedule WHERE job_code = 'indexer_reindex_all_invalid' HAVING period > 1
期間の記録期間は、次のコマンドを実行することで確認できます。
SELECT executed_at FROM cron_schedule WHERE job_code = 'indexer_reindex_all_invalid' AND executed_at IS NOT NULL ORDER BY executed_at ASC LIMIT 1;
適切に評価を行うのに十分な時間が得られない場合は、この Cron (スケジュールされたタスク)ガイドに従って成功した cron
プロセスがログに保持される時間を増やしSuccess History Lifetime 値を増やすことができます(デフォルトは 60 分だけです)。
解決策
afterImportSource
メソッドがカスタムインポーターを除外するように、Magento\CatalogPermissions\Model\Indexer\Plugin\Import
を拡張します。
public function afterImportSource(\Magento\ImportExport\Model\Import $subject, $import)
{
if ($this->config->isEnabled() && $subject->getEntity() !== 'ENTITY_CODE') {
$this->indexerRegistry->get(\Magento\CatalogPermissions\Model\Indexer\Category::INDEXER_ID)->invalidate();
$this->indexerRegistry->get(\Magento\CatalogPermissions\Model\Indexer\Product::INDEXER_ID)->invalidate();
}
return $import;
}
ここで、ENTITY_CODE
は、カスタムインポーターの import.xml
ファイルのエンティティ名パラメーターに使用される値です。
関連資料
Adobe Commerce Operations Configuration Guide の Configure cron jobs。