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