2

在具有 6 个 java 进程的 linux 服务器上,运行具有不同 Web 应用程序的 tc-server,有时由于此错误,多个服务器停止工作(几乎同时):

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)

这会导致在一台机器上运行的一个或多个 JVM 停止工作。(我们在同一台机器上运行了 6 个 tc-servers)看起来我们的 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运行时环境,操作系统上总是有空闲内存。

今天,我们甚至在服务器启动 1 分钟后收到了这条消息。jvm 停止工作,但 os 进程继续运行。查看此进程的线程数时,它是 51。

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

所以看起来已经达到了最大线程数,但我们从来没有看到很多正在运行的线程。

4

1 回答 1

4

我找到了问题的原因。

我用自己的用户检查了 ulimit -u 。这将返回 31389。而且我看不出达到此限制的任何原因。

但是在生产中,这些进程在另一个用户下运行,对于那个用户 ulimit -u 返回 1024

这 6 台服务器在默认状态下每台服务器有 50-150 个线程,因此当临时负载稍多时,tcserver 中的线程数将达到 1024 的限制。

所以在 linux 中,我们增加了生产用户的线程数,现在它运行良好。

于 2016-08-15T07:18:55.073 回答