Clique aqui para ler esse artigo em PDF.
Controle Total sobre o Tomcat
Use o Lambda Probe para analisar a execução em tempo real
Conheça o Lambda Probe, uma ferramenta open source para o gerenciamento remoto e o monitoramento em tempo real do Apache Tomcat
Em aplicações Java EE, confiabilidade, disponibilidade, escalabilidade e desempenho são pré-requisitos fundamentais. O ambiente de execução destas aplicações, que possui como pilar central um servidor de aplicações Java EE como o JBoss ou, no mínimo um container web como o Apache Tomcat, apresenta relação direta com esses pré-requisitos.
O gerenciamento, o monitoramento e a análise de comportamento do servidor de aplicações ou do container web é tarefa obrigatória, não só a fim de manter o controle sobre ele, mas também para antever e contornar comportamentos anormais que podem se tornar indicadores de bugs ou gargalos nas aplicações.
Neste artigo focaremos no gerenciamento de containers web, especificamente no Apache Tomcat. As ferramentas disponibilizadas na distribuição do Tomcat para este fim (ex. Tomcat Manager), e também no JBoss (JMX Console) são de certa forma limitadas. Apresentaremos como instalar e usar a ferramenta livre Lambda Probe, que oferece facilidades para o gerenciamento remoto, monitoramento em tempo real e análise de comportamento do Tomcat – e que pode efetivamente pode substituir a aplicação de gerenciamento embutida, o Tomcat Manager.
Sobre o Probe
O Lambda Probe (antes chamado de Tomcat Probe) é distribuído sob licença GPL e é um projeto independente do Tomcat. Compatível com versões 5.x e 6 do Tomcat, o Probe oferece suporte às JVMs da Sun e da IBM e à JRockit da BEA. É uma aplicação web, de interface simples, eficaz e bem elaborada (inclusive com recursos em AJAX), sendo acessível a partir dos principais navegadores web.
Instalação e Configuração
A obtenção da versão binária mais recente do Lambda Probe, que durante a elaboração deste artigo era a 1.7b, pode ser realizada a partir da página oficial da ferramenta, na seção Download. Há versões para monitoramente do Tomcat standalone (fora de uma servidor de aplicações) e para o Tomcat embutido no JBoss.
Depois de realizar o download, descompacte o arquivo zip recebido em um diretório qualquer. Será extraído um arquivo probe.war. É este arquivo que deve ser utilizado para o deployment do Lambda Probe no servidor/container que se deseja monitorar. Para este artigo usaremos o Apache Tomcat 5.5 e a Sun JVM 1.5.
Para realizar o deployment automático do Lamba Probe, tanto em plataforma Unix/Linux como Windows, vamos supor que o Tomcat esteja instalado. Será também importante que o Tomcat Manager (http://127.0.0.1:8080/manager/html) esteja acessível, para facilitar a instalação.
Acessando o Tomcat Manager há uma seção WAR file to deploy. Selecione o WAR que foi extraído no passo anterior e clique em Deploy. Após a conclusão, a mensagem de OK será exibida e a aplicação (contexto) probe ficará disponível na listagem de aplicações do Tomcat Manager, o que pode ser visto na Figura 1.
Figura 1. Aplicação Lambda Probe (contexto probe) disponível após deployment
Além da forma “automática” que acabou de ser mostrada, é possível instalar o Lambda Probe “manualmente”. Detalhes sobre esse procedimento são mostrados na seção Installation do site do Lambda Probe.
O acesso ao Lambda Probe será realizado através do navegador web, a partir do endereço http://127.0.0.1:8080/probe. Será solicitada a digitação de um nome de usuário e uma senha.
Papéis de usuários
Para controle de acesso ao Lambda Probe, podem ser definidos papéis (roles) de usuários, com níveis diferentes de permissões. Os papéis são especificados no arquivo tomcat-users.xml, no diretório CATALINA_HOME/conf e atribuídos a usuários, conforme exemplo da Listagem 1.
Listagem 1. Arquivo tomcat-users.xml, definindo os papéis para o Lambda Probe
<?xml version="1.0" encoding="utf-8"?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="probeuser"/>
<role rolename="poweruser"/>
<role rolename="poweruserplus"/>
<role rolename="manager"/>
<role rolename="admin"/>
<user username="tomcat" password="xxyzz" roles="tomcat"/>
<user username="lowprobe" password="prb001" roles="probeuser"/>
<user username="highprobe" password="prb002" roles="poweruserplus"/>
<user username="admin" password="zzyxx" roles="admin, manager"/>
</tomcat-users>
Os papéis que podem ser definidos são:
· manager – Papel pré-definido no Apache Tomcat e o mesmo utilizado para acesso ao Tomcat Manager. Concede acesso irrestrito a todas as funcionalidades do Lambda Probe;
· poweruserplus – Papel com as mesmas permissões do manager, mas sem possibilidade de deployment ou remoção de aplicações ou acesso a checagem rápida (quick check – veja adiante);
· poweruser – Papel similar ao poweruserplus, exceto pelo fato dos seus usuários não poderem reiniciar a JVM;
· probeuser – papel com permissão apenas de “leitura”.
É importante lembrar que, ao definir os papéis, questões de segurança devem ser fortemente consideradas. Isso porque o acesso remoto à ferramenta oferece uma série de recursos que podem interferir diretamente no comportamento das aplicações em execução sob o servidor de aplicações ou container, e até impactar no funcionamento da própria JVM.
Configurações adicionais no Tomcat
Há algumas configurações adicionais no Tomcat que são necessárias para que o Lambda Probe funcione plenamente, com todos os seus recursos.
Uma delas é ativar o agente de gerenciamento e monitoramento remoto JMX. Este recurso está disponível apenas para JVMs compatíveis com o Java SE 5 (ou superior) e é utilizado para o monitoramento de uso de memória pela JVM, e de processamento, memória e swap pelo sistema operacional. Veja como ativá-lo para cada sistema:
· Windows – Acesse Configure Tomcat, selecione a aba Java, na área de texto Java Options, acrescente após a última linha, -Dcom.sun.management.jmxremote, conforme Figura 2.
· Unix/Linux – Adicione a variável de ambiente (ou atualize, caso a mesma já exista) JAVA_OPTS="-Dcom.sun.management.jmxremote". Esta variável pode, por exemplo, ser definida no arquivo de inicialização do Apache Tomcat: CATALINA_HOME/bin/catalina.sh.
Figura 2. Ativando o agente JMX no Apache Tomcat (Windows)
E caso algum dos contextos do Apache Tomcat defina datasources para produção de conexões em um pool, será necessário para o detalhamento e acesso a estes datasources:
· Windows ou Unix/Linux – o JAR da API responsável pela criação do pool, bem como o do driver JDBC utilizado para criação das conexões, deve ser adicionado ao diretório CATALINA_HOME/common/lib.
Na versão atual, o Lambda Probe oferece suporte a datasources Commons DBCP, C3P0 e Oracle.
Recursos
Após a instalação concluída, o Apache Tomcat passa a ser monitorado, em tempo real, pelo Lambda Probe. Independentemente de o usuário estar autenticado ou não na aplicação, as informações são coletadas pela ferramenta e poderão ser visualizadas assim que o usuário acessar os seus recursos.
Aplicações
Ao autenticar-se no Lambda Probe, o usuário visualizará no topo da página o nome do host, o tempo de ativação do container, e a lista de aplicações (em execução ou paradas) sob a instância corrente do Apache Tomcat. Veja um exemplo na Figura 3.
Figura 3. Listagem das aplicações sob a instância do Apache Tomcat
Nesta lista são exibidas informações gerais das aplicações: status, descrição, número de sessões abertas, quantidade de atributos das sessões, quantidade de atributos de contexto, timeout da sessão (tempo de expiração), e também as opções de undeploy e atualização do contexto. Não há nenhuma grande novidade até aqui, já que as mesmas informações também poderiam ser obtidas no próprio Tomcat Manager.
Vamos às novas funcionalidades acessíveis a partir desta tela. Quando se clica no nome da aplicação, uma nova tela será apresentada, agrupando informações detalhadas referentes àquela aplicação, como visto na Figura 4. Primeiramente temos a opção de exibir e realizar buscas entre as sessões criadas e seus tamanhos (em Kilobytes), e também suas informações, como a listagem de todos os seus atributos. O usuário pode também invalidar/encerrar as sessões ativas (mas esta opção deve ser utilizada com cuidado).
Figura 4. Informações detalhadas de uma das aplicações
Outra das funcionalidades oferecidas é a listagem de páginas JSP existentes nas aplicações, e a visualização do código-fonte ao clicar em uma das páginas JSP exibidas na lista. Há ainda a possibilidade de pré-compilação das páginas (para geração dos servlets correspondentes). Além da listagem das páginas JSP, há uma listagem com os servlets mapeados na aplicação e uma série de informações sobre os mesmos.
Um recurso interessante é a visualização e download dos descritores de deployment (web.xml) e de contexto (context.xml) da aplicação.
Por fim, vemos numa barra a percentagem de utilização das conexões JDBC para cada uma das aplicações (desde que as conexões sejam criadas a partir de um datasource).
Datasources
O recurso de monitoramento de datasources é de grande relevância para as aplicações web que fazem acesso a dados. Note que para utilização desse recurso, as configurações mencionadas no tópico “Instalação e Configuração” devem ter sido realizadas.
É possível ter uma visão detalhada das informações de cada um dos datasources definidos, por contexto. Você pode verificar e testar as conexões com a base de dados e, inclusive, acessar um console SQL para execução de consultas.
Como visto na Figura 5, na listagem dos datasources é exibido, para cada uma, o número máximo de conexões, além do número de conexões estabelecidas (no pool) e o número de conexões em uso ou ocupadas. É mostrado ainda um gráfico com o percentual de conexões em uso, em relação ao número máximo permitido.
Figura 5. Visão dos datasources das aplicações sob o Apache Tomcat
Ao clicar no nome de um recurso (resource) específico, você terá acesso à ferramenta de console SQL, conforme mostra a Figura 6. Qualquer tipo de script SQL pode ser executado na base de dados. Há a possibilidade de consultar, incluir, alterar e excluir registros, criar e executar stored procedures, entre outras operações. Pela total liberdade de acesso do usuário do Probe à base de dados, reiteramos que políticas de segurança devem ser sempre consideradas. Neste caso específico, recomendamos que em ambientes de produção o Lambda Probe não seja configurado para a visão e acesso aos datasources.
Figura 6. Acesso ao console SQL via datasource, exibindo resultado de consulta
Deployment
As funcionalidades de deployment do Lambda Probe são uma versão melhorada do recurso de deployment do Tomcat Manager. O Probe permite que uma aplicação já existente no container seja atualizada, sem a necessidade de um undeploy prévio. Pode-se optar também por “limpar” o cache do diretório CATALINA_HOME/work e solicitar a pré-compilação dos JSPs contidos no WAR. (Aqui CATALINA_HOME se refere ao diretório de instalação do Tomcat.)
Logs
Um dos recursos mais úteis do Lambda Probe é o acesso aos logs do container. Principalmente em ambientes de produção, pode haver dificuldade em se obter estes arquivos, que são importantes na identificação de problemas da aplicação e do container. Sem uma ferramenta como o Lambda Probe, seria necessário ter acesso (direto ou através de uma VPN) ao servidor onde o Apache Tomcat está instalado para se chegar até estes arquivos – ou então implementar alguma funcionalidade adicional.
Com o Lambda Probe essas restrições são removidas. A ferramenta permite acesso a todos os logs que estão situados no diretório CATALINA_HOME/logs. O usuário pode tanto fazer o download de um arquivo, como também verificar suas últimas linhas (similar ao comando tail do Unix/Linux), com a exibição automática de qualquer atualização neste arquivo.
Threads
É possível examinar todas as threads da instância do Apache Tomcat, independentemente do seu estado. Pode-se ver a pilha de execução (stack trace) ao se clicar no nome de um determinado item da listagem, como se vê na Figura 7. Ainda, há como se interromper uma thread (mas o próprio Probe aponta os riscos de se tomar esta atitude).
Figura 7. Listagem das threads do Tomcat, exibindo a pilha de execução de uma delas
Clusters
O Lambda Probe também pode ser usado para examinar detalhes de um ambiente de execução onde exista um cluster com várias instâncias do Tomcat. É possível obter dados sobre a estrutura do cluster, além de gráficos representado o tráfego de bytes e as requisições recebidas e respostas enviadas. É mostrada também uma listagem dos nós componentes do cluster, com informações como IP, status, número de requisições atendidas, entre outras.
Na edição 29 da Java Magazine, há um artigo apresentando o conceito de clusters e demonstrando como construí-los e configura-los, a partir do Apache Tomcat e o Apache HTTP Server.
Informações do sistema
O recurso de informações do sistema é certamente um dos mais úteis e interessantes dentro do Lambda Probe. A partir das informações do sistema é possível verificar e analisar uma série de atributos relacionados ao Apache Tomcat, à JVM e ao Sistema Operacional. Estas funcionalidades, no entanto, irão depender do suporte e configuração do agente JMX, como visto anteriormente.
Ao lado direito do painel principal (Figura 8) um menu dá acesso a resumos sobre utilização de memória, informações do SO e do container.
Na opção Memory utilisation são exibidas informações em tempo real, através de uma listagem e gráficos, sobre a utilização de memória por parte da JVM (veja a Figura 9). Mais especificamente, são mostradas informações sobre os diversos espaços de memória da JVM:
· eden space – Espaço inicial reservado à maioria das alocações de objetos, que terão ciclo de vida curto. Componente da chamada young gen (geração jovem);
· survivor space – Espaço secundário (segmentado em duas partes) dedicado aos objetos que ultrapassaram o período de permanência no eden space. Também componente da chamada young gen;
· tenured gen – Espaço para alocação de objetos que terão um ciclo de vida prolongado, onde é superado o tempo limite para permanência na young gen;
· perm gen – É um espaço especial que não faz parte da memória principal da JVM (por isso a identificação como NON_HEAP) e é dedicado a armazenar dados de reflexão da própria JVM, como objetos com informações sobre classes, métodos e memória;
· code cache – É um espaço de menor relevância, utilizado apenas para a compilação e armazenamento de código nativo.
Figura 8. Visão geral das informações relacionadas ao sistema (SO, container e JVM)
Figura 9. Listagem e gráficos de utilização dos segmentos da memória gerenciada pela JVM
Veja mais sobre ferramentas de performance e tuning da JVM, e detalhes sobre coleta de lixo e gerenciamento de memória nos links ao final do artigo.
Há como “sugerir” à JVM a passagem do coletor de lixo nos espaços de memória descritos anteriormente. Mas isso, como sabemos, não garante que toda a memória alocada e não utilizada seja liberada, e nem mesmo que o coletor de lixo seja executado naquele momento.
A opção System Properties exibe uma listagem completa de propriedades relacionadas, também, ao sistema operacional, ao container e à JVM.
A opção OS Information mostra gráficos atualizados em tempo real de dados relacionados ao sistema operacional. Um gráfico apresenta a utilização da CPU, em percentagem, outro mostra a comparação de utilização da memória entre o SO e a JVM e. E um gráfico mostra a utilização da área de swap (em Kb). Todos os gráficos podem ser vistos em uma escala maior – basta clicar sobre eles.
Estatísticas dos conectores
É possível verificar o status e as estatísticas do número de requisições (recebidas e com erro) e o volume do tráfego de bytes, em modo gráfico, relacionadas aos conectores do Tomcat. Isso pode ser visto na Figura 10.
Os conectores verificados são o HTTP/1.1 (não-SSL), que por padrão estabelece conexão na porta 8080, e o JK (ou AJP). Este último é utilizado para integrar e balancear carga de conteúdo estático e dinâmico, de forma transparente, entre o Apache Tomcat e um servidor web como o Apache ou IIS, a partir da porta 8009.
Figura 10. Gráficos estatísticos dos conectores do Apache Tomcat
Checagem rápida
A funcionalidade de checagem rápida (quick check) permite verificar a disponibilidade e a efetividade do Apache Tomcat e das aplicações instaladas nele, a partir de algumas operações críticas.
A checagem rápida é capaz de percorrer todos os datasources disponíveis nas aplicações, indicando falha caso algum destes datasources tenha atingido o limite máximo (100%) de conexões em uso. A checagem também testa se há memória suficiente a ser alocada na JVM, havendo falha caso uma OutOfMemoryException seja lançada. Além disso, são verificas as permissões de I/O (entrada e saída) do Tomcat, através da criação e apagamento de arquivos no diretório CATALINA_HOME/temp (a falha será indicada a partir de uma IOException). São verificadas, ainda, se todas as aplicações estão em execução, sendo apontada uma falha caso alguma esteja parada, por qualquer que seja o motivo.
Conclusões
O Lambda Probe é uma ferramenta relativamente nova e ainda não muito conhecida, mas já oferece um conjunto extenso e útil de recursos, e sua evolução tem sido intensa. O Probe supre às limitações do Tomcat Manager de maneira bastante satisfatória, com ótimos resultados obtidos tanto em ambientes de desenvolvimento, como de produção, nas mais diferentes arquiteturas de processamento e sistemas operacionais. Além disso, é de fácil instalação, não exige configurações complexas e sua utilização é intuitiva. É realmente uma ferramenta importante para quem precisa gerenciar e acompanhar de perto o comportamento das suas aplicações web, podendo ser usada com sucesso como uma substituição completa ao Tomcat Manager.
Links
lambdaprobe.org
Lambda Probe, página oficial
hyperic.com/products/sigar.html
SIGAR, alternativa livre ao Lambda Probe
jinspired.com/products/jxinsight
JXInsight, alternativa proprietária ao Lambda Probe
java.sun.com/javase/technologies/hotspot
Detalhes sobre a JVM
Livros
Pro Jakarta Tomcat 5
Matthew Moodie (Apress)
Guia para administração e configuração básica e avançada do Tomcat.
Java Platform Performance – Strategies and Tactics
Steve Wilson e Jeff Kesselman (Addison-Wesley)
Manual para o desenvolvimento de aplicações de alta performance e escalabilidade, em Java.