2012-11-15 70 views
11

我搜索了以前的帖子上的类似主题,但无法找到一个合适的答案,因此问这个问题。我们非常感谢您的回答。如何设置Java线程的cpu核心亲和力?

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

感谢 萨钦

回答

8

说2241是你的java进程的PID。运行:

jstack 2241 

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

taskset -p -c 0 2281 

完成。

7

不幸的是,你不能将Java线程到一个特定的核心。但是,你可以做的事情是设置Thread Priorities来确定线程的优先级(假设这将完成相同的事情)。

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

+0

yeah elsewise java将不会硬件独立 – Furtano

2

记住您的运行实际上运行在JVM中的Java应用程序,该JVM又运行在OS上。为了能够直接与CPU进行交互,您需要使用低级编程语言(例如C)。

正如在另一个答案中提到的,你可以使用JNI与更低级别的语言(如C)进行交互来做你想做的事情,但是你必须将并发性(在较低级别的langaguge内管理的线程)委托给它...

0

您可以使用JNA在普通的Java中执行此操作。没有必要使用任务集。请记住,线程亲和性是毫无意义的,除非您之前已经从内核/用户线程和硬件中断中分离出核心。我隶属于开发CoralThreads的珊瑚块,它确实如此。