Apache & Tomcat

10 respostas
dreamspeaker

Pessoal,

Tenho um ambiente Tomcat 5.0.27 / Apache 2 utilizando jk2. Esse cara tem pouco mais de 100 clientes, executando consultas leves e cadastros. O que vem ocorrendo é que nesses ultimos dias, no fim da tarde, o Tomcat simplesmente pára de responder, necessitando ser reiniciado.

Não há informação muito útil nos respectivos logs no momento dessa “queda”. O que eu achei estranho, na verdade, é o log gerado no startup do Tomcat:

[Tue Feb 99 99:99:99 9999] (error ) [jk_shm.c (105)] shm.create(): error creating shm 2 No such file or directory [Tue Feb 99 99:99:99 9999] (error ) [jk_shm.c (178)] shm.create(): error creating shm /xxx/yyyy/jk2.shm

O diretório /xxx/yyyy existe, e tbém existe um arquivo jk2.shm (com data antiga) lá. Não é problema de permissão, pois o erro ocorre mesmo startando como root.

Eu dei uma caçada na net, e vi que esse tal shm diz respeito a memória compartilhada. Eu não sei são problemas relacionados, mas de qualquer forma preciso de ajuda nas duas coisas.

Então, em resumo:

  • alguma idéia de porque um tomcat pode parar de responder sem jogar nenhum log?
  • como eu resolvo esse problema do shm?

A minha vontade é desmontar tudo e montar do zero, pq não fui eu que configurei, e quem o fez, não deixou nada documentado e nem está mais aqui. Mas como isso está em produção, fica inviável por ora.

Valeu

10 Respostas

Luca

Olá

Aqui usamos Apache 2.0.5x + 2 tomcats (tomcat 4.1.31 e tomcat 5.0.28). Meu workers2.properties está assim:

. . . . . . . . . . . . . .
# ----------------------------------------------------------------------------
# Shared memory descriptor. Trata-se do arquivo a ser usado no mecanismo de memoria compartilhada. Usei 1 Mb (tirei pois está deprecated)
[shm:]
info=Scoreboard. Required for reconfiguration and status with multiprocess servers
#Name of the file that will be mmapped to use as shared memory, If set to 'anonymous' use the anonymous shered memory
file=/usr/local/apache2/logs/jk2.shm
#Deprecated. Size of the file
#size=1048576
debug=0
disabled=0

. . . . . . . . . . . . . . . . . . . .

Como aqui não dá problema, veja se isto o ajuda.

[]s
Luca

dreamspeaker

hmm… o meu tem algumas diferenças, vou alterar e fazer alguns testes.

Valeu, Luca!

dreamspeaker

Consegui tirar o erro do shm (parece que o arquivo estava protegido de alguma forma, pois foi só movê-lo que funcionou), mas meu tomcat ainda está instável.

A pouco, defini valores para as opções -Xms e -Xms do startup, e tbém adicionei a opção -server. Não tinha nada disso, vamos ver se estabiliza.

Andei dando uma pesquisada aqui no guj mesmo, e vi um outro post seu, Luca, que você dizia ter utilizado o tomcat 5.0.27 e havia dado pau. Pois é justamente essa versão que está rodando aqui. O que aconteceu no seu caso?

Valeu

Luca

Olá

Não me lembro mais qual erro mas na época voltei para o 5.0.25. Atualmente uso o 5.0.30 sem problemas.

O que exatamente ocorre de errado com seu tomcat?

[]s
Luca

dreamspeaker

Ele anda parando de responder em momentos de pico!

Não gera log, não acontece nada. Simplesmente para de responder.

Reinicio, e fica tudo bem.

Luca

Olá

Pode ser que sua aplicação esteja com memory leaks, isto é, com alguns objetos grandes esquecidos. E habilite todos os logs (enfie debug = 5 no server.xml e no web.xml) pois podem haver outras causas destes travamentos.

[]s
Luca

dreamspeaker

Memory leaks é uma grande possibilidade.

Existe algum tipo de “scan” da memória virtual para identificar esses objetos, ou só debugando a aplicação, mesmo?

Valeu!

Luca

Olá

Profilers open source (alguns são plugins para o eclipse):
http://www.manageability.org/blog/stuff/open-source-profilers-for-java

Há muitas opções além destes e do JavaTM Virtual Machine Profiler Interface (JVMPI). A maioria não é free, mas vc pode baixar um trial e resolver seu problema. Na verdade usar profillers não é nada fácil. Eu já usei e fiquei meio perdido dentro de um monte de informações. Mas eu espero qie vc tenha melhor sorte do que eu.

Veja:
http://www.javareference.com/downloads/viewdownload.jsp?id=00000022

http://www.yourkit.com

http://www.physics.orst.edu/~bulatov/HyperProf/ (free)

http://profiler.netbeans.org/index.html (free, está na lista do manageability.org)

http://www.alphaworks.ibm.com/tech/heapanalyzer (free)

E analise suas conexões com o banco de dados. Coloque um log para ver se está retornando ao pool (ou fechando) tudo direitinho.

[]s
Luca

dreamspeaker

Obrigado, Luca!

Na verdade, depois do ultimo post eu fiz o que deveria ter feito antes de perguntar, dar uma Googleada… :oops:

Acabei chegando em alguns destes links, e a coisa parece meio chata de manusear, mesmo!

Mãos a obra!

Valeu!

dreamspeaker

Realmente utilizar um profiler foi uma boa idéia. Eu baixei um cara chamado JProbe. Ele não me mostra o que eu realmente queria ver, que era quais objetos estão em memória, mas me dá um gráfico de utilização da heap (que parece uma versão gráfica da opção -verbose:gc) e a sequencia de “chamada” dos objetos, e quem chamou quem, quantas vezes, de forma gráfica. Apenas isso já me fez identificar a utilização de uma classe (que fazia IO) sem necessidade.

Com esse programa, apareceu outra duvida. O gráfico de utlização da memória me dá dois indicadores, a memória alocada e a memória utilizada. Utilizando Tomcat 5.0.28 e j2sdk 1.4.2_04 (NT Workstation), apenas inicializando o tomcat, sem fazer nada, o gráfico mostra uma memória alocada estável e a memória utilizada em uma curva ascendente. Essa curva chega no limite alocado, o limite é reajustado para cima, e a curva de utilização volta abaixo (como se tivesse sido executado um GC).

A pergunta é: é normal essa curva de utilização ser crescente, mesmo eu não estando com nenhuma sessão inicializada? Isso é coisa do tomcat?

Valeu

Criado 15 de fevereiro de 2005
Ultima resposta 28 de fev. de 2005
Respostas 10
Participantes 2