Magento 2 Indexers: voor developers

Om de indexers van Magento 2 soepeler te laten draaien kunnen er enkele optimalisaties uitgevoerd worden. Waar voor de ene optimalisatie een enkele configuratie instelling genoeg is, zijn er ook optimalisaties die iets meer werk vereisen.

In dit blog bespreken we de volgende optimalisaties:

  • Multi-threading
  • Parralel mode indexing
  • Batch size configuratie

Multi-threading

Het toepassen van multi-threading voor indexers is het makkelijkste toe te passen. Het vereist toevoeging van een enkele configuratieregel aan env.php waarin je aangeeft hoeveel cpu cores je tot de indexers beschikbaar wilt stellen. Hoeveel cpu cores je nodig hebt en hoeveel je kunt gebruiken is vaak een proces van trial-and-error. Proberen en monitoren. Je kunt in ieder geval uitzoeken hoeveel cores je server tot beschikking heeft door het gebruiken van het ‘lscpu’ commando. Deze kan je uitvoeren op je server en dit geeft een lijst met gegevens betreffende de cpu en hoeveel cores er beschikbaar zijn voor je Magento 2 installatie. Vervolgens kan je de volgende regel toevoegen in env.php (waar je {cores} kunt vervangen met het gewenste aantal cores):

‘MAGE_INDEXER_THREADS_COUNT’ => {cores}

multi threading

Parallel mode indexing

Met deze optimalisatie splits je het verwerken van de gegevens per indexer tussen website, klantgroep of beiden tegelijk. Het opsplitsen zorgt ervoor dat dezelfde indexer parallel kan lopen naast zichzelf en met elk proces, andere website of klantgroep binnen de webshop.

Het parallelizeren van de indexers is niet mogelijk voor alle indexer maar alleen voor de volgende 3:

  • Catalog Search Fulltext
  • Category Product
  • Catalog Price

En per indexer is in te stellen welke modus en hoe de parallelizatie toegepast moet worden:

  • none (standaard)
  • website
  • customer_group
  • website_and_customer_group (alleen bij Catalog price)

Om te bekijken welke modi nu ingesteld zijn per indexer kan je volgend commando in de Magento 2 root map uitvoeren:

bin/magento indexer:show-dimensions-mode

Vervolgens kan je instellen of je de indexers per website, klantgroep of beiden wilt splitsen met een soortgelijk commando:

bin/magento indexer:set-dimensions-mode {indexer} {modus}

Een voorbeeld voor de prijzen indexer per website:

bin/magento indexer:set-dimensions-mode catalog_product_price website

Het resultaat van het parallelizeren is daarnaast ook dat de gegevens in de database in losse indextabellen per website, klantgroep of een combinatie daarvan terechtkomt in plaats van 1 indextabel voor de specifieke indexer.

Let op: Dit kan impact hebben op extensies van derden die informatie rechtstreeks uit indexertabellen halen, wat bijvoorbeeld de MagModules Channable extensie doet en welke dus aangepast moet worden wanneer parallellisatie toegepast wordt.

Batch size configuratie

De indexers verwerken de informatie beschikbaar in batches. Standaard staan deze batches erg groot ingesteld om de druk op de database te verlichten qua query volume. Echter kan het anders instellen van de batches versoepeling bieden wanneer de database dit aan kan. De batchgroottes worden dan verkleind, waardoor er meer query’s uitgevoerd worden per indexer. Maar deze query’s zijn dusdanig kleiner dat het best zo kan zijn dat de meerdere query’s sneller en minder resource intensief verwerkt kunnen worden door de server.

Er zijn drie indexers die een andere batch size accepteren:

  • Catalog Inventory Stock
  • Category Product
  • Catalog Price

Batch sizes zijn in te stellen door configuratie in di.xml bestanden te plaatsen.

Onderstaande code is een voorbeeld van hoe dit ingesteld kan worden:

<type name=”Magento\Catalog\Model\Indexer\Category\Product\Action\Full”>

    <arguments>

        <argument name=”batchRowsCount” xsi:type=”number”>500</argument>

    </arguments>

</type>

<type name=”Magento\CatalogInventory\Model\Indexer\Stock\Action\Full”>

    <arguments>

        <argument name=”batchRowsCount” xsi:type=”array”>

            <item name=”configurable” xsi:type=”number”>1000</item>

            <item name=”default” xsi:type=”number”>700</item>

        </argument>

    </arguments>

</type>

<type name=”Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\BatchSizeCalculator”>

    <arguments>

        <argument name=”batchRowsCount” xsi:type=”array”>

            <item name=”configurable” xsi:type=”number”>1000</item>

            <item name=”default” xsi:type=”number”>1000</item>

        </argument>

    </arguments>

</type>

Hieronder een voorbeeld van hoe deze di.xml qua inhoud eruitziet:

di.xml

Slot

Deze optimalisaties zullen niet voor alle webshops nodig zijn. Maar als je het aantal producten ziet groeien in een webshop kunnen deze optimalisaties verlichting bieden voor de server, voordat het pakket geüpgraded moet worden.

Hoe je deze optimalisaties in combinatie met elkaar toepast is een kwestie van vaak proberen en monitoren. Blijft de server stabiel of blijkt nu MySQL problemen te krijgen zijn zaken die je kan beoordelen bijvoorbeeld.

Delen?

Meer informatie over dit onderwerp? Mark maakt je volledig webwijs. Keertje afspreken?

Neem contact op

Mogen we jou ook webwijs maken? We zitten vol frisse ideeën waar we jou graag verder mee helpen.

Daag ons uit
Boyd