单机/单核/多核上的单/多JVM

时间:2017-06-06 01:39:20

标签: java performance parallel-processing jvm

我几乎没有问题,而且我在网上搜索了以下问题但却更加困惑。

  1. 我在单机上运行java应用程序,单机JVM,20核机器,20 GB内存,20个java线程。 (单机,单JVM,20核,20 GB RAM,20个java线程)
  2. 我在一台机器上运行java应用程序,每个JVM上有20个JVM,20个核心mahcine和1 GB ram,每个进程有1个JAVA线程。 (单机,20 JVM,20核,20 GB RAM,20个java线程)
  3. 从第1点和第2点开始,哪一个更好,为什么就

    而言
    • 申请表现
    • 机器的CPU利用率
    • 如果CPU没有完全消耗,甚至增加线程数,那么在应用程序或机器中该怎么做才能使用更多的CPU。
    • 在这种情况下,上下文切换会更多。

    在上述1和2点,假设每个线程需要10ms才能完成任务,然后在案例1和2中完成所有任务的时间。请解释。

    我已经搜索并了解了CPU利用率方面的CPU密集型和I / O密集型应用程序。你可以解释一下,因为我很困惑。

    通常建议线程数等于核心数。如果我有更多的线程然后核心那么将产生什么影响。请解释一下。

1 个答案:

答案 0 :(得分:0)

你在那里玩了很多不同的变量,并不是一个简单的答案。我将在下面添加一些细节,但是tl; dr版本将会针对您的场景运行一些测试并查看最佳效果"。

每个cpu是否应该有一个线程取决于您的工作量。正如你已经明显发现的那样,如果你的线程是cpu密集型的(意思是,大部分时间它都是主动使用cpu),那么一个线程将接近完全利用一个cpu。但是,在许多实际情况中,你的线程可能不得不做其他事情(比如等待I / O),在这种情况下它不会完全利用cpu(这意味着你可以运行超过cpu)每个CPU一个线程。)

另外,在您的两种情况下,您需要考虑所有jvm开销。每个jvm都有许多自己的线程(最值得注意的是,GC线程)。这些将为您的cpu使用增加额外的开销。如果你的代码大量使用垃圾收集器(在工作时创建/丢弃大量垃圾),每个线程有单独的jvms可能是有益的,但是你需要考虑额外的gc线程cpu使用情况。如果你的代码不会产生大量垃圾,那么使用单独的jvms(以及许多额外的gc线程)可能只会浪费资源。

鉴于所有这些变量以及线程的实际工作负载配置文件,您不可能仅凭理论找到正确的答案。使用真实世界数据测试各种场景是您找到适合您的应用程序的唯一方法(它可能最终成为中间的东西,如4个jvms,每个5个线程)。