2016-08-14 22 views
2

異なるJavaアプリケーションでtc-serverを実行する6つのjavaプロセスを持つLinuxサーバーでは、 このエラーのために:java.lang.OutOfMemoryError:新しいネイティブスレッドメッセージを作成できませんが、多くのスレッドが実行されていません

Exception in thread "ajp-bio-9096-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:714) 
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949) 
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371) 
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:162) 
at org.apache.tomcat.util.threads.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:142) 
at org.apache.catalina.core.StandardThreadExecutor.execute(StandardThreadExecutor.java:169) 
at org.apache.tomcat.util.net.JIoEndpoint.processSocket(JIoEndpoint.java:531) 
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:234) 
at java.lang.Thread.run(Thread.java:745) 

これにより、1台のマシンで実行されている1つ以上のJVMが動作を停止します。 (同じマシン上で6台のtcサーバーを実行しています) Linuxマシン上のプロセスの最大数に達したようです。 最大スレッド数はOS-level is about 31389 (ulimit -u)です。しかし、我々は、私は、オペレーティングシステムを見てみるとプロファイリング/ tcserverを監視するJavaプロセスごとのスレッド数が間に通常で処理すると

(ps -eLF | wc -l) 

を実行している約1500のスレッドがあるのlinux 内のスレッドの過剰な数が表示されません50、150、負荷の下ではhttpスレッドのために を350にすることができますが、これはダウンして、プロセスの最大スレッド数(このマシンでは1000)には達しません。

実行環境は64 bit Java 1.7で、OSには常に空きメモリがあります。

今日、サーバーの起動から1分後にこのメッセージが表示されました。 jvmは動作を停止しましたが、osプロセスは動作し続けました。 このプロセスのスレッド数を見ると、それはそうスレッドの最大数に達しているように見えますが、私たちは、スレッドを実行しているの多くを見ることはありません51.

(ps uH p <pid> | wc -l). 

ました。

+1

「トップ」のキャプチャを取得して、使用されているメモリの量を確認できますか? –

+0

以下を示します:タスク:364合計、1実行中、363スリーピング、0停止、0ゾンビ Cpu(s):9.7%sy、5.9%sy、0.0%ni、83.4%id、0.2%wa、0.0%hi、 0.835%si、0.0%st Mem:8057304k total、7778672k used、278632k free、476752kバッファー スワップ:1048572k総計、0k used、1048572k free、1301448kキャッシュ済み – Edwin

+0

時にはメモリ使用量のグラフを見ると、実メモリとスワップの両方で小さな部分空きメモリ。 – Edwin

答えて

4

問題の原因が見つかりました。

ulimit -uを自分のユーザーと確認しました。それは31389に戻ります。 そして、私はこの限界に達した理由を見ることができませんでした。

しかし、これの一時的なビットがある場合には、製造上、これらのプロセスは、別のユーザーの下で実行し、そのユーザーのために1024

を返し-u のulimitは、これらの6つのサーバーはデフォルトの状態でサーバあたり50〜150個のスレッドを持っている、 より多くの負荷をtcserverのスレッドの数は1024の限界に達するでしょう。

私は我々が生産ユーザーのスレッドの数を増やし、今それは正常に動作します。

関連する問題