【问题标题】:How to set a Java thread's cpu core affinity?如何设置 Java 线程的 cpu 核心亲和力?
【发布时间】:2012-11-15 06:08:15
【问题描述】:

我搜索了以前关于类似主题的帖子,但找不到合适的答案,因此提出了这个问题。非常感谢您在回答问题方面的帮助。

我知道在 Linux 中通过 taskset 命令设置进程与特定 CPU 内核的亲和性。但是我想设置一个 Java 线程对特定 cpu 核心的亲和性,以便属于同一进程的其他线程可以在所有剩余的核心上运行。例如,如果我有一个包含 4 核机器的 10 个线程的进程,我想为一个线程保留 core-1,并让剩余的 9 个线程在剩余的 3 核上运行。能做到吗?怎么做?

谢谢 萨钦

【问题讨论】:

    标签: java linux


    【解决方案1】:

    假设 2241 是您的 java 进程的 pid。运行:

    jstack 2241
    

    这会给你一个线程列表。在那里找到你的并注意 nid 字段。说 nid=0x8e9,它将以 10 为底转换为 2281。然后运行:

    taskset -p -c 0 2281
    

    完成。

    【讨论】:

      【解决方案2】:

      很遗憾,您不能将 Java 线程分配给特定的内核。但是,您可以将Thread Priorities 设置为线程的优先级(假设这将完成相同的事情)

      或者,您可以使用 JNI,但这完全是矫枉过正。

      【讨论】:

      • 是的,否则java不会独立于硬件
      【解决方案3】:

      请记住,您运行的 Java 应用程序实际上是在 JVM 中运行,而 JVM 又在操作系统上运行。为了能够直接与 CPU 交互,您需要一种低级编程语言(例如 C)。

      正如另一个答案中所建议的,您可以使用 JNI 与较低级别的语言(如 C)进行交互以执行您想要的操作,但是您必须将并发(在该较低级别语言中管理的线程)委托给它...

      【讨论】:

        【解决方案4】:

        您可以使用 JNA 在纯 Java 中做到这一点。不需要使用任务集。请记住,线程关联是毫无意义的,除非您之前已将内核与内核/用户线程和硬件中断隔离开来。我隶属于 Coral Blocks,它开发了 CoralThreads,正是这样做的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-12-05
          • 2018-11-20
          • 1970-01-01
          • 2018-05-19
          • 2014-08-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多