Configuração do cache L2 para otimização do desempenho
O cache L2 (de dois níveis) reduz o tráfego de rede entre o armazenamento remoto em cache (Redis ou Valkey) e o aplicativo Commerce, adicionando uma camada de cache local em cada nó da Web. Uma instância padrão do Commerce transfere cerca de 300 KB por solicitação, e o tráfego pode aumentar rapidamente para mais de 1000 solicitações em algumas situações.
Com o cache L2, cada nó da Web armazena os dados acessados com frequência localmente e usa o cache remoto para duas finalidades:
- Verificando a versão dos dados do cache para garantir que o cache mais recente seja armazenado localmente
- Transferindo dados atualizados do cache do armazenamento remoto para o computador local
O Commerce armazena a versão de dados com hash no cache remoto, com o sufixo :hash anexado à chave regular. Quando o cache local está desatualizado, os dados são obtidos da máquina remota por meio de um adaptador de cache.
Há duas implementações de cache L2 disponíveis no Adobe Commerce:
Cm_Cache_Backend_File para armazenamento localO cache L2 do Symfony é a implementação recomendada para o Adobe Commerce 2.4.9 e versões posteriores. Ele fornece uma implementação de cache moderna e compatível com PSR-6, com melhorias significativas de desempenho em relação ao RemoteSynchronizedCache tradicional.
Configuração herdada do cache L2 (RemoteSynchronizedCache)
As instruções de configuração do cache L2 herdado se aplicam às versões mais antigas do Adobe Commerce. Se você estiver na versão 2.4.9 ou posterior do Adobe Commerce, use o Valkey com a implementação do cache Modern Symfony L2.
Para versões locais do Adobe Commerce que oferecem suporte a Redis, use o exemplo a seguir para modificar ou substituir a seção de cache existente no arquivo app/etc/env.php.
'cache' => [
'frontend' => [
'default' => [
'backend' => '\\Magento\\Framework\\Cache\\Backend\\RemoteSynchronizedCache',
'backend_options' => [
'remote_backend' => '\\Magento\\Framework\\Cache\\Backend\\Redis',
'remote_backend_options' => [
'persistent' => 0,
'server' => 'localhost',
'database' => '0',
'port' => '6379',
'password' => '',
'compress_data' => '1',
],
'local_backend' => 'Cm_Cache_Backend_File',
'local_backend_options' => [
'cache_dir' => '/dev/shm/'
]
],
'frontend_options' => [
'write_control' => false,
],
]
],
'type' => [
'default' => ['frontend' => 'default'],
],
]
Onde:
-
backendé a implementação do cache L2. -
backend_optionsé a configuração de cache L2.remote_backendé a implementação de cache remoto: Redis ou MySQL.remote_backend_optionsé a configuração de cache remoto.local_backendé a implementação de cache local:Cm_Cache_Backend_File.local_backend_optionsé a configuração de cache local.cache_diré uma opção específica de cache de arquivo para o diretório onde o cache local está armazenado.
Para versões do Adobe Commerce anteriores à 2.4.9 que oferecem suporte a Redis, a Adobe recomenda o uso de Redis para cache remoto (\Magento\Framework\Cache\Backend\Redis) e Cm_Cache_Backend_File para o cache local de dados na memória compartilhada, usando: 'local_backend_options' => ['cache_dir' => '/dev/shm/'].
A Adobe recomenda o uso do recurso cache preload, pois ele diminui drasticamente a pressão sobre o Redis. Não se esqueça de adicionar o sufixo :hash para chaves de pré-carregamento.
Opções de cache obsoletas
A partir do Commerce 2.4, a opção use_stale_cache pode melhorar o desempenho em casos específicos, disponibilizando dados armazenados em cache anteriormente enquanto novos dados de cache são gerados em um processo paralelo. Os tipos de cache recomendados e as compensações descritas nesta seção se aplicam às implementações RemoteSynchronizedCache e symfony_l2 herdadas. Para obter um exemplo de configuração symfony_l2, consulte cache L2 do Symfony com cache obsoleto.
Geralmente, a compensação com a espera por bloqueio é aceitável de uma perspectiva de desempenho. No entanto, à medida que o número de blocos ou entradas de cache aumenta, as esperas de bloqueio demoram mais tempo. Em alguns cenários, a espera pode ser de até o número de chaves x tempo limite de pesquisa para o processo. Em casos raros, um comerciante pode ter centenas de chaves no cache do Block/Config, portanto, mesmo um pequeno tempo limite de pesquisa para um bloqueio pode custar segundos.
'use_stale_cache' => true à configuração de nível superior do front-end do cache L2.A Adobe recomenda habilitar a opção use_stale_cache somente para os tipos de cache que mais se beneficiarem dela, incluindo:
block_htmlconfig_integration_apiconfig_integrationfull_pagelayoutreflectiontranslate
A Adobe não recomenda habilitar a opção use_stale_cache para o tipo de cache default.
O código a seguir mostra um exemplo de configuração para o back-end herdado RemoteSynchronizedCache. Para um exemplo de symfony_l2, consulte cache L2 do Symfony com cache obsoleto.
'cache' => [
'frontend' => [
'default' => [
'backend' => '\\Magento\\Framework\\Cache\\Backend\\RemoteSynchronizedCache',
'backend_options' => [
'remote_backend' => '\\Magento\\Framework\\Cache\\Backend\\Redis',
'remote_backend_options' => [
'persistent' => 0,
'server' => 'localhost',
'database' => '0',
'port' => '6379',
'password' => '',
'compress_data' => '1',
],
'local_backend' => 'Cm_Cache_Backend_File',
'local_backend_options' => [
'cache_dir' => '/dev/shm/'
]
],
'frontend_options' => [
'write_control' => false,
],
],
'stale_cache_enabled' => [
'backend' => '\\Magento\\Framework\\Cache\\Backend\\RemoteSynchronizedCache',
'backend_options' => [
'remote_backend' => '\\Magento\\Framework\\Cache\\Backend\\Redis',
'remote_backend_options' => [
'persistent' => 0,
'server' => 'localhost',
'database' => '0',
'port' => '6379',
'password' => '',
'compress_data' => '1',
],
'local_backend' => 'Cm_Cache_Backend_File',
'local_backend_options' => [
'cache_dir' => '/dev/shm/'
],
'use_stale_cache' => true,
],
'frontend_options' => [
'write_control' => false,
],
]
],
'type' => [
'default' => ['frontend' => 'default'],
'layout' => ['frontend' => 'stale_cache_enabled'],
'block_html' => ['frontend' => 'stale_cache_enabled'],
'reflection' => ['frontend' => 'stale_cache_enabled'],
'config_integration' => ['frontend' => 'stale_cache_enabled'],
'config_integration_api' => ['frontend' => 'stale_cache_enabled'],
'full_page' => ['frontend' => 'stale_cache_enabled'],
'translate' => ['frontend' => 'stale_cache_enabled']
],
],
Implementação do cache Modern Symfony L2
Nas versões 2.4.9+ do Commerce, use a implementação de cache L2 baseada em cache Symfony (back-end do symfony_l2) em vez do cache L2 herdado. O cache L2 do Symfony fornece uma implementação de cache moderna e compatível com PSR-6, com melhorias significativas de desempenho em relação ao RemoteSynchronizedCache tradicional.
- Adobe Commerce 2.4.9 e posterior
- Patches 2.4.8-p4 e posteriores
- Patches 2.4.7-p9 e posteriores
- Patches 2.4.6-p14 e posteriores
- Patches 2.4.5-p16 e posteriores
symfony_l2. Consulte configurar Valkey e Requisitos do Sistema.Benefícios do cache Symfony L2
- Arquitetura moderna: baseada em componentes do Symfony Cache (compatível com PSR-6)
- Melhor desempenho: suporte nativo para serialização Igbinary, compactação gzip e scripts Lua
- Conexões persistentes: reduz a sobrecarga da conexão Valkey com o pool de conexões
- Chaves de pré-carregamento: dá suporte ao pré-carregamento da chave de cache para dados críticos
- Suporte a cache obsoleto: compatibilidade total com a opção
use_stale_cache - Configuração simplificada: nomes de tipo de back-end de limpeza (
valkey,file)
Migração de RemoteSynchronizedCache para Symfony L2
Se você estiver atualizando uma instalação local do back-end herdado RemoteSynchronizedCache para symfony_l2, revise o seguinte antes de atualizar app/etc/env.php. Não é suficiente alterar apenas o valor backend. A estrutura de configuração, os nomes de chave e alguns comportamentos padrão são diferentes.
-
A estrutura de configuração foi alterada.
remote_backend,remote_backend_optionselocal_backendusam valores diferentes emsymfony_l2. Por exemplo,remote_backendtorna-se'valkey'em vez de um nome de classe totalmente qualificado. Use o exemplo de configuração abaixo como ponto de partida, em vez de editar a configuração herdada existente. -
preload_keysnão é recomendado comsymfony_l2. Se sua configuração herdada incluipreload_keys, remova-a como parte da migração. O pré-carregamento de chaves não melhora o desempenho emsymfony_l2e pode aumentar a carga em Valkey acionando pesquisas de chave adicionais e desnecessárias. -
A compactação requer um sinalizador explícito. A configuração
compression_libsozinha não habilita a compactação emsymfony_l2. Consulte Opções de back-end para o cache L2 do Symfony para a configuraçãocompress_datanecessária. -
Por padrão, o cache obsoleto não está habilitado para implantações locais configuradas manualmente. O padrão de
use_stale_cacheéfalseemsymfony_l2(consulte a tabela de opções de back-end). Se sua configuração herdada usou o front-end dostale_cache_enabled, você deve recriá-lo explicitamente usando o padrão no cache L2 do Symfony com cache obsoleto.
VALKEY_BACKEND: symfony_l2 têm sua configuração L2 completa, incluindo o front-end stale_cache_enabled, gerada automaticamente pelo ece-tools. Consulte Configurar o cache L2 do Symfony para ver o comportamento específico da Nuvem.- Redis não é um back-end remoto com suporte para
symfony_l2. Migrar para o Valkey como parte dessa alteração. Consulte configurar Valkey.
Exemplo de configuração com o cache L2 do Symfony
app/etc/env.php local. Para o Adobe Commerce na Nuvem, a configuração do cache é gerenciada automaticamente por ece-tools. Em vez de editar diretamente env.php, consulte Configurar cache L2 do Symfony.No arquivo app/etc/env.php, use o tipo de back-end symfony_l2 simplificado para cache L2. Este exemplo não inclui a configuração preload_keys, que não é recomendada com symfony_l2. Para obter detalhes, consulte Migrando de RemoteSynchronizedCache para Symfony L2.
'cache' => [
'frontend' => [
'default' => [
'backend' => 'symfony_l2',
'backend_options' => [
// L2 (Remote): Valkey with Symfony Cache
'remote_backend' => 'valkey',
'remote_backend_options' => [
'server' => 'localhost',
'database' => '0',
'port' => '6379',
'password' => '',
'serializer' => 'igbinary',
'compression_lib' => 'gzip',
'compress_data' => '1',
'persistent_id' => 'magento_l2_default',
'timeout' => '2.5',
'read_timeout' => '2.0',
'use_lua' => '1',
],
// L1 (Local): File cache
'local_backend' => 'file',
'local_backend_options' => [
'cache_dir' => '/dev/shm/magento_l1'
],
'cleanup_percentage' => 90,
],
]
],
'type' => [
'default' => ['frontend' => 'default'],
],
],
Cache Symfony L2 com cache obsoleto
Consulte Opções de cache obsoleto para saber quais tipos de cache se beneficiam do cache obsoleto e por quê.
Use o exemplo a seguir para configurar front-ends separados para o suporte a cache obsoleto do symfony_l2:
'cache' => [
'frontend' => [
// Default frontend: NO stale cache
'default' => [
'backend' => 'symfony_l2',
'backend_options' => [
'remote_backend' => 'valkey',
'remote_backend_options' => [
'server' => 'localhost',
'database' => '0',
'port' => '6379',
'serializer' => 'igbinary',
'compression_lib' => 'gzip',
'compress_data' => '1',
'persistent_id' => 'magento_l2_default',
],
'local_backend' => 'file',
'local_backend_options' => [
'cache_dir' => '/dev/shm/magento_l1'
],
],
],
// Stale cache enabled frontend
'stale_cache_enabled' => [
'backend' => 'symfony_l2',
'backend_options' => [
'remote_backend' => 'valkey',
'remote_backend_options' => [
'server' => 'localhost',
'database' => '0',
'port' => '6379',
'serializer' => 'igbinary',
'compression_lib' => 'gzip',
'compress_data' => '1',
'persistent_id' => 'magento_l2_stale',
],
'local_backend' => 'file',
'local_backend_options' => [
'cache_dir' => '/dev/shm/magento_l1_stale'
],
'use_stale_cache' => true,
],
]
],
'type' => [
'default' => ['frontend' => 'default'],
'layout' => ['frontend' => 'stale_cache_enabled'],
'block_html' => ['frontend' => 'stale_cache_enabled'],
'reflection' => ['frontend' => 'stale_cache_enabled'],
'config_integration' => ['frontend' => 'stale_cache_enabled'],
'config_integration_api' => ['frontend' => 'stale_cache_enabled'],
'full_page' => ['frontend' => 'stale_cache_enabled'],
'translate' => ['frontend' => 'stale_cache_enabled'],
],
],
Opções de back-end para o cache do Symfony L2
remote_backend'valkey'valkey ou file. Use valkey para cache L2.remote_backend_options[]local_backend'file'file ou apculocal_backend_options[]cleanup_percentage95use_stale_cachefalsecompress_datafalsecompression_lib. A configuração compression_lib sozinha não habilita a compactação.persistenttruefalse ('0') para corresponder ao comportamento do cache Zend herdado, que assume o padrão de conexões não persistentes.-
A opção
remote_backendtambém aceita um valor deredis, mas não há suporte oficial para Redis (consulte a observação acima em Implementação de cache Modern Symfony L2). -
frontend_options.write_control, usado na configuraçãoRemoteSynchronizedCacheherdada, não se aplica asymfony_l2.
Desempenho e confiabilidade aprimorados do cache Symfony L2
symfony_l2 e estão disponíveis no patch ACP2E-5132. Para o Adobe Commerce no local, aplique este patch usando a Ferramenta de correções de qualidade (QPT). Para o Adobe Commerce na Nuvem, este patch é entregue automaticamente via Patches da Nuvem para o Commerce.As atualizações mais recentes melhoram a escalabilidade do cache L2 do Symfony, reduzem a E/S desnecessária do sistema de arquivos e melhoram a consistência e a confiabilidade do cache.
Armazenamento otimizado de tags de cache do Symfony L2
Otimização do comportamento do cache do Symfony L2 para implantações com suporte da Valkey, eliminando gravações redundantes de índice de tags no sistema de arquivos. As tags de cache agora são armazenadas exclusivamente no Valkey, alinhando o comportamento do cache Symfony L2 com a implementação do cache herdado. Isso reduz a E/S de disco desnecessária, melhora o desempenho de gravação de cache e impede o crescimento do diretório var/cache/symfony/tags/.
Comportamento aprimorado do cache baseado em arquivos
Para implantações que usam o cache baseado em arquivos (sem Valkey), o índice de tag local continua sendo mantido para oferecer suporte à invalidação do cache. O índice de tag agora é gravado no cache_dir configurado, em vez do local var/cache previamente codificado, garantindo um uso consistente do diretório de cache e melhor suporte para configurações de cache personalizadas.
Correção de associação de tag obsoleta após a remarcação
A remarcação de uma entrada de cache pode deixá-la associada a tags às quais ela não pertencia mais. As associações de tag obsoletas agora são limpas na remarcação, portanto, as entradas de cache são invalidadas somente pelas tags atribuídas a elas no momento.
Correção de gravação remota redundante para salvamentos inalterados
Salvar uma entrada de cache com conteúdo inalterado ainda acionava uma gravação no back-end remoto (Valkey). Os salvamentos agora são ignorados quando o conteúdo não é alterado, reduzindo as gravações remotas desnecessárias.
Correção de remoção baseada em tamanho N1 (cleanup_percentage)
O limite cleanup_percentage usado para remoção baseada no tamanho L1 não disparou a limpeza de forma consistente. A remoção do cache L1 agora respeita corretamente o cleanup_percentage configurado.
Bloqueio de regeneração para cache obsoleto
Quando use_stale_cache está habilitado e a cópia remota de uma entrada está temporariamente indisponível, apenas um processo agora adquire um bloqueio de vida curta para regenerar essa entrada. Outras solicitações simultâneas para a mesma entrada continuam a servir o valor local existente em vez de regenerá-lo, reduzindo os carimbos de regeneração e a carga de back-end redundante.
Impacto
- Elimina gravações redundantes de índice de tags do sistema de arquivos para implantações de cache do Symfony L2 com suporte da Valkey, reduzindo a E/S de disco e evitando o crescimento desnecessário do diretório
var/cache/symfony/tags/. - Garante que as implantações de cache baseadas em arquivo usem consistentemente o
cache_dirconfigurado para o índice de tag local, preservando o comportamento de invalidação do cache. - Evita a invalidação incorreta do cache causada por associações de tag obsoletas deixadas para trás após a remarcação.
- Reduz gravações remotas desnecessárias para salvamentos inalterados de cache, diminuindo a carga de rede e back-end.
- Garante que a remoção do cache L1 acione de forma confiável no limite
cleanup_percentageconfigurado. - Reduz os carimbos de regeneração para
use_stale_cacheentradas ao selecionar um único regenerador por chave, em vez de cada solicitação simultânea para recriá-lo.
Para obter opções de configuração detalhadas, consulte: