Los índices invalidados y indexer_reindex_all_invalid se ejecutan constantemente

Este artículo proporciona una posible solución al problema cuando el sitio tiene problemas de rendimiento causados por una reindexación constante. Esto se debe a que el trabajo cron indexer_reindex_all_invalid se ejecuta continuamente y las cachés se limpian al reindexar.

Descripción description

Entorno

Adobe Commerce (en la nube y local) 2.4.0+ (como Permisos de categoría es una función exclusiva de Adobe Commerce, no afectará a Magento Open Source).

Problema

En New Relic One, los registros de errores deberían mostrar indexer_update_all_views ejecutándose muchas veces con una duración de > 1 segundo (por ejemplo, está procesando algo).

Causa

Cuando se ejecuta el importador principal de Adobe Commerce (manualmente o por cron), se ejecuta un conjunto de complementos en varios módulos principales para determinar qué índices deben invalidarse.

El problema se produce cuando el módulo Permisos de categoría está habilitado en el administrador de Commerce. Si es verdadero, el complemento del módulo siempre invalida los índices de productos y categorías (y los índices vinculados) cuando se ejecuta una importación. Si se examinan los tipos de importación estándar, todos afectarán a Permisos de categoría. Se espera una invalidación.

Además, cuando un sitio tiene habilitados los módulos B2B, si Catálogo compartido está activado, se activa y bloquea Permisos de categoría. Al desactivar Catálogo compartido se desbloquearán Permisos de categoría, pero no se desactivará.

Comprobando los registros cron en la base de datos MySQL:

Si inicia sesión en la base de datos MySQL, puede comprobar el registro cron para el proceso reindexar todos los índices.
Este(a) debería aparecer(a) muchas veces, pero el factor importante es que el proceso realiza una de las dos acciones posibles.

El proceso solo puede hacer una de estas dos cosas:

  1. Nada: tardaría de 0 a 1 segundo (un segundo o menos): el proceso comprueba si necesita hacer algo y luego se detiene si no necesita hacer nada.
  2. Reindexe todo: Siempre llevará tiempo, generalmente minutos.

Normalmente, le gustaría ver muchas ocurrencias del proceso, pero con un tiempo de ejecución inferior a 1 segundo.
Por lo tanto, un comerciante puede usar esta consulta MySQL para buscar transacciones que tarden más de 1 segundo en ejecutarse:

SELECT TIMESTAMPDIFF(SECOND, executed_at, finished_at) AS period FROM cron_schedule WHERE job_code = 'indexer_reindex_all_invalid' HAVING period > 1

Puede ver cuánto tiempo se registra un periodo ejecutando:

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 con esto no dispone de tiempo suficiente para realizar una evaluación adecuada, puede aumentar el tiempo que se conserva un proceso cron correcto en el registro siguiendo esta guía de Cron (tareas programadas) y aumentando el valor de Duración del historial de éxito (el valor predeterminado es solo 60 minutos).

Resolución resolution

Amplíe Magento\CatalogPermissions\Model\Indexer\Plugin\Import para que el método afterImportSource excluya el importador personalizado.

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;
    }

Donde ENTITY_CODE es el valor utilizado para el parámetro de nombre de entidad en el archivo import.xml para el importador personalizado.

Lectura relacionada

Configurar trabajos cron en la Guía de configuración de operaciones de Adobe Commerce.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f