Magento 2 Redis performance issue

Issues were discovered during our work under Magento SaaS multitenent (magneto.com) platform.

Redis Performance Degradation with SINTER:

Image for post
Image for post

/SINTER command was discovered:

SINTER key [key …]

Fairly High Time complexity: O(N*M) worst case where N is the cardinality of the smallest set and M is the number of sets.

Returns the members of the set resulting from the intersection of all the given sets.

SCAN

Time complexity: O(1) for every call. O(N) for a complete iteration, including enough command calls for the cursor to return back to 0. N is the number of elements inside the collection.

The SCAN command and the closely related commands SSCAN, HSCAN and ZSCAN are used in order to incrementally iterate over a collection of elements.

In Magento 2 Redis KEYS command has been warned against being used in production as it can block the database while the query is being performed. Remember Redis is single threaded!

The chart below shows the effects of running SCAN/SINTER. It shows the effects that running the queries has on the existing workload’s performance.

Image for post
Image for post

For the above, memtier was used to generate a workload, and a specific numbers of SCAN queries was run to see the effects on the workload.

The baseline ops/sec without running SINTER was ~128,000 ops/sec. It is obvious that as more SINTER,SCAN,KEYS queries in Magento are performed, the workload throughput becomes greatly reduced. The cumulative blocking effect of the many iterations becomes apparent fast. This means it is important to reduce the number of SINtER queries being performed to prevent reducing performance drastically.

Tracking the number of commands processed is critical for diagnosing latency issues in your Redis instance. Because Redis is single-threaded, command requests are processed sequentially. T

Avoid slow commands for large sets: If increases in latency correspond with a drop in command volume you may be inefficiently using Redis commands with high time-complexity. High time-complexity means the required time to complete these commands grows rapidly as the size of the dataset processed increases. Minimizing use of these commands on large sets can significantly improve Redis performance. The table below lists the Redis commands with highest time-complexity. Specific command attributes that affect Redis performance and guidelines for optimal performance are highlighted for each of the commands.

ZINTERSTORE

intersect multiple sorted sets and store result

SINTERSTORE

intersect multiple sets and store result

SINTER

intersect multiple sets

MIGRATE

transfer key from one Redis instance to another

DUMP

return serialized value for a given key

. ZREM remove one or more members from sorted set

SORT sort elements in list, set, or sorted set

SDIFFSTORE subtract multiple sets and store result

SDIFF subtract multiple sets

SUNION add multiple sets

LSET set value of an element in a list

LREM remove elements from a list

LRANGE get range of elements from a list

. ZUNIONSTORE

. add multiple sorted sets and store result

Magento 2 Backend cache implementation has many long running Ridis kommands (SINTER etc.) commands when models and caches were changed or flushed by tag. Almost any write operation running SINTER operations. That’s why during real production workload Magento performance is so disgusting. When you are changing something Magento black Redis entirely on 1–2 seconds sometimes more and any other requests can’t be handled.

Written by

Magento/APP Cloud Architect. Melting metal server infrastructure into cloud solutions.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store