【问题标题】:Are Java ThreadGroup objects bound to a single CPU?Java ThreadGroup 对象是否绑定到单个 CPU?
【发布时间】:2013-12-21 01:34:54
【问题描述】:

我正在使用 ThreadPoolExecutor,它用于批处理,但单个 JVM 上的单个线程池仅使用 1 个可用服务器的 CPU。如果使用新线程池启动并行的第二个 JVM,我将使用另一个 CPU。

所以我想知道,ThreadPoolExecutor 使用单个底层 ThreadGroup 作为它的“工作者”,这些线程是否因为它们属于单个 ThreadGroup 而绑定到单个 CPU?如果没有,还有其他想法吗?

查看相关问题:Why I'm not using 100%?

【问题讨论】:

    标签: java multithreading jvm threadpool cpu-usage


    【解决方案1】:

    ThreadPoolExecutor 使用单个底层 ThreadGroup 作为“worker”,这些线程是否因为属于单个 ThreadGroup 而绑定到单个 CPU?

    没有。所有 JVM 中的所有线程都在同一个 ThreadGroup 中,除非您特别更改它。这绝不会改变底层本机线程的调度方式,因此这不是您似乎没有使用多个 CPU 的原因。

    如果没有,还有其他想法吗?

    我的第一反应是质疑它是否真的没有使用多个 CPU。如果你查看进程的 CPU 使用率,它可能不会超过 100%,因为它在 IO 上阻塞。然而,这并不意味着它使用多个 CPU。可能是它使用了许多 CPU,只是提交给线程池的任务都不是“CPU 绑定”的。例如,如果您运行以下应用程序,那么它应该使用多个 CPU,并且 CPU 利用率应该超过 100%(如果您使用的系统将 CPU 测量为处理器数量的函数)。但是,如果您插入日志记录调用或从网络或磁盘读取,则可能会受到 IO 限制,无法达到 100% 以上。

     public static void main(String[] args) {
         ExecutorService threadPool = Executors.newCachedThreadPool();
         for (int i = 0; i < 4; i++) {
             threadPool.execute(new Runnable() {
                  public void run() {
                      long total = 0;
                      while (true) {
                         total++;
                      }
                  }
             });
         }
     }
    

    如果使用新线程池启动并行的第二个 JVM,我会使用另一个 CPU。

    在您的架构上,您的 JVM 可能无法在多个 CPU 上进行调度。当然,大多数常见架构和 JVM 变体都能够调度到所有可用的 CPU 和多个内核,但也许您的配置很有趣。

    【讨论】:

    • 我创建了第二个配置文件(新 JVM)并并行触发了进程,然后我得到了超过 50% 的 CPU 使用率,几乎使任务/秒速率增加了一倍,所以我认为我没有 IO阻止,但有什么严格的方法可以保证这一点?
    • 您能否提供更多关于您的线程正在执行的任务@gvasquez 的详细信息?
    • 我认为我们混淆了一些事情:他有两个处理器,每个处理器都有 16 个内核。所以总共有 32 个内核,但是 Java 只能设法使一个处理器饱和。我们无法告诉您更多关于这方面的信息,因为我们看不到您的代码。我也不知道 IBM JVM 是否可以使每个 JVM 饱和多个处理器 - Windows 似乎能够做到这一点,因为第二个进程使所有处理器饱和。
    • 通常 JVM 能够调度到所有 CPU 和所有内核,但这确实取决于硬件和相关的 JVM 变体@ThomasJungblut。我已将其添加到我的答案中。
    • @Gray:有关任务的更多详细信息:它转到 ECM 存储库(IBM CMOD:数据库和 FS 读取),然后将数据转换为 PDF,它也写入 FS,但我'已经尝试写入 RAMDISK 以确保在这部分进程中没有 IO 阻塞。
    【解决方案2】:

    不,它们没有绑定到 CPU。但是,如果您想使用Java-Thread-Affinity library 进行实验,您可以控制 CPU 亲和性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2017-12-12
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多