1

2GBのRAMを搭載したdebian-lennyx64サーバーで、apache2.2とmod_jk1.2.26を使用してtomcat7を実行しています。
サーバーに奇妙な問題があります。数時間ごと、場合によっては(負荷がかかっている状態で)数分ごとに、tomcat ajp-connectorがメモリリークエラーで一時停止しますが、このエラーはシステムの他の部分(たとえば、他の部分)にも影響するようです。実行中のアプリケーションも動作を停止します)&しばらくの間問題を解決するためにサーバーを再起動する必要があります。
catalina.outを数日間チェックしましたが、次のメッセージでajpを一時停止する直前に固有のエラーパターンがないようです。

INFO: Pausing ProtocolHandler ["ajp-bio-8009"]

一時停止する前に、次のメッセージが表示されることがあります。

Exception in thread "ajp-bio-8009-Acceptor-0" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:597)...

&時々これ:

INFO: Reloading Context with name [] has started
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:597)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5482)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:230)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3847)
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:424)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1214)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1400)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1410)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1410)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1389)
    at java.lang.Thread.run(Thread.java:619)
java.sql.SQLException: null,  message from server: "Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug"...

&他の場合には、プログラムの他の部分に関連する出力メッセージ。
アプリケーションのソースコードを確認しましたが、問題が発生することはないと思います。jConsoleを使用してメモリ使用量も確認しました。ワンダーフルポイントは、サーバーに障害が発生すると、ヒープと非ヒープの両方のjvmメモリスペースに大量の空きメモリが表示されることです。前に言ったように、サーバーをクラッシュさせた後、他の多くのアプリケーションも失敗し、それらを再起動したいときに、リソースに一時的に利用できないというメッセージが表示されます(limits.confファイルも確認しました)。
ですから、私はこの深刻な問題と何日も本当に混乱していて、それについてはもう何も考えていません。だから、誰かがこの複雑な&を解決するために私にどんな種類の提案をしてもらえますか?未知の問題???
このエラーの最も考えられる理由は何でしょうか?

4

3 に答える 3

0

プロセス数の制限は何ですか?

uname -aでそれらをチェックし、プロセスの最大数をチェックします。1024の場合は、増やします。

また、起動に使用しているユーザーについても同じことを確認します(たとえば、ユーザーを使用していない場合は、su -c "ulimit -a" -s / bin / sh nobodyを実行して、実際にこれが何であるかを確認します。ユーザーは制限として表示されます)。それはあなたに問題を示すはずです(数日前にそれがあったので、これをチェックするのを完全に逃しました)。

それが起こり始めた瞬間に、「ps -eLf | wc -l」を使用して、そのユーザーの実行中のすべてのスレッドとプロセスをカウントすることもできます(または、rrdtoolなどを使用して監視することをお勧めします)。システムで実行されているすべてのプロセスとスレッドの数。この情報は、すべての特定のユーザーの制限とともに、問題を解決するはずです。

于 2012-11-17T23:17:36.467 に答える
0

jvisualvmを使用して、jvmのヒープ使用量を確認します。ある期間にわたってゆっくりと上昇しているのを見ると、それはメモリリークです。時々、メモリリークは短期的であり、最終的には解消され、再開するだけです。

のこぎりのパターンが表示された場合は、のこぎりのピークの近くでヒープダンプを取得します。それ以外の場合は、JVMが十分に長く実行された後、OOMエラーのリスクが高くなるまでヒープダンプを取得します。次に、その.hprofファイルを別のマシンにコピーし、Eclipse MAT(メモリ分析ツール)を使用してファイルを開き、原因の可能性を特定します。データ構造内の参照を追跡し、Javadocを読んで、制御不能になっているハッシュマップまたはリストを何が使用しているかを把握するために、まだしばらく時間を費やす必要があります。並べ替えオプションは、最も可能性の高い問題領域に焦点を当てるのにも役立ちます。

簡単な答えはありません。

ヒープダンプをトリガーできるSUNjvmに含まれているコマンドラインツールもあることに注意してください。また、メモリリークは通常、頻繁に実行されるコードの一部であり、したがってプロファイラーのホットスポットとして表示されるため、使用できる優れたプロファイラーがある場合。

于 2012-11-22T08:31:56.557 に答える
0

私はついに問題を発見しました。それは実際にはメモリリークではありませんでしたが、VPSで許可されるスレッドの数の制限が問題の原因でした。私のサーバーはデフォルトで256スレッドに制限されているXenvpsでした。そのため、許可されている最大スレッドに達すると、スーパーバイザーは実行中のスレッドの一部を強制終了しました(これが実行中のプロセスの一部を停止させた原因です)。許可されるスレッドの数を512に増やすことで、問題は完全に解決されました(もちろん、Tomcat設定でmaxThreadsを増やすと、問題が再び発生することは明らかです)。

于 2012-11-29T08:00:57.450 に答える