web-dev-qa-db-ja.com

応答が遅いTomcatがApacheの応答を遅くするのを防ぐ方法は?

私は、時々ajaxリクエストがある静的なHTMLページで主に構成されるサイトを持っています。サイトはApacheで実行されており、ajaxはTomcatによって処理されます。

Tomcatの応答が遅くなった場合(Javaがデータベースサーバーに接続できない、または何らかの理由でリクエストの処理に時間がかかる)-サイト全体がダウンします。すべての静的HTMLページの読み込みに非常に長い時間がかかります(同じです)画像、CSS、JS)。

ここで、Tomcatを手動で停止しただけでは、すべてが正常に機能しています。サイトは高速で応答性が高く、ajaxリクエストだけが機能していません。

応答の遅いTomcatがすべてのApacheリソースを使用しないようにするにはどうすればよいですか?したがって、静的ページはTomcatで何が起こっていても常に機能しますか?応答性の高いhtmlページは、私の場合、ajaxを機能させないことよりもはるかに重要です。

httpd.conf

Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule prefork.c>
StartServers       16 
MinSpareServers   10 
MaxSpareServers   40
ServerLimit      512 
MaxClients       512
MaxRequestsPerChild  4000
</IfModule>

workers.properties

worker.worker1.port=8888
worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

server.xml

 <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8081" />

<Connector port="8888" scheme="http" protocol="AJP/1.3" redirectPort="8889" minSpareThreads="100"  maxThreads="400" connectionTimeout="20000" acceptorThreadCount="2"/>
7
serg

何らかの理由でTomcatがajaxリクエストを高速に処理しない場合、Apacheが処理できるリクエストの数が減少します。 Tomcatは400リクエストを並行して処理するように設定されており、デフォルトのacceptCountには100もあります。そのため、Tomcatは500リクエストを消費できます。 。

worker.worker1.reply_timeout=120000
worker.worker1.socket_timeout=150000

..tells mod_jkは、ソケット操作で約1.7(socket_timeoutは秒単位)、Tomcatからの単一ネットワークパケットで2分間待機します。 Tomcatが遅い場合にmod_jkができるだけ早くエラーを返すように、これらの値を調整する必要があります。

Ajaxリクエストが通常2秒以内の外れ値で1秒以内に処理されると仮定します。 beeingが処理された後、応答はすぐに返送されます。次にworker.worker1.reply_timeout=2500を設定できます。 socket_timeoutは大まかな値なので、省略されることもあります。 socket_connect_timeoutは、Apache/mod_jkからTomcatに接続するのにかかる時間を定義し、worker.propertiesに追加して、非常に低い値に設定する必要があります。 100.両方が同じサーバー上にあるため。詳細は Apache Tomcat Connector -Reference を参照してください。

ApacheからTomcatに送信されるすべてのリクエストは、MaxClientsin httpd.confで構成したものをカウントします。 Tomcatでスタックされる要求が多いほど、静的コンテンツのApacheによる処理が少なくなる可能性があります。その状況でTomcatをシャットダウンすると、静的コンテンツが再び高速で配信されます。これにより、mod_jkおよびApacheでのリクエスト処理のためにリソースが解放されます。

Httpd.confでprefork.cworker.cを同時に設定しました。 MaxClientsが512に設定されているので、prefork.cがアクティブだと思います。これは、あなたの観察と私の解釈に一致します。;-)

Tomcatへの長時間実行されるリクエストを早期に中止するようmod_jkに指示することは大きな助けになるかもしれませんが、Apacheが処理するクライアントリクエストの数(MaxClients)とTomcatが処理するリクエストの数(<connector maxThreads=...)並列。これらの数値は、通常の操作中に何が起こるかとバランスを取る必要があります。ページの読み込みを追跡すると、これらの値の比率を確認するのに役立ちます。絶対値は、サーバーの仕様、ネットワークの状況、クライアントの数などによって異なります。

可能な並列リクエストの絶対数が少なすぎると、サーバーの処理能力が不足しているのに、ページの読み込みが遅いことに不満が出ます。それが高すぎる場合、実際に必要なメモリより多くのメモリを使用し、速度が低下するだけでなく、サブシステムの問題から迅速に回復できません。データベース。 Apacheが時間内に処理するよりもはるかに多くの要求をTomcatに送信すると、一部の要求がタイムアウトになる一方で、他の要求は許容時間内に処理されることがわかります。 ApacheとTomcatで同様の値を使用して開始することは、タイムアウト設定により、遅いまたは応答しないTomcatがApacheの首の障害となることがない限り、問題ありません。

8
Arne

ワーカーを1つだけ定義したようです。つまり、Apacheはその1つのインスタンスを介してのみTomcatと通信できます。通常のJK構成には8〜16個のワーカーが含まれます。ダウンロードできるデフォルトのJK構成ファイルを見てください。

0
user207421