如何设置 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 核心亲和力?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 进程、线程和CPU的关系,cpu亲和性

Java如何依据cpu核数设置合适的线程数

tasksetCPU亲和力&docker容器资源配额控制之cpu

Linux 操作系统原理 — NUMA 架构中的多线程调度开销与性能优化

java线程池如何合理的设置大小

CPU affinity 亲和力