Indici invalidati e indexer_reindex_all_invalid eseguiti costantemente

Questo articolo fornisce una possibile soluzione a questo problema quando il sito presenta problemi di prestazioni causati da una reindicizzazione costante. Ciò è dovuto all'esecuzione continua del processo cron indexer_reindex_all_invalid e alla pulizia delle cache in reindex.

Prodotti e versioni interessati

  • Adobe Commerce (cloud e on-premise) 2.4.0+ (poiché Category Permissions è una funzionalità esclusiva di Adobe Commerce, non influirà sul Magento Open Source).

Problema

In New Relic One i registri errori dovrebbero mostrare indexer_update_all_views in esecuzione molte volte con un tempo > 1 secondo (ovvero, sta elaborando qualcosa).

Causa

Quando l’importazione core di Adobe Commerce viene eseguita (manualmente o da cron), viene eseguito un set di plug-in tra più moduli core per determinare quali indici devono essere invalidati.

Il problema si verifica quando il modulo Category Permissions è abilitato in Commerce Admin. Se questo è vero, allora il plug-in del modulo invalida sempre gli indici di prodotto e categoria (e gli indici collegati) quando viene eseguita un’importazione. Se vengono esaminati i tipi di importazione standard, tutti influiscono su Category Permissions. È previsto l’annullamento della validità.

Inoltre, quando un sito ha moduli B2B abilitati, se Shared Catalog è attivato, si attiva e blocca Category Permissions. La disattivazione di Shared Catalog sbloccherà Category Permissions, ma non lo spegnerà.

Controllo dei registri cron nel database MySQL:

Se accedi al tuo database MySQL, potranno controllare il registro di cron per il processo reindex all indexes.
dovrebbe comparire molte volte, ma il fattore importante è che il processo fa una delle due cose possibili.

Il processo può eseguire solo una di queste due operazioni:

  1. Niente: ci vorrebbe da 0 a 1 secondo (un secondo o meno) - il processo controlla per vedere se deve fare qualcosa e poi si interrompe se non ha bisogno di fare nulla.
  2. Reindex tutto: ci vorrà sempre del tempo, in genere minuti.

Normalmente si desidera visualizzare molte occorrenze del processo, ma con un tempo di esecuzione inferiore a 1 secondo.
Un commerciante può quindi utilizzare questa query MySQL per trovare le transazioni che richiedono più di 1 secondo per l'esecuzione:

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

Puoi vedere per quanto tempo viene registrato un periodo eseguendo:

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;

Se non si dispone di un periodo di tempo sufficiente per effettuare una valutazione corretta, è possibile aumentare il tempo di conservazione di un processo cron completato nel registro dopo questa guida Cron (attività pianificate) e aumentare il valore Success History Lifetime (il valore predefinito è solo 60 minuti).

Soluzione

Estendere Magento\CatalogPermissions\Model\Indexer\Plugin\Import in modo che il metodo afterImportSource escluda l'importazione personalizzata.

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

Dove ENTITY_CODE è il valore utilizzato per il parametro del nome entità nel file import.xml per l'importazione personalizzata.

Lettura correlata

Configura cron processi nella Guida alla configurazione delle operazioni di Adobe Commerce.

recommendation-more-help
8bd06ef0-b3d5-4137-b74e-d7b00485808a