Histórico da Página
Composition Setup |
---|
import.css=/download/attachments/327912/newLayout.css |
Portuguese | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
LogProfiler - Profiler de execução de programas AdvPL- InternaEste documento aborda a utilização de um recurso da plataforma TOTVS Tec e TOTVS | Platform para medir o tempo utilizado na execução de uma aplicação AdvPL (conhecido popularmente por "Profiler"), implementado originalmente como uma funcionalidade do TOTVS | Development Studio, e recentemente implementado diretamente no servidor de aplicação (TOTVS | Application Server), bem como um exemplo de sua utilização e visão geral dos resultados gerados.
Este recurso, embora muito útil, não atendia a determinadas necessidades como, por exemplo, obter o profiler de execuções em JOB (processos WEB, WEBEX, WORKFLOW e afins), exigir que a aplicação seja iniciada a partir do TOTVS | Development Studio, o que não é recomendável de ser utilizado por exemplo em ambiente de produção, e mesmo para uma aplicação executada via TOTVS | Development Studio, a execução de determinadas rotinas através do TOTVS | Development Studio fica sensivelmente mais lenta, devido à intensa troca de mensagens entre o TOTVS | Application Server e o TOTVS | Development Studio, comportamento este implícito em uma operação de depuração. Para atender melhor a uma gama maior de necessidades de levantamento de execução e performance de rotinas do ERP, foi criado um recurso chamado LogProfiler, que gera informações mais detalhadas, não depende da execução da aplicação através do TOTVS | Development Studio, tendo uma performance sensívelmente maior do que o profiler do TOTVS | Development Studio, pode ser utilizado para obter informações de execução de JOBS, e com estas características, é possível ser realizado com segurança, mediante uma configuração adicional, em um ambiente de produção para identificar situações de comportamentos inesperados não reproduzidos em ambientes de testes ou homologação, para avaliação de performance e identificação de gargalos na infraestrutura e/ou na rotina em si. na execução de uma aplicação AdvPL (conhecido popularmente por "Profiler"), funcionalidade implementada nativamente no servidor de aplicação (TOTVS | Application Server), bem como um exemplo de sua utilização e visão geral dos resultados gerados. RequisitosO recurso LogProfiler está disponível a partir da build 7.00.090818P, para o TOTVS | Application Server. A primeira implementação deste recurso no binário foi na build 7.00.081215P, porém os dados gerados para análise de performance ainda não ofereciam um nível de detalhamento que contemplasse um diagnóstico mais apurado ao executar rotinas complexas. IndicaçãoEste recurso é indicado para a análise de performance em rotinas e aplicações AdvPL, em momento de desenvolvimento e/ou homologação, para avaliar a quantidade de instruções executadas e tempo de resposta destas instruções, para análise de pontos críticos, funções mais chamadas e pontos que podem ser melhorados em um processo. Também é indicado para as situações onde uma determinada rotina, que tinha um tempo médio de processo determinado, passou a apresentar, a partir de um determinado momento, um tempo maior de execução, e existe a necessidade de descobrir se o fator que desencadeou este comportamento está relacionado à algumas funções do código executado, que tiveram alteração de comportamento e tempo de resposta, ou até mesmo uma alteração de lógica ou implementação no código-fonte, onde uma ou mais funções tiveram funcionalidades agregadas que consequentemente acarretaram em um acréscimo no tempo de execução de cada chamada. Dadas as características do LogProfiler, é possível utilizar este recurso inclusive em um ambiente de produção para avaliar, por exemplo, uma rotina ou funcionalidade que apresenta comportamentos de performance evidente entre um ambiente de homologação e um de produção, onde a análise em ambiente de homologação não identificou nenhum ponto crítico ou significativo no processo, porém no ambiente de produção a performance da rotina é prejudicada. ConfiguraçãoO registro de performance de execução das rotinas é realizado diretamente no log de console do TOTVS | Application Server (console.log), em formato texto, com leiaute para visualização. Deste modo, deve ser verificado se a geração do arquivo de log de console está habilitada no TOTVS | Application Server. Para habilitar a geração deste arquivo, deve-se acrescentar a chave ConsoleLog=1, na seção [GENERAL], do arquivo de configuração do TOTVS | Application Server (appserver.ini ). Esta configuração somente é considerada no momento da inicialização do TOTVS | Application Server (como serviço ou console). A habilitação deste recurso é configurada por ambiente dentro de um serviço do TOTVS | Application Server, inserindo na configuração do ambiente (seção [Environment]) a chave LogProfiler=1, diretamente no arquivo de configuração do TOTVS | Application Server. Esta chave pode ser inserida mesmo com o serviço em execução, e terá efeito sob todos os novos JOBS e/ou novas conexões de TOTVS | SmartClient executadas neste TOTVS | Application Server iniciadas após a chave ser configurada. O recurso de profiler também está sendo implementado gradativamente em pontos específicos do sistema, para gerar informações instrumentadas de execução de código, por exemplo na engine de Web Services, onde um profiler habilitado no INI não será tão eficaz, pois quando a Working Thread de Web Service termina, o profiler mostrado contemplará todas as requisições de processamento, tornando praticamente impossível a identificação do peso de cada chamada. Estas implementações de profiler estão documentadas respectivamente em cada componente.
Informações geradas no LOG de ConsoleApós o término de uma rotina, executada com o LogProfiler habilitado, a partir de um TOTVS | SmartClient, será gerado no log de console uma entrada com a informação “BEGIN APP PROFILER”, contendo os seguintes dados : --- BEGIN APP PROFILER ( THREAD [X] USER [Y] MAIN [Z] ) ---
Após esta informação, são gravadas as chamadas de todas as funções básicas e de RPO feitas pelo programa, onde abaixo do totalizador de cada chamada, são apresentadas as origens de cada chamada, no formato abaixo : CALL <FUNNAME> ( <RECURSO> ) C <calltot> T <timertot> M <slowest>-- FROM ORIGEM LN <line> C <thiscall> T <thistime> M <slowest>-- FROM ORIGEM LN <line> C <thiscall> T <thistime> M <slowest>(…)
Abaixo dela serão apresentados uma ou mais linhas prefixadas com "– FROM", onde é apresentado em ORIGEM qual a função e respectivo código-fonte que fez a chamada, em <line> é apresentada a linha do código-fonte onde a chamada foi feita e em <thiscall>, <thistime> e <slowest> são apresentados, respectivamente, quantas chamadas para a função <FUNNAME> tiveram origem neste ponto, qual foi o tempo gasto com estas chamadas neste ponto e qual foi a chamada mais lenta realizada deste ponto. Para exemplificar o nível de detalhamento das informações geradas, vamos ver inicialmente o programa abaixo:
Ao ser executado, através de um TOTVS | SmartClient, com a configuração LogProfiler especificada no ambiente em uso, observe o log de console gerado: [INFO ][SERVER] Env [advpltests_top_mssql] Log profiler enabled
--- BEGIN APP PROFILER ( THREAD [4876] USER [juliow] MAIN [U_MYPROFILE] )859CALL 859938CALL 938562CALL 562359CALL 359110CALL 110000CALL 000000CALL 000000CALL 000000CALL 000000CALL 000 Ao analisar o resultado acima, obtemos as seguintes informações: A função U_MYPROFILE levou 21 .,859 segundos para ser executada, onde 10 .,938 foram usados com a chamada da função DOSOMETHING, chamada da função U_MYPROFILER, na linha 11 do fonte MYPROFILE.PRW ... 6 .,562 segundos foram gastos com a função MsgInfo() (como é uma função de Interface, ela contabiliza o tempo que ficou esperando uma ação de usuário), 4 .,359 segundos com a função MsgYesNo(), a função seconds() foi chamada 2 vezes. Existem funções que ainda não são contempladas pelo LogProfiler, são funções atômicas e extremanenteextremamente rápidas, mas a utilização das mesmas ainda não é reportado pelo Profiler, esta implementação está em avaliação. São elas:
Como interpretar as informações geradas pelo ProfilerUma vez obtido um log de profiler com as informações para análise, por ser um log que pode ser muito grande e completo, a análise das informações geradas para a tomada de decisão e identificação de gargalos ou pontos críticos deve seguir um roteiro pré-determinado. Inicialmente, deve-se identificar onde é gasto aproximadamente 80% do tempo de processamento, sempre começando pelas funções básicas da linguagem (funções identificadas no profiler como “Internal”). Depois, verificar dentro das funções identificadas, começando pela que consome maior tempo, se existem diferenças de tempo significativas nas chamadas de acordomacordo com a origem e/ou se existem pontos que chamam muitas vezes a mesma função. Nas análises iniciais feitas com este recurso em diversos fontes, algumas ocorrências comuns foram identificadas, sendo:
Continuando a análiseBaseado nas informações obtidas nas chamadas de funções básicas, caso não haja nenhuma divergência e/ou aparentememteaparentemente está tudo “rapidinho”, onde nenhuma das funções internas sobressai, isto é, o tempo total de processo está bem distribuído entre diversas funções, que executam rápido, a próxima etapa de análise é na lógica do programa, e nas funções do repositório chamadas no processo. Esta etapa é um pouco mais complexa, pois as alterações podem ter impacto em outros pontos do sistema, e requer conhecimento amplo nos fontes envolvidos. Neste momento, a pergunta é:“ --- Existe forma de chegar ao mesmo resultado chamando menos instruções?” . Verificando no log gerado, temos a rastreabilidade da origem da chamada de uma determinada função, então conseguimos navegar na árvore de execução buscando no log quem chamou quem, e quantas vezes. Nesta análise, também partimos das funções básicas, por exemplo uma DBSkip(), que foi chamada 2830 vezes, e consumiu tempo total de 1,197 segundos. Estamos olhando um trace de um Web Service de atualização de um registro na base de dados ... estamos falando de um, apenas um registro. Como a atualização de um registro fez 2.830 DBSkip(), distribuídos em 25 pontos de chamada? CALL dbskip(Internal) C 2830 T 1.197 M 0.016--
CALL FTABPADRAO(PONXFUN.PRX) C 269 T 3.633 M 0.032-- FROM BLDCALTNOSEQ (PONXFUN.PRX) (2707) C 77 T 0.031 M 0.016-- FROM FTABTURNO (PONXFUN.PRX) (5031) C 192 T 3.602 M 0.032
,63 segundos para 0 .,27 segundos. Em um processo de 10 segundos, onde uma chamada de 3,6 segundos é reduzida para 0,3 segundos, o tempo total é reduzido de 10 para 6 .,7 segundos, houve uma redução de 33 % no tempo total.
Dicas importantes
|
Aviso | ||
---|---|---|
| ||
Importante, ao habilitar o LogProfiler alguns comportamentos indesejados podem surgir. São eles:
|