如何设置 Java 线程的 cpu 核心亲和力?
Posted
技术标签:
【中文标题】如何设置 Java 线程的 cpu 核心亲和力?【英文标题】:How to set a Java thread's cpu core affinity? 【发布时间】:2012-11-15 06:08:15 【问题描述】:我搜索了以前关于类似主题的帖子,但找不到合适的答案,因此提出了这个问题。非常感谢您在回答问题方面的帮助。
我知道在 Linux 中通过 taskset 命令设置进程与特定 CPU 内核的亲和性。但是我想设置一个 Java 线程对特定 cpu 核心的亲和性,以便属于同一进程的其他线程可以在所有剩余的核心上运行。例如,如果我有一个包含 4 核机器的 10 个线程的进程,我想为一个线程保留 core-1,并让剩余的 9 个线程在剩余的 3 核上运行。能做到吗?怎么做?
谢谢 萨钦
【问题讨论】:
【参考方案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,正是这样做的。
【讨论】:
以上是关于如何设置 Java 线程的 cpu 核心亲和力?的主要内容,如果未能解决你的问题,请参考以下文章
tasksetCPU亲和力&docker容器资源配额控制之cpu