A partir da build 7.00.090818P, o TOTVS Application Server possui um processo dedicado ao monitoramento de memória. Este processo identifica a existência e qual o limite de memória utilizada pela aplicação logo que o serviço é iniciado, além de verificar se foi definido um limite de alocação de memória residente para este serviço no arquivo de configuração (totvsappserver.ini) do TOTVS Application Server. Durante a permanência do serviço ativo, este processo acompanha em intervalos de 1 segundo a memória em uso desta instância do TOTVS Application Server, tomando ações preventivas e registrando informações de análise no log de console. Para isso, é definido um limite de alocação de memória residente, no arquivo de configuração (totvsappserver.ini) do TOTVS Application Server, na chave ServerMemoryLimit=NNNN, da seção [General], onde NNNN é o limite em MB que será considerado. Desta forma, ao atingir 80% do limite de alocação de memória, o sistema registra uma ocorrência de advertência no log de console ([INFO ][SERVER] [MEMORY] Used memory average WARNING), do TOTVS Application Server, indicando que o status do consumo de memória do serviço está em "advertência". Atingindo 90% do limite, uma nova ocorrência de advertência é registrada ([INFO ][SERVER] [MEMORY] Used memory average FATAL), notificando que o status de uso da memória é "fatal" e que as novas conexões do TOTVS Application Server para este serviço foram automaticamente desabilitadas ([FATAL][SERVER] [MEMORY] Used memory OVER SAFE LIMIT. REMOTE CONNECTIONS ARE DISABLED). Uma vez automaticamente desabilitadas, o TOTVS Application Server somente habilitará essas conexões novamente e automaticamente se e quando a condição de utilização da memória voltar para um índice abaixo de 80% do limite. No entanto, caso a alocação de memória continue aumentando, ao atingir e ultrapassar 95% do limite definido, uma nova ocorrência é registrada notificando que o consumo de memória atingiu o nível "crítico" ([INFO ][SERVER] [MEMORY] Used memory average CRITICAL). Essas ações visam evitar que o serviço do TOTVS Application Server chegue a uma condição onde a execução de um programa não consiga mais alocar memória ([FATAL][SERVER] Memory Allocation Failure), pois uma vez que haja efetivamente um falha de alocação, a aplicação pode tornar-se instável e apresentar problemas de congelamento de conexões, access violation, exception stack overflow, memory full, problemas ao baixar o serviço, instabilidade e comportamentos inesperados nas aplicações e programas que ainda estão conectados e em execução neste serviço. No ambiente com balanceamento de carga, onde por qualquer razão um serviço slave do TOTVS Application Server atingiu 90% do limite estabelecido de alocação de memória, este serviço desabilita, automaticamente, as novas conexões do TOTVS SmartClient e o serviço de balanceamento de carga (Master ou Balance) não redicionará nenhuma conexão do TOTVS SmartClient para aquele slave enquanto as conexões estiverem bloqueadas. Desta forma, nenhuma ação é tomada com as conexões que já estão em execução naquele serviço para que continuem o processamento normalmente. Se uma dessas conexões em processamento continuar alocando memória, fatalmente o limite estabelecido atingirá os 100% e, a partir do momento que o sistema operacional não for mais capaz de fornecer memória para o TOTVS Application Server, uma falha de alocação de memória será registrada no log de console do TOTVS Application Server com a informação de "Memory Allocation Failure (XXX Bytes)", onde XXX será a quantidade de memória solicitada que não foi atendida. Este cenário pode apresentar os seguintes comportamentos: - A ocorrência de falha de alocação de memória dispara uma rotina de recuperação de erro, que pode precisar de mais memória inclusive do que a tentativa de alocação. Neste caso, o serviço do TOTVS Application Server fechará, automaticamente, e derrubará todos os usuários conectados neste serviço interrompendo os processos em andamento. Além de registrar no log de console a seguinte ocorrência:[FATAL][SERVER]APPLICATION SHUTDOWN DUE UNRECOVERABLE MEMORY ALLOCATION FAILURE
Uma falha de recuperação em tratamento de erro de alocação de memória é uma ocorrência irrecuperável e qualquer tentativa de manter o serviço no ar causaria os comportamentos já mencionados anteriormente, como o congelamento das estações e a ação final necessária inevitavelmente seria a parada do serviço para então subí-lo novamente.
- A ocorrência de falha de alocação dispara uma rotina de recuperação, que consegue alocar memória suficiente para tratar a ocorrência. Neste caso, apenas a ocorrência crítica de falha de alocação (Memory Allocation Failure) é registrada e o processo atual que apresentou falha de alocação de memória é finalizada, liberando a memória em uso por este processo. Neste caso, havendo sucesso na geração do log de erro/ocorrência, finalização normal apenas daquele processo e com o tempo as conexões em processo forem finalizadas, quando a ocupação de memória do serviço, do TOTVS Application Server, baixar de 80% do limite, o servidor automaticamente voltará a um status seguro de ocupação de memória e permitirá novas conexões ao serviço.
No entanto, vale ressaltar que, em qualquer um dos cenários descritos, onde a ocupação de memória de um ou mais serviços do TOTVS Application Server apresentarem um estado de atenção (WARNING) ou bloqueio automático de conexões, deve-se buscar mais informações sobre a causa desta ocorrência, pois a reincidência ou agravamento de ocorrências desse tipo, podem comprometer a operabilidade do sistema. Este mecanismo serve para apontar uma possível falha ou mal dimensionamento de ambiente dada a carga de trabalho atual, gerando um registro/log com informações de análise que permitam um diagnóstico mais preciso das ocorrências registradas no TOTVS Application Server. É imprescindível que este log juntamento com o arquivo de configuração (totvsappserver.ini) sejam fornecidos para análise quando da abertura de um chamado.
Novas mensagens no log de console do TOTVS Application Server
[INFO ][SERVER] APP Virtual Address Allocation Limit ....Indica o limite de alocação de memória (MB) por aplicação, conforme determinado pelo sistema operacional. Ao utilizar o TOTVS Application Server em plataformas Windows, os limites podem ser de 2048 MB, 3072 MB ou 4096 MB. Observação: Esta informação é registrada no log de console do TOTVS Application Server quando o serviço é iniciado. [INFO ][SERVER] Memory Monitor Virtual Address LIMIT ....Quando não especificado o limite de memória no arquivo de configuração (totvsappserver.ini), o TOTVS Application Server assume o limite de endereçamento virtual (APP Virtual Address Allocation Limit) como sendo o limite de alocação deste serviço em MB. Observação: Esta informação é registrada no log de console do TOTVS Application Server quando o serviço é iniciado. [INFO ][SERVER] Memory Monitor Resident LIMIT ...........
Quando especificado um limite de memória no arquivo de configuração (totvsappserver.ini), do TOTVS Application Server, o processo de monitoramento irá considerar o limite especificado em MB como limite de memória residente alocado pela aplicação. [INFO ][SERVER] [MEMORY] Used memory average <STATUS>
Dados os limites especificados, quando a alocação de memória do serviço, do TOTVS Application Server, transitar entre um estado e outro, o processo de monitoramento de memória registrará a mensagem no log de console, do TOTVS Application Server, onde <STATUS> indicará a condição do processo (WARNING, FATAL, CRITICAL ou NORMAL), acompanhado dos seguintes dados adicionais. Estes dados são internos da aplicação e servem de base para a análise da ocorrência. Exemplo: Neste exemplo, obtido de uma máquina que utiliza Windows em plataforma 32 Bits, em que foi configurado um limite de 1024 MB (1GB) de memória residente máxima para o TOTVS Application Server, onde o status atual é WARNING: [INFO ][SERVER] [MEMORY] Used memory average <WARNING> (Contadores de processos internos do TOTVS Application Server) ----------- Total Thread Count ------------ Total Threads ... 13 Thread ... 2 WThread ... 9 RmtSockThread ... 1 SockServer ... 1
(Informações de memória de uso global / interno) ----------- Global List Info -------------- IMAP Glb List ... 0.00 KB. Count 0 Variable Glb List ... 0.00 KB. Count 0 Session Glb List ... 0.00 KB. Count 0 SymTab List ... 333.84 KB. Count 19411
(Informações de pools internos de memória do kernel do TOTVS Application Server) ----------- SmartHeap Pools Info ---------- ctSimplePool ... 3.98 Kb. Count 0 ctDtmPool ... 3.98 Kb. Count 0 ctIntervalPool ... 3.98 Kb. Count 0 decimalPool ... 3.98 Kb. Count 0 stringPool ... 2759.30 Kb. Count 173870 rContentPool ... 263.91 Kb. Count 3571 namedVarPool ... 71.95 Kb. Count 17 instrVarPool ... 199.92 Kb. Count 3479 sumPool ... 71.95 Kb. Count 1 comparePool ... 71.95 Kb. Count 2 asnParamPool ... 3.98 Kb. Count 0 localEnvPool ... 71.95 Kb. Count 11 interFCPool ... 71.95 Kb. Count 8 directFCPool ... 71.95 Kb. Count 7 inter4GLFCPool ... 3.98 Kb. Count 0 prgCodePool ... 3719.06 Kb. Count 11539 asnBasePool ... 71.95 Kb. Count 17 ctCodeBlockPool ... 71.95 Kb. Count 100 cctCodeBlockEnv ... 71.95 Kb. Count 2 ctCodeBlockRef ... 71.95 Kb. Count 6 ctCodeBlockInstr ... 71.95 Kb. Count 6 ctAPXmlDocInterfacel ... 3.98 Kb. Count 0 ctClassData ... 135.94 Kb. Count 643 ctAPXmlItem ... 3.98 Kb. Count 0 ctPrgFunctXRefEle ... 199.92 Kb. Count 7464 ctIdentifier ... 71.95 Kb. Count 12 TOTAL POOLED MEMORY ... 8173.36 Kb.
(Resumo de alocação de memória da máquina) ----------- OS Memory Summary ------------- Physical memory . 3315.54 MB. Used 1513.37 MB. Free 1802.17 MB. Paging file ..... 6469.21 MB. Used 1783.86 MB. Free 4685.35 MB. (Resumo de alocação de memória da aplicação)
----------- APP Memory Summary ------------ Service Memory Capacity ... 2047.88 MB. Service Virtual Address ... 1118.72 MB. Service Resident Memory ... 875.47 MB. [INFO ][SERVER] [MEMORY] VMA Avg 0.55 - Peak 1118.72 MB. - SL 2047.88 MB.
[INFO ][SERVER] [MEMORY] RES Avg 0.85 - Peak 875.45 MB. - UL 1024.00 MB. Os dados adicionais apresentam as informações importantes para análise. Observe que, onde houve a mudança de status de alocação de memória para WARNING, temos uma imagem de utilização de memória do equipamento que possui 1802.17 MB de memória física disponível, sendo que o serviço do TOTVS Application Server pode endereçar até 2047 MB de memória e possui 1118.82 endereçada, das quais 875.47 MB são de memória residente, o que corresponde a 85% do limite definido de 1024.00 MB.
[INFO ][SERVER] [<DATE> <TIME>] Shrinking Memory Pools ...Em intervalos de 60 ( sessenta) segundos, contados a partir da subida do TOTVS Application Server, é executado um procedimento automático para reorganizar áreas de memória alocadas para determinados objetos de processamento de uso interno do TOTVS Application Server. Em builds anteriores, esta operação era realizada a cada 3 minutos, sem emitir nenhum tipo de aviso. A partir da build atual, será registrado um log informativo da execução deste processo e, caso a chave DebugThreadUsedMemory, da seção [General], esteja habilitada, esta mensagem será acompanhada do status atual do servidor, que normalmente é apresentada apenas na mudança de status de ocupação de memória.
Para analisar o consumo de memória por processo/conexão, pode-se configurar a chave DebugThreadUsedMemory=1, na seção [General], do arquivo de configuração (totvsappserver.ini) do TOTVS Application Server. A configuração dessa chave nesta nova build, fará com que o processo de monitoramento de memória registre no arquivo de log de console o status e informações sobre o consumo de memória do serviço em intervalos de 1 minuto, a partir do início da execução do serviço. No ambiente Linux, existe um limite de endereçamento virtual de memória, configurado a partir da instrução "ulimit -v", cuja recomendação é que o mesmo esteja ilimitado (ulimit =v unlimited). Neste caso, quando o TOTVS Application Server é iniciado, o mesmo não conseguirá determinar um limite de memória para a aplicação e o monitoramento apenas registrará a quantidade de memória em uso. Desta forma, para definir um limite de memória residente para o engine de monitoramento, deve-se especificar o limite em MB através da chave ServerMemoryLimit, na seção [General], do arquivo de configuração (totvsappserver.ini) do TOTVS Application Server. Além disso, no ambiente Linux, quando da transição de um estado de alocação de memória para outro, as informações sobre o resumo de alocação de memória da máquina são apresentadas de forma diferente da build do TOTVS Application Server para plataforma Windows, mas os dados informados são considerados da mesma forma. |