Les index invalidés et indexer_reindex_all_invalid s’exécutent constamment
Cet article fournit une solution à ce problème lorsque votre site présente des problèmes de performances causés par une réindexation constante. Cela est dû au fait que la tâche cron indexer_reindex_all_invalid
en cours d’exécution et que les caches sont nettoyés lors de la réindexation.
Description description
Environnement
Adobe Commerce (cloud et On-premise) 2.4.0+ (Comme autorisations de catégorie est une fonctionnalité Adobe-Commerce uniquement, elle n’affectera pas Magento Open Source.)
Problème
Dans New Relic One, les journaux d’erreurs doivent afficher des indexer_update_all_views
s’exécutant plusieurs fois en une seconde >
(par exemple, il est en train de traiter un élément).
Cause
Lorsque l’importateur d’Adobe Commerce de base est exécuté (manuellement ou par cron), un ensemble de modules externes répartis sur plusieurs modules principaux est exécuté pour déterminer les index à invalider.
Le problème se produit lorsque le module Autorisations des catégories est activé dans l’administration Commerce. Si la valeur est définie sur « true », le plug-in du module invalide toujours les index de produit et de catégorie (et les index liés) lors de l’exécution d’une importation. Si les types d’importation standard sont examinés, ils affectent tous les autorisations de catégorie. Une invalidation est attendue.
En outre, lorsque les modules B2B sont activés sur un site, si Catalogue partagé est activé, il active et verrouille Autorisations de catégorie. La désactivation de Catalogue partagé déverrouille Autorisations de catégorie, mais ne la désactive pas.
Vérification des journaux cron dans votre base de données MySQL :
Si vous vous connectez à votre base de données MySQL, ils peuvent vérifier votre journal de cron
pour le processus réindexer tous les index.
Cela devrait apparaître plusieurs fois, mais le facteur important est que le processus fait l'une de deux choses possibles.
Le processus ne peut effectuer que l’une des deux opérations suivantes :
- Rien : Cela prendrait de 0 à 1 seconde (une seconde ou moins) - le processus vérifie s’il doit faire quelque chose, puis s’arrête s’il n’a rien à faire.
- Tout réindexer : cela prendra toujours du temps, généralement quelques minutes.
Normalement, vous souhaiteriez voir de nombreuses occurrences du processus, mais avec un temps d’exécution inférieur à 1 seconde.
Un commerçant peut donc utiliser cette requête MySQL pour rechercher les transactions qui mettent plus d’une seconde à s’exécuter :
SELECT TIMESTAMPDIFF(SECOND, executed_at, finished_at) AS period FROM cron_schedule WHERE job_code = 'indexer_reindex_all_invalid' HAVING period > 1
Vous pouvez voir la durée d’enregistrement d’une période en exécutant :
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;
Si cela ne vous donne pas une période suffisamment longue pour effectuer une évaluation correcte, vous pouvez augmenter la durée de conservation d’un processus de cron
réussi dans le journal en suivant ce guide Cron (tâches planifiées) et en augmentant la valeur Durée de vie de l’historique de succès (la valeur par défaut est de 60 minutes uniquement).
Résolution resolution
Étendez Magento\CatalogPermissions\Model\Indexer\Plugin\Import
afin que la méthode afterImportSource
exclue l’importateur personnalisé.
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;
}
Où ENTITY_CODE
est la valeur utilisée pour le paramètre du nom d’entité dans le fichier import.xml
pour l’importateur personnalisé.
Lecture connexe
Configurez les tâches cron dans le Guide de configuration des opérations Adobe Commerce.