web-dev-qa-db-ja.com

「すべてのスレッド(150)は現在ビジーです」と言うのではなく、リクエストをドロップするようにTomcatに指示します。

私のTomcat6.0.26は時々死にます:

重大:すべてのスレッド(150)は現在ビジーで、待機しています。 maxThreads(150)を増やすか、サーブレットのステータスを確認してください

...その後、Tomcatがシャットダウンし、Tomcatを手動で再起動するまでユーザーはWebアプリケーションにアクセスできません。

一部のスレッドは実際に実行に時間がかかります。これは設計によるものであり、スレッドがワイルドな問題ではありません。

MaxThreadsを増やすことができることはわかっていますが、サーバーがさらに多くのリクエストを受信する可能性があるため、これは実行可能なソリューションではありません。

質問: 死ぬ代わりに、 maxThreads に到達し、 AJP/1.3バックログ がいっぱいになったときにリクエストをドロップするようにTomcatに指示できますか?

以下は私のserver.xml とにかく:

<?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>
3
Nicolas Raoul

スレッドが上限に達したからといってTomcatがクラッシュすることはありません。 acceptCount で設定された制限までリクエストをキューに入れ、それが上限に達した場合はリクエストを拒否します。

2
Jason Floyd