2012-06-01 9 views
6

Tomcatにデプロイするのに過度の時間がかかるWebアプリケーションがあります。私の疑念は、タイムアウトまで待っているデータベース接続がどこかであるということですが、これは単なる推測であり、何が原因で問題が解決されるのかを確かめたいのです。誰も私がこれを行うことについて行くことができる方法を提案することはできますか? WARを読み込んでいるときにTomcatのプロファイルを作成し、手がかりを探す必要がありますか?もしも初心者のためのチュートリアルがあれば?私のWARをTomcatに展開するのに何が得られるのでしょうか?

この場合、私のWebアプリケーションはSpringとHibernateを使用します。私は、クラスローダがロードする必要のあるクラスの数が激減しているどこかで巨大であるという点で、おそらくこれらが減速を引き起こしているということを同僚から聞いてきました。

私はTomcatを停止したり、熱いすでに実行されているTomcatにWARを展開するときも、私はこれを参照してください。

Jun 1, 2012 6:03:33 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [/nacem-rest] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
Jun 1, 2012 6:03:34 PM org.apache.catalina.startup.HostConfig deployWAR 

はおそらく、これは問題の一部ですか? Webアプリケーションの再デプロイメントには、ほとんどの場合、Tomcatの再起動が必要ですが、私はいつも上記のJDBCドライバの問題は責任があると考えていましたが、起動時間が遅いということもあります。

私はこの種の事について貴重なことはほとんど知っているので、これは学ぶ本当の機会です。あなたの助けを前にありがとう。

答えて

7

プロファイラを使用することはできますが、過剰なオーバーキィです。代わりに、アプリケーションのロード中にスレッドダンプをほとんど作成しないでください。 jstackまたはjvisualvmを使用して、これを行う方法について説明しているネット上のリソースが豊富です。基本的には、TomcatのPIDが必要です(jps参照)。

スレッドダンプの解析が難しい場合は、質問に追加してください。通常、ボトルネックを見つけるのはかなり簡単です。一般的な問題:

  • アプリケーションが
  • XMLスキーマのように、インターネットからCLASSPATH
  • 過度のGCにスキャンするクラスの多くは、いくつかのリソースを取得しようとすると(念の詳細GCログを有効にする)
  • 十分でないメモリ(スワップ、iostat/iotop参照)
3

あなたは(より良い)、いくつかのスレッドが展開中にダンプ取り、それらを分析する必要があります。ブロック、待ちなどを探してください。Thread Dump Analyzerが役に立つかもしれません。

3

私が最初に見るのは、アプリケーション起動時にtomcatのCPUまたはRAMの使用がどのようになるかです。

多くのCPUアクティビティとRAMが増加している場合は、多くのクラスをロードしているか、何らかの巨大な事前割り当てなどを実行している可能性があります。その場合、スレッドダンプは多くの手助けをすることができますが、 "lsof"(もしあなたのTomcatが* nix環境で動いているなら)が現在どのファイルを処理しているのかを知ることができます。

しかし、単純にそこに座っているのを見ると、何らかの接続を待っている可能性があります。

1つの原因として、DB接続が考えられます。通常、DBは応答が速く、DBに接続しようとして失敗した場合は、どこかに明らかにログに記録されますが、依然として可能性があります。

あまり知られていない別の原因として、XMLの検証がある場合があります。 WebアプリケーションがいくつかのXMLデータを読み込むことは珍しくありません。また、XMLをロードするために検証パーサーを使用することも珍しくありません。妥当性検査パーサーは、検証するためにスキーマまたはDTDが必要であり、スキーマ/ DTDファイルのURLがXMLに含まれることがよくあります。そのため、一部のパーサーはXMLファイルの検証のためにインターネットからスキーマファイルをロードしようとしますが、インターネット接続には時間がかかることがあります。さらに、一部のパーサーは静かに失敗し、おそらくかなり長いタイムアウト後にXMLを検証しません。 "いくつかのパーサー"などであいまいになって申し訳ありませんが、XML読み込みがWebアプリケーション内で使用されるライブラリによって行われる場合、JVM XMLパーサー、Xercesの任意のバージョン、JDOMなどの可能なバージョンを使用できます。最悪のライブラリでは異なるパーサーを使用している可能性があります。

しかし、接続に問題がある場合は、 "netstat -anlp | grep java"を使用すると簡単に見えます(Tomcatは* nix環境にあります。そうでなければ、Windowsでは "netstat -ano"あなたのtomcatが作り出そうとしている発信接続を探しています。そこには、DB接続と、スキームやその他のものを探している発信(通常はhttp)接続を見ることができます。

4

Tomcat 7.0.xを使用している場合、注釈を検出するためにクラスパスをスキャンしている可能性があります。 多くのジャー/クラスがある場合は、これが問題になります。

Simoneによると、いくつかのスレッドダンプを採取して分析するのは良い方法です。

最近のバージョンのTomcatを使用していない場合は、&をアップグレードして、conf/catalina.propertiesファイルを調べて、スキャンされるjarファイルの数を減らす方法を調べてください。

0

Tomcat8にWebアプリケーションをデプロイするときに大きな遅延があることがわかりました。 WAR内のcontext.xmlファイルに3つのデータベース接続プールが設定されていました。各接続プールの初期カウントは10コネクションであったため、Tomcatは起動時に30個のデータベース接続を作成していました。テストシステムで1つの初期接続用に各プールを構成すると、展開時間が約3分から22秒に改善されました。

-3

追加は、あなたの作業tomcat7/binディレクトリのsetenv.shにおいて以下:

JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

関連する問題