3つのTomcatサーバーの前で、Apacheがロードバランサーとして機能しています。時々、Apacheが503応答を返しますが、これを完全に削除したいと思います。 4台のサーバーすべてにCPU、メモリ、またはディスクの観点から大きな負荷がかかっていないので、何が限界に達しているか、またはその理由は少しわかりません。すべてのワーカーがエラー状態になると、503が返されます。詳細は次のとおりです。
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
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>
Apacheエラーログ:
[2010年3月22日18:39:47] [エラー](70007)指定されたタイムアウトの期限が切れました:プロキシ:AJP:10.176.201.10:8009(10.176.201.10)への接続の試行に失敗しました [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disableing worker for(10.176.201.10) [Mon Mar 22 18:39:47 2010] [error] proxy:AJP:failed toバックエンドへの接続を確立します:10.176.201.10 [Mon Mar 22 18:39:47 2010] [エラー](70007)指定されたタイムアウトの期限が切れました:プロキシ:AJP:10.176.201.9:8009への接続を試みます( 10.176.201.9)失敗 [2010年3月22日18:39:47] [エラー] ap_proxy_connect_backendが(10.176.201.9)のワーカーを無効にする [2010年3月22日18:39:47] [エラー]プロキシ:AJP:バックエンドへの接続に失敗しました:10.176.201.9 [Mon Mar 22 18:39:47 2010] [エラー](70007)指定されたタイムアウトの期限が切れました:プロキシ:AJP:試行10.176.219.168:8009(10.176.219.168)への接続に失敗しました [Mon Mar 22 18:39:47 2010] [error] ap_proxy_connect_backend disableing worker for(10.176.219.1 68) [2010年3月22日18:39:47] [エラー]プロキシ:AJP:バックエンドへの接続に失敗:10.176.219.168 [2010年3月22日18:39:47 ] [エラー]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です。 [Mon Mar 22 18:39:47 2010] [error]プロキシ:BALANCER:(balancer:// mycluster)。すべてのワーカーがエラー状態です
ロードバランサーtop
info:
トップ-23:44:11最大210日、4:32、1ユーザー、負荷平均:0.10、0.11、0.09 タスク:合計135、実行中2、スリープ133、停止0 0ゾンビ CPU: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、使用済み517132k、空き7376k、9124kバッファ スワップ:合計1048568k、使用済み352k、空き1048216k、キャッシュ334720k
Tomcat top
info:
top-23:47:12 up 210日、3:07、1ユーザー、負荷平均:0.02、0.04、0.00 タスク:合計63、実行中1、スリープ62、停止0 0ゾンビ CPU: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、使用2080888k、空き16484k、バッファ21464k スワップ:合計4194296k、使用380k、空き4193916k、キャッシュ1520912k
Catalina.outにはエラーメッセージがありません。
Apacheのサーバーステータスによると、143リクエスト/秒で最大に達しているようです。サーバーは実際よりもかなり多くの負荷を処理できると思います。そのため、デフォルトの下限や、この設定が最大になるその他の理由についてのヒントがあれば、大いに評価されます。
この問題の解決策は非常に簡単です。
proxypassに追加:
BalancerMember ajp://10.176.201.9:8009 keepalive = On ttl = 6
tomcats Server.xmlに追加します。
コネクタポート= "8009"プロトコル= "AJP/1.3" redirectPort = "8443 connectionTimeout =" 60000 "
これらの変更後、すべてが正常に動作するはずです:-)
Apacheログが、(エラーログから)Tomcatに接続できないことを示している場合、それを維持できないのはTomcatアプリケーションであると思われます。
大規模なTomcat Webサイトのシステム管理者として働いていたとき、パフォーマンスの厳しい制限に気づきました。それらはCPUの問題ではなく、スレッド間の同期の問題またはバックエンドWebサービスのクエリの遅延にありました。
後者は大きな問題でした。人気のあるJava HTTPインターフェースが、別のWebサーバーへの同時接続数をデフォルトで2に制限しているためです(これが私の顎が落ちたことを発見したとき)。参照 http://hc.Apache.org/httpclient-3.x/threading.html
Webアプリは他のWebサービスを呼び出しますか?
Tomcatインスタンスはデッドロックしていますか?私は2つの大規模な企業(異なる企業)のTomcatプロジェクトがデッドロックに苦しんでいるのを目撃しました。
ローカルでTomcatインスタンスに直接接続できますか?あれは:
telnet localhost 8080
次に、次のように入力します。
GET / HTTP/1.0\n
\n
(どこ \n
は<Enter>キーを指します)。
そうでない場合、Tomcatインスタンスが停止またはデッドロックしているように見えます。デッドロックが発生した場合は、jstack
プログラムを使用してTomcat Javaインスタンスのスタックダンプ(TomcatのPID Javaプログラム)。
PAS、
貼り付けたApacheログにタイムアウト値が表示されませんでした。 300の場合は、1200に変更してみてください。同じ問題があり、Apache httpd.confファイルのタイムアウトを300から1200に変更すると修正されました。
この質問に答えましょう、6年後= D
retry=1 timeout=1
それが問題です。 timeoutとretryが短すぎます。
タイムアウトでは、サーバーが1秒以内に応答しない場合、サーバーは停止していると見なされます。一部のリクエストを処理するには短すぎます(特に500リクエスト/秒で負荷テストを行っている場合)。
サーバーがダウンすると、残りの2台のサーバーは+ 50%のリクエストを受信し、応答時間が大幅に増加することに注意してください。典型的なカスケード障害。
タイムアウトが短すぎるため、負荷がかかっても十分な速度で応答しないため、Apacheによってすべてのサーバーが停止していると見なされるため、503「サービスを利用できません」が表示されます。
両方の設定を削除します。一般的に、タイムアウトは5秒未満に設定しないでください。
私はまったく同じ問題に直面しました。問題が発生したときにスレッドダンプを取得すると、どのスレッドがブロックされ、それ以降他のスレッドもブロックされているかがわかります。その間、すべてのAJPポートが使用され、最終的にApacheが停止します。ただし、この問題はApacheの設定とは関係ありません。問題はアプリケーション(Tomcatレベル)にあります。