一个java进程可以使用多少个cpu核心?

时间:2011-06-09 18:34:57

标签: performance memory-management jvm

我正在运行一些性能测试来确定响应时间和使用各种cpu / ram / os配置处理并发的能力。我遇到的一个有趣的发现是,看起来单个jvm在使用4个内核时比在2个内核中表现更好(这并不奇怪),但是在第4个内核之外添加更多内核并不会带来任何显着的改进。但是,添加另一个带有负载均衡器(相同硬件)的jvm实例会带来显着的改进。

看起来单个进程在其可以使用的核心数量上受到限制,可能是由于进程可以一次生成的os线程数量的限制。这是一个64位环境。

我正在使用tomcat并尝试更改“maxThreads”属性,但这并没有对我想要处理的并发数量产生影响。

可以解释这个原因吗?

1 个答案:

答案 0 :(得分:2)

通常,Java应用程序将尝试在单独的核心上安排每个活动线程。这包括GC线程。如果应用程序首先不受CPU限制,那么添加更多内核将不会产生任何差异,因为线程被某些东西阻止。

对于Web应用程序,事情会变得复杂一些。如果线程正在等待其他东西,那么增加线程池的大小将没有任何区别,例如,来自数据库连接池的数据库。您需要仔细查看负载均衡器和Tomcat配置。如果这些没有正确调整,那么很容易就会有你描述的行为。

我不会过分担心JVM可能拥有的线程数量受到限制。我经常在生产系统的每个JVM中看到600多个线程。我们使用8个核心机器,请求的持续时间很短,因此大多数线程处于I / O等待状态。

相关问题