Quais partes da camada do modelo podem ser ignoradas no interesse da otimização de desempenho

28

Atualmente, estou vendo que para uma tabela de banco de dados com um esquema muito simples (cerca de 5 campos), ela está inserindo novos registros a uma taxa de pouco menos de ~ 50 inserções / segundo, no meu ambiente de desenvolvimento local (unidade SSD) - isso é com nenhum observador no modelo que preenche tabelas associadas.

Usando SQL direto, estou vendo uma melhoria - ~ 1800 inserções / segundo. Estamos pensando em tentar otimizar o desempenho de nossos modelos, mas é claro que não queremos perder toda a boa estabilidade e flexibilidade que o núcleo Magento nos oferece.

Pergunto-me se alguém já seguiu esse caminho antes e se há algumas vitórias fáceis em termos de componentes da camada de modelo que podem ser ignoradas com relativa segurança, o que proporcionará melhorias significativas no desempenho.

Coisas como:

  • Resolução do nome da classe
  • antes e depois dos eventos salvos
  • Despachos de eventos
  • Transações
  • etc.

UPDATE: Eu menti, na verdade havia algumas consultas adicionais disparando de observadores ou afterSave (), que eu vi quando inspecionei o log de consulta do banco de dados. O benchmarking em relação a uma entidade totalmente simples realmente me dá ~ 300 linhas / segundo nos modelos Magento - apenas o overhead do MySQL são transações.

kalenjordan
fonte
1
Você tentou reutilizar o objeto de modelo para gravar os dados? Ou seja, limpe-o, definaDados e salve. Isso evitaria as chamadas para getModel e a sobrecarga de instanciação de objeto inerente ao PHP.
precisa saber é o seguinte
Além disso, vou adivinhar que o gargalo aqui está na sua CPU e não na unidade ... pois todos os arquivos de código necessários serão carregados na primeira passagem.
davidalger
Obrigado David! Vou tentar isso também. Na verdade, acho que ainda estamos limitados à E / S pelo número de consultas que estão sendo executadas. Temos cerca de 20 consultas em execução para um determinado salvamento de modelo - algumas das quais precisamos manter (preenchendo tabelas associadas, SELECTs para verificar a existência antes da gravação) e outras que provavelmente podemos remover (salva de sessão externa, carga adicional () 's que pode ser evitado na lógica da aplicação)
kalenjordan
Você pode descobrir facilmente. Monte o diretório raiz inteiro e o MySQL DB em um disco RAM. Mas duvido muito que a E / S seja um problema em equipamentos de nível de servidor. Você provavelmente verá mais benefícios simplesmente desativando o "Índice ao salvar".
Ben Lessani - Sonassi

Respostas:

17

Uma coisa que pode acelerar o site inteiro é remover todas as referências Varien_Profilerno site de produção. Mesmo se o criador de perfil estiver desabilitado, ele sempre verifica se está habilitado para que todas as chamadas Varien_Profiler::resultem em uma ifdeclaração adicional . Obviamente, remover todas essas chamadas tem o custo de não poder mais usar o criador de perfil. No entanto, isso pode acelerar o site inteiro em talvez 5% ou mais (isso é uma experiência subjetiva, mas existem MUITAS chamadas para Varien_Profilertodo o Magento). Na verdade, escrevi um pequeno script de shell para comentar automaticamente essas chamadas em todos os arquivos e adicionarei isso à minha postagem amanhã quando estiver no trabalho e tiver meu código pronto.

Como prometido agora, o código para comentar essas chamadas:

grep -l "Varien_Profiler" * -R > profiler.txt 
for x in `cat profiler.txt` 
do 
sed -i '/Varien_Profiler/s/^/\/\//' $x
done

Isso deve ser executado no console linux, tanto no aplicativo / quanto na pasta lib /. Pode ser necessário ajustar o arquivo /lib/Varien/Profiler.php manualmente posteriormente. Observe também que você deve testá-lo completamente em um ambiente seguro antes de levá-lo ao vivo - mas acho que isso deve ser óbvio;)

mpaepper
fonte
Uau! Eu nunca imaginaria nada próximo de 5% apenas para as chamadas Varien_Profiler quando desativadas. Vou verificar isso, obrigado!
precisa saber é o seguinte
@sparcksoft Como prometido, adicionei o código agora.
Mpaepper
1
É aí que os condicionais do pré-compilador C são realmente bons. É uma pena que o PHP não os tenha, mas é claro, isso significaria que ele teria que ter seu próprio método de pré-compilação e armazenamento em cache embutidos. :)
davidalger
2
Você também pode escrever find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;se preferir um oneliner rápido.
kojiro
14

Ao executar muitas salvamentos nos modelos Magento, é melhor desativar o indexador Magento, que atrasa o processo:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

E ativá-lo quando terminar:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');
Rick Kuipers
fonte
Ah te peguei, legal. Então, seria como se você estivesse salvando muitos registros de identidade do cliente e desejasse evitar a indexação de clientes para cada salvamento? No meu caso, estou realmente fazendo isso com uma entidade personalizada que não possui nenhuma indexação - pelo menos para o benchmark que fiz. Também temos alguns índices personalizados nos quais provavelmente usarei essa dica!
precisa saber é
Eu não acho que exista alguma indexação de clientes, mas certamente ajudará você a modificar muitos produtos e coisas do tipo. De qualquer forma vale a pena tentar!
Rick Kuipers
Desculpe, sim, dados do produto EAV e outros, por exemplo. Obrigado.
precisa saber é o seguinte
Ei! Você pode ter que (parcialmente) reindexar depois disso?
24413 Alex
@ Alex Sim, os indexadores são redefinidos para MODE_REAL_TIME, para que eles sejam reindexados pela programação. Você pode, é claro, forçá-lo, se quiser.
21413 Rick Kipers