インデックスが無効化され、indexer_reindex_all_invalid が継続的に実行されます
この記事では、継続的なインデックス再作成に起因するパフォーマンスの問題がサイトで発生した場合に、問題に対して考えられる回避策を提供します。 これは、cron ジョブが継続的に実行され、再インデックス時 indexer_reindex_all_invalid キャッシュがクリーンアップされることが原因で発生します。
説明 description
環境
Adobe Commerce(クラウドおよびオンプレミス) 2.4.0 以降( カテゴリ権限 は、AdobeのCommerceのみの機能なので、Magento Open Sourceには影響しません)。
問題
New Relic Oneでは、エラーログに、1 秒 > 間(例えば、何かを処理中など)で何度も実行されている indexer_update_all_views が表示されます。
原因
コア Adobe Commerce インポーターを(手動または cron で)実行すると、複数のコアモジュールをまたいだ一連のプラグインが実行され、無効化するインデックスが決定されます。
この問題は、Commerce管理者で カテゴリ権限 モジュールが有効になっている場合に発生します。 これが true の場合、モジュールのプラグインは、インポートの実行時に常に製品およびカテゴリインデックス(およびリンクインデックス)を無効にします。 標準の読み込みタイプを調べると、すべてが カテゴリ権限 に影響します。 無効化が必要です。
さらに、サイトで B2B モジュールが有効になっている場合、 共有カタログ がアクティブになると、 カテゴリ権限 がオンになりロックされます。 共有カタログ をオフにすると カテゴリ権限 のロックが解除されますが、オフに切り替わることはありません。
MySQL データベースの cron ログを確認する:
MySQL データベースにログインすると、cron ログで すべてのインデックスを再インデックス化 プロセスを確認できます。
これは 必ず 何度も表示されますが、重要な要因は、プロセスが 2 つの可能なことの 1 つを実行することです。
プロセスが実行できるのは、次の 2 つのうちいずれかのみです。
- なし:0~1 秒(1 秒以下)かかります。プロセスは、何か実行する必要があるかどうかを確認し、何も実行する必要がない場合は停止します。
- すべてを再インデックス化します。通常は数分かかります。
通常、このプロセスの発生件数を多数確認したいのですが、実行時間は 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 プロセスがログに保持される時間を増やし 成功履歴の有効期間 値を増やすことができます(デフォルトは 60 分のみです)。
解決策 resolution
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 の Cron ジョブの設定 を参照してください。