单个Java进程可以利用多少个CPU核心?

5
我正在运行一些性能测试,以确定不同CPU / RAM / OS配置的响应时间和并发处理能力。我发现有趣的是,单个JVM使用4个内核的表现优于使用2个内核的表现(这并不奇怪),但是添加超过第4个内核的内核数并没有明显改进。但是,使用负载均衡器添加另一个JVM实例(相同的硬件)却带来了巨大的改进。
看起来单个进程在可利用的内核数上有限制,可能是由于进程可以同时生成的OS线程数量的限制。这是一个64位环境。
我正在使用Tomcat,并尝试更改“maxThreads”属性,但这对我要处理的并发量没有影响。
还有其他原因可以解释这种情况吗?

1
“这取决于谁在利用货币以及如何利用?”(或者是否存在更深层次的问题,比如只能在4个核心上生成线程?有亲和力吗?) - user166390
你使用的是哪个JVM?似乎不太可能存在可以利用的核心数量限制。 - Will A
也许你与纯CPU有关的东西不止一个,比如数据库池或Tomcat用户会话。 - nos
我正在使用Sun HotSpot 1.6.25进行测试,为了测试的缘故,我只有应用逻辑,没有输入/输出、数据库连接等。 - Kailash
1个回答

2

一般来说,Java应用程序会尝试在单独的核心上安排每个活动线程,包括垃圾回收线程。如果应用程序本身不受CPU限制,则添加更多核心不会产生任何影响,因为线程被某些东西阻塞了。

对于Web应用程序而言,情况就有点复杂了。如果线程在等待其他事物(例如数据库连接池中的数据库),增加线程池的大小就没有任何意义。你需要仔细查看负载均衡器和Tomcat配置。如果它们没有得到适当的调整,很容易导致您描述的行为。

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


"一个Java应用程序将尝试在单独的核心上调度每个活动线程"...... JVM不会调度线程,操作系统调度程序决定哪些线程获得CPU时间以及在哪些核心上运行。" - Matt
真实的情况是,输入/输出可能会成为瓶颈(尽管在我的情况下不是)。我的实验表明,两个Java进程能够比在相同硬件上运行的单个进程更有效地使用硬件。我很好奇,这是否是预期发生的,是否是由操作系统对单个进程可以获得多少时钟限制造成的。 - Kailash
@Matt 如果你正在使用本地线程(这是你应该使用的!),那么就是真的。如果你正在使用绿色线程,那就不一定了。http://en.wikipedia.org/wiki/Green_threads - Joshua Davis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接