Pergunta

Aqui está minha primeira pergunta no SO.

Tenho um aplicativo interno para minha empresa que recentemente pedi para manter.Os aplicativos são construídos em PHP e são bastante bem codificados (OO, DB Abstraction, Smarty), nada WTF.

O problema é que as aplicações são muito devagar.

Como faço para descobrir o que está deixando o aplicativo lento?Otimizei o código para fazer poucas consultas ao banco de dados, então sei que é o código PHP que está demorando um pouco para ser executado.Preciso de algumas ferramentas que possam me ajudar com isso e preciso traçar uma estratégia para verificar meu código.

Posso fazer o trabalho de verificação/estratégia sozinho, mas preciso de mais ferramentas PHP para descobrir onde meu aplicativo está com problemas.

Pensamentos?

Foi útil?

Solução

eu usei Perfil XDebug recentemente numa situação semelhante.Ele gera um relatório de perfil completo que pode ser lido com muitos aplicativos de criação de perfil comuns (mas não posso fornecer uma lista, apenas usei aquela que veio com o slackware).

Outras dicas

Como Juan mencionou, o xDebug é excelente.Se você estiver no Windows, WinCacheGrind permitirá que você examine os relatórios.

Assista a esta apresentação de Rasmus Lerdorf (criador do PHP).Ele dá alguns bons exemplos de testes de velocidade do PHP e o que procurar, bem como alguns detalhes internos que podem tornar as coisas mais lentas.XDebug é uma ferramenta que ele usa.Ele também faz questão de saber qual é o custo de desempenho que você está enfrentando com os frameworks.

Vídeo:http://www.archive.org/details/simple_is_hard

Slides (já que é difícil de ver no vídeo):http://talks.php.net/show/drupal08/1

Existem muitas variáveis ​​que podem impactar o desempenho da sua aplicação.Eu recomendo que você não presuma instantaneamente que o PHP é o problema.

Primeiro, como você está servindo o PHP?Você já tentou a otimização básica do Apache ou do próprio IIS?O servidor está ocupado processando outros tipos de solicitações?Você já aproveitou um Acelerador de código PHP?Uma maneira de testar se o servidor é o seu gargalo é tentar executar o aplicativo em outro servidor.

Segundo, o desempenho de todo o aplicativo é lento ou parece afetar apenas algumas páginas?Isso pode lhe dar uma indicação de onde começar a analisar o desempenho.Se todo o aplicativo estiver lento, o problema é mais provável no servidor/plataforma subjacente ou em uma consulta SQL global que faz parte de cada solicitação (autenticação do usuário, por exemplo).

Terceiro, você mencionou a minimização do número de consultas SQL, mas e quanto à otimização das consultas existentes?Se você estiver usando MySQL, você está aproveitando os vários pontos fortes de cada sistema de armazenamento?Você correu EXPLICAR em suas consultas mais importantes para garantir que estejam indexadas corretamente?Isto é fundamental em consultas que acessam tabelas grandes;quanto maior o conjunto de dados, mais você notará os efeitos de uma indexação inadequada.Felizmente, existem muitos artigos como este que explicam como usar EXPLAIN.

Quarto, um erro comum é presumir que o servidor de banco de dados usará automaticamente todos os recursos disponíveis para o sistema.Você deve verificar se alocou explicitamente recursos suficientes para seu aplicativo de banco de dados.No MySQL, por exemplo, você desejará adicionar configurações personalizadas (em seu arquivo my.cnf) para coisas como buffer de chave, tamanho da tabela temporária, simultaneidade de thread, tamanho do buffer pool innodb, etc.

Se você verificou todos os itens acima e ainda não conseguiu encontrar o gargalo, um criador de perfil de código como o Xdebug pode definitivamente ajudar.Pessoalmente, prefiro o criador de perfil do Zend Studio, mas pode não ser a melhor opção, a menos que você já esteja aproveitando o resto da pilha da plataforma Zend.No entanto, na minha experiência, é muito raro que o próprio PHP seja a causa raiz do desempenho lento.Freqüentemente, um criador de perfil de código pode ajudá-lo a determinar com mais precisão quais consultas de banco de dados são as culpadas.

phpED (http://www.nusphere.com/products/phped.htm) também oferece excelente depuração e criação de perfil, além da capacidade de adicionar relógios, pontos de interrupção, etc. no código PHP.O criador de perfil integrado oferece diretamente um detalhamento do tempo de cada chamada de função e método de classe de dentro do IDE.Os plug-ins do navegador também permitem integração rápida com Firefox ou IE (ou seja,visite o URL lento com o navegador e clique no botão para criar um perfil ou depurar).

Tem sido muito útil para apontar onde o aplicativo está lento para concentrar a maior parte do esforço de codificação;e evita perda de tempo otimizando códigos já rápidos.Depois de experimentar o Zend e o Eclipse, agora fiquei convencido da facilidade de uso do phpED.

Tenha em mente que tanto o Xdebug quanto o phpED (com DBG) exigirão um módulo PHP extra instalado ao depurar em um servidor web.phpED também oferece (não experimentado por mim) uma opção de depuração local.

O perfil Xdebug é definitivamente o caminho a percorrer.Outra dica: o WincacheGrind é bom, mas não foi atualizado recentemente. http://code.google.com/p/webgrind/ - em um navegador pode ser uma alternativa fácil e rápida.

Provavelmente, ainda é o banco de dados.Verifique se há índices relevantes - e se há memória suficiente para armazenar em cache o máximo possível de dados de trabalho.

Você também pode usar DPA (Depurador PHP avançado).

É muito fácil fazer funcionar.

$ php apd-test.php

$ pprofp -l pprof.SOME_PID

Trace for /Users/martin/develop/php/apd-test/apd-test.php
Total Elapsed Time = 0.12
Total System Time  = 0.01
Total User Time    = 0.07


         Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
71.3 0.06 0.06  0.05 0.05  0.01 0.01  10000  0.0000   0.0000            0 in_array
27.3 0.02 0.09  0.02 0.07  0.00 0.01  10000  0.0000   0.0000            0 my_test_function
 1.5 0.03 0.03  0.00 0.00  0.00 0.00      1  0.0000   0.0000            0 apd_set_pprof_trace
 0.0 0.00 0.12  0.00 0.07  0.00 0.01      1  0.0000   0.0000            0 main

Há um bom tutorial sobre como compilar o APD e criar perfis com ele: http://martinsikora.com/compiling-apd-for-php-54

se for uma base de código grande, tente apc se ainda não o fez.

http://pecl.php.net/package/APC

você também pode tentar usar a função register_tick_function em php.que diz ao php para chamar uma determinada função periodicamente através do seu código.Você poderia então acompanhar qual função está em execução no momento e a quantidade de tempo entre as chamadas.então você poderá ver o que está demorando mais.http://www.php.net/register_tick_function

Usamos o ambiente de desenvolvimento Zend (windows).Resolvemos um pico de uso de memória ontem, percorrendo o depurador enquanto executamos o Process Explorer para observar a atividade de memória/cpu/disco à medida que cada linha era executada.

Explorador de processos: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx.

O ZDE inclui um criador de perfil de desempenho básico que pode mostrar o tempo gasto em cada chamada de função durante solicitações de página.

Eu uso uma combinação de Referência PEAR e log4php.

No topo dos scripts que desejo criar um perfil, crio um objeto que envolve um Benchmark_Timer objeto.Ao longo do código, adiciono $object->setMarker("name");chamadas, especialmente em torno de código suspeito.

A classe wrapper possui um método destroy que pega as informações de log e as grava no log4php.Normalmente envio isso para o syslog (muitos servidores, agregados em um arquivo de log em um servidor).

Na depuração, posso observar os arquivos de log e ver onde preciso melhorar as coisas.Mais tarde na produção, posso analisar os arquivos de log e fazer análises de desempenho.

Não é xdebug, mas está sempre ativado e me permite comparar quaisquer duas execuções do código.

Você também pode olhar para o Proxy HA ou qualquer outra solução de balanceamento de carga se o desempenho degradado do servidor for a causa do processamento lento do aplicativo.servidor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top