Conexões de rede obsoletas para a porta Tomcat AJP

2

Eu tenho o servidor de aplicativos Tomcat conectado ao servidor Apache usando o conector mod_jk. Ambos estão sendo executados em servidores diferentes.

Apache ----- > ------ Firewall ----- > ------ Tomcat

Nos últimos dois dias, estou vendo a contagem de threads no pool de conectores do Tomcat AJP sendo preenchida (100%) E estou vendo erros no servidor Apache.

Etapas da solução de problemas: Eu parei o servidor Apache e executei o seguinte comando no servidor Apache

> netstat -an | grep 8009 | wc -l
0

Depois, executei o mesmo comando no servidor Tomcat e vi várias conexões do Apache até a porta AJP ainda estar no estado estabelecido.

> netstat -an | grep 8009
tcp        0      0 :::8009                     :::*                        LISTEN      
tcp        0      0 ::ffff:192.168.1.75:8009     ::ffff:192.168.10.75:56840   ESTABLISHED 
tcp        0      0 ::ffff:192.168.1.75:8009     ::ffff:192.168.10.75:56838   ESTABLISHED 
---deleted remaining lines----

Eu esperei por 1-2 horas e pude ver que essas conexões obsoletas ainda estão lá.

Tenho as seguintes configurações do Tomcat:

tomcat.maxthreads=200
tomcat.minsparethreads=50
tomcat.maxidletime=10000
tomcat.acceptcount=100

Dump de segmento mostrando os seguintes segmentos:

"ajp-bio-8009-exec-70" daemon prio=10 tid=0x00007fb87c3a1800 nid=0x302b runnable [0x00007fb8605c4000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:152)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at org.apache.coyote.ajp.AjpProcessor.read(AjpProcessor.java:312)
at org.apache.coyote.ajp.AjpProcessor.readMessage(AjpProcessor.java:367)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:118)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
- locked <0x000000051b0a2ee0> (a org.apache.tomcat.util.net.SocketWrapper)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

Eu preciso reiniciar para limpar todas as conexões obsoletas para o Tomcat.

Por favor, ajude-me a resolver este problema. Isso é devido ao problema do servidor? Ou problema Tomcat ou mod_jk.?

    
por ArunS 11.12.2014 / 19:34

1 resposta

3

Por padrão, mod_jk mantém todas as conexões ajp13 abertas indefinidamente, mas não envia keep-keep de atividades pela sessão tcp para o servidor tomcat. Se essa conexão estiver inativa, ela permanecerá aberta. Os firewalls, no entanto, não gostam de sessões ociosas e, após um período de inatividade, interrompem essa conexão. É por isso que a conexão inicial com o aplicativo pode ser interrompida. ajp13 entregará a conexão a uma conexão tcp que está atualmente aberta, mas o firewall eliminou essa conexão.

Experimente adicionar workers.properties , esses parâmetros para cada trabalhador:

worker.ajp13.socket_keepalive=True
worker.ajp13.connection_pool_timeout=300

Em server.xml na seção do conector tomcat ajp13 , adicione o parâmetro connectionTimeout :

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
connectionTimeout="300000" />  

Espero que isso ajude.

    
por 12.12.2014 / 13:21