Diga ao Tomcat para descartar pedidos em vez de morrer “Todos os threads (150) estão ocupados no momento”

3

Meu Tomcat 6.0.26 às vezes morre dizendo:

SEVERE: All threads (150) are currently busy, waiting. Increase maxThreads (150) or check the servlet status

... então o Tomcat é desligado e os usuários não podem acessar o webapp até que eu reinicie o Tomcat manualmente.

Alguns dos threads levam muito tempo para serem executados, é por design, não é um problema muito difícil.

Eu sei que posso aumentar maxThreads, mas isso não é uma solução viável, porque o servidor pode receber solicitações ainda mais.

PERGUNTA: Em vez de morrer, posso dizer ao Tomcat para soltar as solicitações quando maxThreads é alcançado e o backlog da AJP / 1.3 está cheio?

Abaixo está meu server.xml em qualquer caso:

<?xml version='1.0' encoding='utf-8'?>
<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" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" minSpareThreads="100"/>
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
               enableLookups="false" useBodyEncodingForURI="true"
               backlog="150" maxThreads="150" executor="tomcatThreadPool"
               keepAliveTimeout="5000" connectionTimeout="300000" />
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="ecm1">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
      </Host>
    </Engine>
  </Service>
</Server>
    
por Nicolas Raoul 02.07.2012 / 07:52

1 resposta

2

O Tomcat não falha apenas porque os encadeamentos estão no máximo. Ele enfileira solicitações para o limite definido em acceptCount e, em seguida, recusa solicitações se maximiza.

    
por 03.07.2012 / 01:11