【问题标题】:How many cpu cores can a single java process make use of?一个java进程可以使用多少个cpu核心?
【发布时间】:2011-06-09 18:34:57
【问题描述】:

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

看起来一个单独的进程在它可以使用的内核数量上是有限的,这可能是由于一个进程一次可以产生的操作系统线程数的限制。这是 64 位环境。

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

还有什么其他原因可以解释吗?

【问题讨论】:

  • “取决于什么在利用货币以及如何利用”? (或者是否有更根深蒂固的问题,比如只能在 4 个内核上生成线程?一些亲和力?)
  • 您使用的是哪个 JVM?似乎不太可能对可能使用的内核数量进行限制。
  • 也许你会绑定到其他东西,而不是纯 CPU,例如一个数据库池。或者 tomcat 用户会话。
  • 我使用的是 Sun HotSpot 1.6.25,为了测试,我只有应用程序逻辑,没有 i/o,数据库连接等。

标签: performance memory-management jvm


【解决方案1】:

一般来说,Java 应用程序会尝试将每个活动线程调度到一个单独的内核上。这包括 GC 线程。如果应用程序一开始就不受 CPU 限制,那么添加更多内核不会产生任何影响,因为线程被某些东西阻塞了。

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

我不会太担心 JVM 的线程数量会受到限制。我经常在我们的生产系统中的每个 JVM 中看到超过 600 个线程。我们使用 8 核机器,请求持续时间短,所以这些线程大部分处于 I/O 等待状态。

【讨论】:

  • “Java 应用程序将尝试在单独的内核上调度每个活动线程”... JVM 不会调度线程,操作系统调度程序决定哪些线程获得 CPU 时间以及它们在哪些内核上运行。
  • 没错,i/o 可能是一个瓶颈(尽管在我的情况下不是)。我的实验表明,两个 java 进程能够比同一硬件上的单个进程更有效地使用一个硬件。我很想知道这是否可以预期,以及是否由于操作系统对单个进程可以提供多少时钟的限制..
  • @Matt True 如果您使用的是本机线程(您应该使用它!)。如果您使用的是绿色线程,则不一定。 en.wikipedia.org/wiki/Green_threads
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
相关资源
最近更新 更多