異なる Web アプリケーションで tc-server を実行している 6 つの Java プロセスを持つ Linux サーバーでは、次のエラーが原因で複数のサーバーが (ほぼ同時に) 動作を停止することがあります。
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-server を実行しています) Linux マシンのプロセスの最大数に達したようです。の最大スレッド数OS-level is about 31389 (ulimit -u)
。しかし、Linux では過剰な数のスレッドは見られません。オペレーティング システムを見ると、約 1500 のスレッドが実行されています。
(ps -eLF | wc -l)
tcserver プロセスをプロファイリング/監視する場合、Java プロセスあたりのスレッド数は通常 50 から 150 の間であり、負荷がかかると http スレッドのために 350 になることがありますが、それはダウンしてプロセスあたりのスレッドの最大数に達することはありません。 1000 (このマシン上)。
ランタイム環境を使用して64 bit Java 1.7
おり、OS には常に空きメモリがあります。
今日、サーバーの起動から 1 分後にこのメッセージが表示されました。jvm は動作を停止しましたが、os プロセスは実行され続けました。このプロセスのスレッド数を見ると51でした。
(ps uH p <pid> | wc -l).
したがって、スレッドの最大数に達したように見えますが、多くの実行中のスレッドは見られません。