Problema de desempenho com sites / lojas de 1 a 10 mil


9

Estou tentando encontrar uma maneira de melhorar o desempenho do Magento quando a quantidade de sites / lojas excede 1k e meu objetivo é de 10k. Aqui estão algumas perguntas; quaisquer dicas / ajuda são extremamente bem-vindas!

  1. A adição de novos sites / lojas é lenta;
    Comento $ this-> cleanModelCache () em _afterSave () em Mage_Core_Model_Abstract, e a situação parece melhor, mas está ficando mais lenta com o aumento do número de sites / lojas. E não sei o que isso afetaria todo o sistema no futuro.

  2. As chamadas da API ficam lentas.
    Um dos principais processos é colocar ordem; meu modelo personalizado lida com isso processando alguns dados e usando essencialmente o modelo de vendas / cotação e modelos de vendas / serviço_quote. O processo começa com Oauth. Oauth e a ordem de colocação demoram mais quando o número de sites / lojas aumenta e o consumo de memória parece maior. Isso tem algo a ver com o Mage carregando o xml de configuração e o fato de os dados de configuração aumentarem com o aumento do número de sites?

  3. Abrindo o n98-magerun dev: o console está demorando mais; não sei a causa disso.

  4. Salvar a configuração do painel de administração leva mais tempo; não sei como melhorá-lo.

É possível reconstruir a maneira como o Magento gera e carrega dados de configuração para diminuir seu consumo de memória? Esse é um dos fatores que causam problemas de desempenho para minha situação?

Instância atual do Magento: Version = Magento EE 1.14.2.4;
Configurar cache ativado; outro cache desativado;
Usando o Mysql 5.6 e o ​​MongoDB (para catalog_category_entity, catalog_product_entity, core_website);
número de sites = número de lojas = número de visualizações = 1024;
número de produto = 4501;

Obrigado a todos antecipadamente!


2
por que o suporte magento não pode te ajudar ???
MagenX

Como obtenho ajuda deles? Eu sou novo na comunidade .. obrigado!
Jack.W

11
você tem a versão corporativa, não sabe onde obtê-la, mas, se não houver suporte ao magento, apenas desperdice dinheiro e tempo. você deve acertá-los nas bolas para fazê-los correr como coelhos, ajudando-o. qual é o ponto em ter versão empresarial ???
MagenX

11
mas a resposta óbvia a sua consulta é - lojas Magento separados com bancos de dados separados, como lotes por 10-20 lojas ...
MagenX

Ah, certo .. Vou pedir a conta do meu chefe..haha.
Jack.W

Respostas:


3

Uma das razões pelas quais fica lento é porque a configuração de cada loja é duplicada em / config / websites e / config / global e o código para fazer isso não é eficiente, no mínimo. Qualquer alteração na configuração pode causar vários minutos, se não horas, de desempenho e taxa de transferência reduzidos. Torná-lo mais eficiente basicamente significa que Ben Marks virá atrás de você ... e não no bom sentido.

Se você for seguir esse caminho, a maneira mais fácil seria ter instalações de 10k Magento e ter algum tipo de corretor que delegue solicitações no site apropriado. Embora, é claro, dependa de qual é o seu caso de uso real.

[adicionado]

Dependendo do caso de uso, você poderá usar categorias como pseudo-armazenamentos. Tecnicamente, você poderia usar o XML do layout para alterar o tema por loja. Mas você teria a limitação do checkout. Todas as lojas precisariam compartilhar o checkout.

De qualquer forma, as lojas 10k Magento são factíveis, pois não são impossíveis. Mas será um caminho difícil, seja qual for o caminho que você escolher.


Olá Kevin, obrigado pela sua resposta! Sim, vejo o código que atualiza a árvore de configuração, que é loadToXml () se não estiver errado. Meu pensamento é; e você disse que não é uma boa ideia modificá-lo? O que você quer dizer com Ben Marks vindo atrás de mim? Além disso, parece que cada solicitação http que chega ao Magento eventualmente carrega a árvore de configuração, está correto? Alguma maneira de diminuir o tamanho dela? Eu provavelmente deveria pensar em obter instâncias de 10k Magento ... alguma opinião sobre a quantidade de recursos que seriam necessários? Muito obrigado Kevin!
Jack.W

Mas ter 10k instalações Magento significa 10k instâncias mysql, certo? Eu não tenho nenhuma idéia de como fazer isso, ou se é uma boa idéia ..
Jack.W

11
Não, isso significaria ter 10k bancos de dados mysql, mas todos os 10k deles poderiam estar em uma única instância mysql.
Christian

11
O "Ben Marcas" vindo atrás de você é uma referência à presente camo.githubusercontent.com/...
Kevin Schroeder

11
Instalações 10k Magento significa 10k bancos de dados MySQL, no entanto, isso seria espalhado. Seria MUITO mais fácil criar scripts para implantar instalações individuais de 10k do Magento do que fazer o código principal existente funcionar com as lojas de 10k.
Kevin Schroeder

1

Você pode tentar invadir o núcleo e ativar divisões de cache do site. Você pode tentar invadir o banco de dados e armazenar informações de configuração na memória. Você pode tentar substituir o cache de configuração por algo mais inteligente - por exemplo, armazenar em cache as informações dos arquivos xml [que são estáticos e se aplicam a todos os sites e lojas] enquanto recupera os dados de substituição dinamicamente.

Eu sou um servidor, então eu iria mexer com o banco de dados. Especialmente porque é trivial fazer isso.

Se você tiver controle sobre o servidor de banco de dados: Renomeie a tabela core_config_data para core_config_data_offline Crie uma nova tabela core_config_data usando o mecanismo de armazenamento MEMORY http://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html Copie todos os dados de core_config_data_offline para core_config_data

Configure uma tarefa cron para verificar se existe core_config_data, se ele copia todos os dados para core_config_data_offline. Caso contrário, crie-o e copie tudo, de core_config_data_offline para core_config_data

Desligue o cache de configuração. Com o cache de configuração ativado, você obtém apenas um aumento de desempenho pela primeira vez que os dados de configuração são lidos no banco de dados - depois disso, eles estão no cache e você sofre. Por outro lado, os arquivos xml não são mais armazenados em cache; portanto, você trocou o hit de desempenho por desserializar enormes dados de configuração pelo hit de analisar um monte de arquivos xml.

Você também pode experimentar alterar o arquivo Mage / Core / Model / Config.php e ativar caches de sites individuais. Por padrão, cada dado de configuração específico da loja é armazenado em cache individualmente. Todos os dados de configuração do site são armazenados em cache em um objeto.

Observe que isso é apenas para as substituições de configuração [as configurações de administrador]. Portanto, se você fizer todas as alterações de configuração no nível da loja, você já estará definido. Se você usar "herdar do site" e fazer a maioria das alterações específicas na sua loja no nível do site - o cache conterá todos os sites. Ao dividi-lo, você pode quebrá-lo muito melhor. protegido $ _cacheSections = array ('admin' => 0, 'adminhtml' => 0, 'crontab' => 0, 'install' => 0, 'stores' => 1, 'websites' => 0);

para

protected $_cacheSections = array(
    'admin'     => 0,
    'adminhtml' => 0,
    'crontab'   => 0,
    'install'   => 0,
    'stores'    => 1,
    'websites'  => 1
); 

Olá Gary, obrigado por uma resposta tão útil! Tenho algumas perguntas: 1) Pela minha observação, a consulta ao banco de dados não é um problema, mesmo com mais de 1k sites / lojas; portanto, se for esse o caso, o uso do armazenamento em memória ainda ajudaria? 2) Não sei se está correto, mas o cache de configuração parece armazenar apenas informações do sistema e dos módulos; isso tem algo a ver com a configuração do site / loja? 3) Existe uma maneira do magento reconhecer um ID específico de loja / site a partir de uma solicitação http e, assim, carregar apenas o arquivo de configuração correspondente? Muito obrigado Gary!
Jack.W

2
Essas recomendações não tratam do problema observado pelo OP. Desativar o cache de configuração acabará matando o sistema. Isso fará com que o Magento carregue todos os arquivos de configuração, mescle-os, mescle todos / global, mescle todos / websites e mescle tudo isso em cada nó / stores. Isso acontecerá para CADA solicitação. Com 10 mil sites, você pode ver minutos do relógio de parede por solicitação .
Kevin Schroeder

Hey Kevin, obrigado pela resposta; Na verdade, estou planejando mover a tabela core_config_data para a memória, habilitar o cache para a configuração do sistema e do módulo, impedir que o core_config_data seja mesclado na árvore de configuração e criar funções que leiam essa parte dos dados diretamente na consulta do banco de dados. O que você acha?
Jack.W

11
O problema não é core_config_data. O problema é que as configurações da loja são mescladas de / websites mescladas de / global em XML O banco de dados ficará perfeitamente bem. É o PHP que odiará a vida por causa da fusão da configuração. Em sua etapa depurador através Mage_Core_Model_Resource_Config :: loadToXml com especial atenção para as linhas 110 e seguintes
Kevin Schroeder

11
Agora, voltando à minha mesa de memória. Armazenar em cache dados significa armazená-los em algum lugar que possa ser acessado rapidamente. O Magento armazena em cache os dados de configuração em um objeto serializado php - se os dados de configuração são enormes, significa que o PHP precisa desserializar uma enorme quantidade de dados para cada solicitação. Se você souber usar o xdebug, analise parte de sua página mais lenta e veja quanto tempo é gasto executando a função desserializar : php.net/manual/en/function.unserialize.php - se for enorme [mais de 100 ms] "cache" a configuração está quebrando seu sistema.
Gary Mort
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.