bugfix> linux > 投稿

私はaws m4.xlargeで4 CPU、16 GB RAMのLinuxを信頼しています。 tomcat7およびoracle java 8でJavaアプリケーションを実行しています。

非常に頻繁にアプリがハングし、他の接続を受け入れなくなります。ステータスケーキは、応答がタイムアウトしたためダウンとして報告します。 Datadogは、スレッドが最大化されていることを示します。ただし、CPUの増加はありません(使用率の10%程度)。その期間中、RAMの使用量は変更されません。

Tomcatを再起動するだけで問題が一時的に修正されます(約12時間)。そのため、スレッドダンプを取得し、非常に多くのスレッドが待機状態にあるのを確認しました。これは私にとって非常に新しいので、データについても盲目です。

ここで助けを得て、最終的にスレッドダンプファイルを暗号化する技術をマスターできることを望んでいました。ここに添付し、同様にアップロードしましたfastthread.ioそして、それは問題がないと言います。私も完全にアップロードしましたzerobinのthreadump

ここの誰かがこれについていくつかの光を当てることができれば非常に感謝し、同じ状況の他の人を助けることを願っています。前もって感謝します。

回答 1 件
  • 多くのスレッドは待機状態にあり、それらはまったく問題ありません。たとえば、次のスタックトレースを持つスレッドがあります。

    ...
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
    ...
    
    

    これは、スレッドがタスクの実行を待機していることを意味します。

    ただし、他のスタックは見栄えがよくありません。

    java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at com.mchange.v2.resourcepool.BasicResourcePool.**awaitAvailable**(BasicResourcePool.java:1414)
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606)
    - locked <0x000000055c2d3ce0> (a com.mchange.v2.resourcepool.BasicResourcePool)
    at 
    com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755)
    
    

    これらのスレッドは、プール内で接続が解放されるのを待っています。 C3P0はデータベース接続のプールです。毎回新しい接続を作成する代わりに、それらはプールにキャッシュされます。閉じても、接続自体は閉じられず、プールに戻されるだけです。そのため、何らかの理由で休止状態(または他のユーザー)が解放後に接続を閉じない場合、プールが使い果たされる可能性があります。

    問題を解決するには、使用後に一部の接続が閉じられない理由を見つける必要があります。これを行うには、コードを見てみてください。

    もう1つのオプションは、C3P0(プーリング)を一時的に使用しないことです。これは永遠ではありませんが、少なくともこの推測が正しいかどうかを確認できます。

あなたの答え