Cache

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.

Post Recentes

Criar swapfile no Ubuntu: parar o OOM killer de matar o MySQL

VPS de 2 GB onde o mysqld morre de madrugada e o site volta com erro de conexão. Como confirmar…

8 horas atrás

Grupos nomeados no preg_match: pare de contar índice de $matches

Regex com cinco parênteses e ninguém lembra se a data é $matches[2] ou $matches[3]. Nomeie os grupos e leia o…

22 horas atrás

Token de integração da API do Magento 2: gerar e usar no header Bearer

Erro The consumer isn't authorized to access resources ao chamar a REST do Magento 2.4.8? Ative a integração, libere os…

1 dia atrás

Rate limit no wp-login.php com nginx: barrar força bruta antes do PHP

Bots batendo centenas de POST por minuto no login derrubam a CPU. Configure limit_req_zone no nginx e devolva 429 antes…

2 dias atrás

Anonimizar IP no nginx: mascarar o último octeto do log para a LGPD

Seu access.log guarda o IP inteiro dos visitantes há meses sem necessidade. Mascare o último octeto com map e log_format…

3 dias atrás

Prompt injection em campo de usuário: isole a observação do pedido

A observação do pedido chegou com ordem embutida para gerar cupom. Delimite o texto do cliente e trate a resposta…

3 dias atrás