Limite do balanceador de carga do Apache com o Tomcat sobre a AJP

5

Eu tenho o Apache agindo como um balanceador de carga na frente de 3 servidores Tomcat. Ocasionalmente, o Apache retorna 503 respostas, o que eu gostaria de remover completamente. Todos os 4 servidores não estão sob carga significativa em termos de CPU, memória ou disco, então estou um pouco inseguro sobre o que está atingindo seus limites ou por quê. 503s são retornados quando todos os trabalhadores estão em estado de erro - o que quer que isso signifique. Aqui estão os detalhes:

Configuração do Apache:

<IfModule mpm_prefork_module>
  StartServers           30
  MinSpareServers        30
  MaxSpareServers        60
  MaxClients            200
  MaxRequestsPerChild  1000
</IfModule>

...

<Proxy *>
  AddDefaultCharset Off
  Order deny,allow
  Allow from all
</Proxy>

# Tomcat HA cluster
<Proxy balancer://mycluster>
  BalancerMember ajp://10.176.201.9:8009 keepalive=On retry=1 timeout=1 ping=1
  BalancerMember ajp://10.176.201.10:8009 keepalive=On retry=1 timeout=1 ping=1
  BalancerMember ajp://10.176.219.168:8009 keepalive=On retry=1 timeout=1 ping=1
</Proxy>

# Passes thru track. or api.
ProxyPreserveHost On
ProxyStatus On

# Original tracker
ProxyPass /m  balancer://mycluster/m
ProxyPassReverse /m balancer://mycluster/m

Configuração do Tomcat:

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
          unpackWARs="true" autoDeploy="true"
          xmlValidation="false" xmlNamespaceAware="false">
    </Engine>
  </Service>
</Server>

Log de erros do Apache:

[Mon Mar 22 18:39:47 2010] [error] (70007)The timeout specified has expired: proxy: AJP: attempt to connect to 10.176.201.10:8009 (10.176.201.10) failed
[Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disabling worker for (10.176.201.10)
[Mon Mar 22 18:39:47 2010] [error] proxy: AJP: failed to make connection to backend: 10.176.201.10
[Mon Mar 22 18:39:47 2010] [error] (70007)The timeout specified has expired: proxy: AJP: attempt to connect to 10.176.201.9:8009 (10.176.201.9) failed
[Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disabling worker for (10.176.201.9)
[Mon Mar 22 18:39:47 2010] [error] proxy: AJP: failed to make connection to backend: 10.176.201.9
[Mon Mar 22 18:39:47 2010] [error] (70007)The timeout specified has expired: proxy: AJP: attempt to connect to 10.176.219.168:8009 (10.176.219.168) failed
[Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disabling worker for (10.176.219.168)
[Mon Mar 22 18:39:47 2010] [error] proxy: AJP: failed to make connection to backend: 10.176.219.168
[Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state
[Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state
[Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state
[Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state
[Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state
[Mon Mar 22 18:39:47 2010] [error] proxy: BALANCER: (balancer://mycluster). All workers are in error state

Balanceador de carga top info:

top - 23:44:11 up 210 days,  4:32,  1 user,  load average: 0.10, 0.11, 0.09
Tasks: 135 total,   2 running, 133 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.1%us,  0.2%sy,  0.0%ni, 99.2%id,  0.1%wa,  0.0%hi,  0.1%si,  0.3%st
Mem:    524508k total,   517132k used,     7376k free,     9124k buffers
Swap:  1048568k total,      352k used,  1048216k free,   334720k cached

Tomcat top info:

top - 23:47:12 up 210 days,  3:07,  1 user,  load average: 0.02, 0.04, 0.00
Tasks:  63 total,   1 running,  62 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.8%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2097372k total,  2080888k used,    16484k free,    21464k buffers
Swap:  4194296k total,      380k used,  4193916k free,  1520912k cached

Catalina.out não possui mensagens de erro.

De acordo com o status do servidor do Apache, parece estar chegando ao limite de 143 solicitações / seg. Acredito que os servidores suportem substancialmente mais carga do que eles, portanto, quaisquer sugestões sobre limites padrão baixos ou outras razões pelas quais essa configuração seria maximizada seriam muito apreciadas.

    
por Peter Sankauskas 27.03.2010 / 00:59

7 respostas

7

A solução para esse problema é bem simples:

adicione ao Proxypass:

Ajudante do BalancerMember: //10.176.201.9: 8009 keepalive = Ativado ttl = 60

adicione ao Tomcats Server.xml:

Porta do conector="8009" protocolo="AJP / 1.3" redirectPort="8443 connectionTimeout=" 60000 "

Após essas alterações, tudo deve funcionar bem: -)

    
por 24.04.2010 / 09:42
1

Dado que o log do Apache ilustra que ele não pode se conectar ao Tomcat (a partir do seu log de erros), parece que é o aplicativo Tomcat que não consegue acompanhar.

Quando eu estava trabalhando como administrador de sistemas para um site grande do Tomcat, notei severas restrições de desempenho, e eles não estavam à altura da CPU, mas problemas de sincronização entre threads ou atrasos na consulta de um serviço da Web de back-end. / p>

O último foi um grande problema porque a popular interface Java HTTP limita o número de conexões simultâneas a outro servidor da web para 2 por padrão (quando descobri que meu queixo caiu). Consulte o link

O seu aplicativo da web chama qualquer outro serviço da web?

    
por 30.03.2010 / 00:50
1

Parece que o Apache está obtendo um tempo limite de conexão conectando-se aos servidores no pool, o que está causando a impossibilidade de atender à solicitação. Seu valor de tempo limite parece MUITO baixo, latência de rede intermitente ou até mesmo uma página que leva um pouco mais de tempo para ser gerada, pode fazer com que o servidor caia fora do pool. Eu tentaria um tempo limite mais alto e tentaria novamente valores, e possivelmente um valor de ping mais alto.

Você também pode considerar mudar para o trabalhador ou event mpm, o fpm do prefork geralmente tem o pior desempenho.

Dedicado software de proxy / balanceador, como o squid , também pode ser uma boa opção.

    
por 29.03.2010 / 05:57
0

Tem suas instâncias de tomcat bloqueadas? Eu testemunhei dois grandes projetos corporativos (diferentes empresas) tomcat sofrem de deadlock - um foi causado por uma versão mais antiga de uma biblioteca de terceiros que está sendo usada.

Você ainda pode se conectar diretamente a uma instância do tomcat localmente? Isso é:

telnet localhost 8080

Em seguida, digite:

GET / HTTP/1.0\n
\n

(onde \n refere-se à chave < enter >).

Se não, então, parece que sua instância do tomcat morreu ou está em deadlock. Se estiver com deadlock, é hora de obter um dump de pilha de sua instância java tomcat usando o programa jstack (com o PID do programa java tomcat).

    
por 29.03.2010 / 12:09
0

PAS,

Eu não vi o valor de tempo limite no log do Apache que você colou. Se for 300, tente alterá-lo para 1200. Tivemos o mesmo problema e alteramos o tempo limite no arquivo Apache httpd.conf de 300 para 1200 corrigido.

    
por 18.03.2011 / 20:44
0

Eu enfrentei exatamente o mesmo problema. Pegue um dump de thread no momento em que o problema ocorrer, você saberá qual encadeamento está sendo bloqueado e, portanto, bloqueando outros encadeamentos também. Enquanto isso, todos os portos AJP são usados e eventualmente o Apache morre. Mas esse problema não tem nada a ver com as configurações do Apache. O problema está no aplicativo (nível do tomcat).

    
por 15.03.2013 / 07:06
0

Vamos responder a essa pergunta seis anos depois = D

retry=1 timeout=1 

Esse é o problema. O tempo limite e nova tentativa são muito curtos.

O tempo limite considerará os servidores mortos se eles não responderem dentro de 1 segundo. É muito curto para processar algumas solicitações (especialmente se você estiver fazendo testes de carga a 500 req / s).

Observe que, quando um servidor é desativado, os dois servidores deixados recebem + 50% de solicitações e seu tempo de resposta aumentará significativamente, até o ponto em que eles provavelmente também receberão o tempo limite instantaneamente. Falha em cascata típica.

Você recebe 503 "Serviço Indisponível" porque todos os servidores são considerados mortos pelo Apache, porque eles não respondem rápido o suficiente sob carga, porque o tempo limite é muito curto.

Remova as duas configurações. De um modo geral, NUNCA configure um tempo limite inferior a 5 segundos em qualquer lugar.

    
por 23.01.2017 / 14:08