Magento 2 Indexers: voor developers

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}

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:

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.
Even kennismaken?
Of je nu nét begint, of al jaren actief bent. Onze online consultants hebben goede tips voor je om je doelen te halen. Maak nu je afspraak en ontvang gratis tips, waarom niet?
