Como evitar que o Tomcat responda devagar, tornando o Apache lento para responder?

7

Eu tenho um site que consiste principalmente em páginas HTML estáticas com pedidos ocasionais de ajax. O site está sendo executado no Apache, o ajax é manipulado pelo Tomcat.

Se o Tomcat ficar lento para responder (o java não pode se conectar a um servidor de banco de dados ou levar muito tempo para processar uma solicitação por qualquer motivo) - ele desativa todo o site: todas as páginas HTML está demorando muito para load (mesmo com imagens, css, js).

Agora, se eu parar o Tomcat apenas manualmente, tudo ainda está funcionando bem - o site é rápido e ágil, apenas as solicitações de ajax não estão funcionando.

Como posso fazer com que o Tomcat responda devagar para não usar todos os recursos do Apache, portanto, as páginas estáticas sempre funcionariam, independentemente do que estivesse acontecendo com o Tomcat? Páginas html responsivas são muito mais importantes do que não trabalhar ajax no meu caso.

link :

Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule prefork.c>
StartServers       16 
MinSpareServers   10 
MaxSpareServers   40
ServerLimit      512 
MaxClients       512
MaxRequestsPerChild  4000
</IfModule>

workers.properties

worker.worker1.port=8888
worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

server.xml

 <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8081" />

<Connector port="8888" scheme="http" protocol="AJP/1.3" redirectPort="8889" minSpareThreads="100"  maxThreads="400" connectionTimeout="20000" acceptorThreadCount="2"/>
    
por serg 20.07.2012 / 19:30

2 respostas

8

se, por alguma razão, o tomcat não tratar seus pedidos de ajax rapidamente, isso reduz o número de pedidos que o seu apache pode manipular. O Tomcat está configurado para lidar com 400 solicitações em paralelo, e há também um padrão acceptCount de 100. Assim, seu tomcat pode consumir 500 solicitações - pelo menos: jvm e dependente de plataforma, pode haver ainda mais solicitações de conexão enfileiradas.

worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

.. diz ao mod_jk para esperar cerca de 1.7 dias (socket_timeout está em segundos) para operações de socket e 2 minutos para pacotes de redes simples do tomcat. Você deve ajustar esses valores, para deixar o mod_jk retornar um erro o mais cedo possível se o tomcat estiver lento.

Vamos supor que suas solicitações de ajax sejam normalmente processadas em um segundo com outliers de até dois segundos. Depois de ser processado, a resposta é enviada de volta de uma só vez. Então pode-se definir worker.worker1.reply_timeout=2500 , apenas meio segundo mais. socket_timeout pode até ser omitido, pois é apenas um valor bruto. socket_connect_timeout , que define quanto tempo levará para conectar do apache / mod_jk ao tomcat deve ser adicionado ao worker.properties e definido como um valor muito baixo, por exemplo, 100. como ambos se sentam no mesmo servidor. Consulte O conector do Apache Tomcat - Referência para obter mais detalhes.

Cada solicitação, que vai do apache ao tomcat, conta o que você configurou com MaxClients no httpd.conf. Quanto mais pedidos estão presos no tomcat, menos pode ser processado pelo apache para conteúdo estático. Se você desligar o tomcat nessa situação, o conteúdo estático será entregue rapidamente novamente, já que libera recursos para o processamento de pedidos no mod_jk e no apache.

Você configurou prefork.c e worker.c no httpd.conf ao mesmo tempo. Eu acho que prefork.c é o ativo, como MaxClients está definido para 512 e isso corresponderia às suas observações e à minha interpretação ..;)

Digitar o mod_jk para desistir mais cedo dos pedidos de longa duração para o tomcat pode ajudar muito, mas você também deve pensar em ajustar o número de pedidos do cliente manipulados pelo apache ( MaxClients ) e o número de pedidos que o tomcat processa ( <connector maxThreads=... ) em paralelo. Esses números devem ser equilibrados com o que acontece durante as operações normais. Algum rastreio de carregamentos de página pode ser útil para ver em que proporção esses valores devem estar. O valor absoluto depende das especificações dos servidores, da situação da rede, do número de clientes, etc.

Se o número absoluto de possíveis solicitações paralelas for baixo, os usuários reclamarão sobre cargas de páginas lentas, enquanto você não verá seu servidor com capacidade. Se for muito alto, ele usará mais memória do que o realmente necessário, até mesmo diminuirá a velocidade e não se recuperará rapidamente de problemas com sub-sistemas - por exemplo, o banco de dados. Se o apache enviar muito mais solicitações para o tomcat, pois ele será processado a tempo, você verá algumas delas expirando enquanto outras são processadas em um tempo aceitável. Começar com valores semelhantes no apache e no tomcat não é uma má idéia, desde que as configurações de tempo limite garantam que um tomcat lento ou sem resposta não seja uma pedra no pescoço do apache.

    
por 20.07.2012 / 21:09
0

Você parece ter definido apenas um trabalhador. Isso significa que o Apache só pode falar com o Tomcat por meio dessa instância. Uma configuração JK normal contém 8 a 16 trabalhadores. Dê uma olhada no arquivo de configuração JK padrão, que você pode baixar.

    
por 21.07.2012 / 07:20