2012-11-15 69 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的珊瑚塊,它確實如此。