これを前置きするために、私はインターネット上で解決策を見つけようとしてきました。以下は、いくつかの情報を提供している最新のリンクですが、どれも機能していないようです.
以下に概説する多くの構成変更にもかかわらず、ログに次のように表示されるエラーを防ぐことができませんでした。
[Tue Jan 07 14:56:12.158345 2014] [proxy_ajp:error] [pid 12094:tid 140002805655296] (70007)The timeout specified has expired: AH01030: ajp_ilink_receive() can't receive header
[Tue Jan 07 14:56:12.158409 2014] [proxy_ajp:error] [pid 12094:tid 140002805655296] [client 10.4.65.146:58551] AH00992: ajp_read_header: ajp_ilink_receive failed, referer: http://xxxx/yyy/
[Tue Jan 07 14:56:12.158430 2014] [proxy_ajp:error] [pid 12094:tid 140002805655296] (70007)The timeout specified has expired: [client 10.4.65.146:58551] AH00878: read response failed from 10.4.3.33:8009 (tomcatworkerX), referer: http://xxxx/yyy/
[Tue Jan 07 14:56:12.229559 2014] [proxy_balancer:error] [pid 12094:tid 140002932012800] [client 10.4.230.138:57407] AH01167: balancer://lb: All workers are in error state for route (tomcatworkerX), referer: http://xxxx/yyy/zzz
ダウンしたユーザーには「Server Unavailable」画面が表示されますが、接続は数分後に復元されます。ただし、同じサーバー接続が何度もアップ/ダウンすることがあります。これは、同じユーザーの動作が原因である可能性があります (私はスティッキー セッションを使用しています) が、これを確認することはできませんでした。
私の構成では、AJP 経由で構成された 4 つの Tomcat ワーカーを使用して、Windows 環境で実行されている単一の Apache Web サーバー インスタンスがあります。現在、すべての Tomcat ワーカーは、別のホスト上の Windows でホストされています。
私のシナリオのすべてのホストは、堅牢な運用環境の VM であり、それぞれに専用の複数のコアがあります。
アパッチのバージョン:
Server version: Apache/2.2.22 (Win32)
Tomcat はバージョン 7.0.29 です
各 BalancerMember には、次の構成パラメーターがあります。
keepalive=On timeout=600 ttl=600
現在ネイティブ コネクタ (org.apache.coyote.ajp.AjpAprProtocol) を使用している各 Tomcat インスタンス。
コネクタ構成:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxThreads="450" connectionTimeout="600000" />
アプリケーション自体は、Oracle ojdbc15_g JDBC ドライバー v11.2.0.3.0 を介して Oracle に接続します。
私が観察したこと:
- Tomcat サーバーが Apache からの要求でオーバーランしているようには見えません。これは、ログ アクティビティの観察と、jconsole を介したスレッド アクティビティによって強化された Apache Web サーバー サーバー ステータス データによる検証から得られたものです。(実行スレッドの数が、上で設定した制限の近くで増加することはありません)。これは、最大 400 人のユーザーにサービスを提供する内部アプリケーションであり、そのほとんどは同時にオンになっているわけではありません。したがって、負荷は問題になりません。
- スレッドのデッドロックの問題はないようです... jconsoleを使用してTomcatインスタンスをリモートで監視している場合、これを確認するためにajp-apr-8009-exec-#スレッドを見て、ほとんどが待機状態にあります積極的に処理していることがわかります。
- 実行時間の長いリクエストがいくつかあります。中には、上で概説した 600 秒のタイムアウトを超える場合もあります。これは私が現在調査している分野です。リクエストの長さの理由は通常、非常に大きなデータ ストアでの連合検索であり、通常は数秒以内に返されますが、単純に時間がかかります。時間がかかる場合は、通常、ユーザーによるキーワード検索の構成が不十分であり、Oracle が結果を構築する間にかなりの時間ブロックする原因となっています。現在、これをリファクタリングして、request/apr exec スレッドとは別のスレッドで実行するようにしています。実行に 280 秒 (4 分 40 秒) を超える場合は、スレッドを強制終了し、ユーザーにエラーを返します。 ; このようにして、Tomcat がリクエストを処理するのに時間がかかりすぎることを除外できます。
それに対処するために私が現在行っていることに関しては、構成する能力を使い果たしたと感じています(これには、インフラストラクチャではなくソフトウェアの専門家であるため、考えられるすべてのソリューションをオンラインでグーグル検索することが含まれます)..だから私はプラットフォームを切り替えて別の方法を試しています。Linux マシンで Apache Web サーバーを実行し、DNS ラウンドロビンを使用して、ユーザーの一部を Windows ではなく Linux 経由でルーティングしました。これは役に立たないように見えますが、Tomcat ワーカーはまだ同じ Windows ボックスで実行されています。
私は現在、Tomcat アプリ自体を Linux マシンでも起動しています。安定したら (アプリがホストされる唯一のプラットフォームが Windows であるという仮定のために、いくつかの小さなコード変更が必要です)、それを追加します。ワーカーとして、その特定のインスタンスで同じ問題が発生するかどうかを確認します。
他に何もないとしても、長時間実行されるリクエストについての私の疑いが正しい道であることを確認したいと思います。さまざまな構成変更を試みましたが、役に立ちませんでした。