Redis OOM Magento 2: ajustar a maxmemory-policy e separar os bancos

A loja devolve 500 e o var/log/exception.log enche de “OOM command not allowed when used memory > ‘maxmemory'”. O Magento não tem culpa: o Redis encheu e está configurado para recusar escrita nova em vez de jogar fora chave velha. São dois ajustes, um na política de despejo e outro na separação dos bancos.

Confirme que é memória mesmo

redis-cli info memory | grep -E 'used_memory_human|maxmemory_human|maxmemory_policy'
redis-cli info keyspace

Se o used_memory bateu no maxmemory e a policy aparece como noeviction, achamos o culpado: assim o Redis lotado responde erro em todo SET, e o Magento traduz isso em página branca. Troque para allkeys-lru, que descarta a chave usada há mais tempo:

redis-cli config set maxmemory-policy allkeys-lru
redis-cli config rewrite
redis-cli config get maxmemory

O config set vale na hora e o config rewrite grava no redis.conf que a instância carregou, sem reiniciar nada — de propósito: reiniciar o Redis que guarda sessão desloga todo mundo e esvazia carrinho no meio do expediente. Veja também o maxmemory: em 0 o Redis cresce até o OOM killer do kernel comer o processo.

Cache, page cache e sessão em bancos diferentes

bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-db=0
bin/magento setup:config:set --page-cache=redis --page-cache-redis-db=1
bin/magento setup:config:set --session-save=redis --session-save-redis-db=2
bin/magento cache:flush

Os três reescrevem o app/etc/env.php, então guarde uma cópia dele antes. Compartilhar o banco 0 é o erro clássico: o full page cache cresce feito bicho e um cache:flush apaga a sessão de todo mundo junto. Com bancos separados você limpa um sem encostar no outro — o flush ainda derruba o FPC, então conte uns minutos de site lento.

A armadilha do allkeys-lru na sessão

Bancos separados dividem a mesma memória da instância, e o allkeys-lru não respeita fronteira de banco: num pico ele pode descartar sessão de cliente que estava no meio do checkout. Em loja com movimento eu subo uma segunda instância na porta 6380 só para sessão, com volatile-lru e maxmemory folgado, e aponto o –session-save-redis-port para ela.

Se travou nisso e precisa de ajuda, me chama aqui.

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *