2010-02-10 83 views
56

有誰知道將Java進程中的單個線程鎖定到特定CPU內核(在Linux上)的方法嗎?我已經在C中完成了這個,但是在Java中找不到這個。我的直覺是,這將需要一個JNI電話,但我希望這裏有人可能有一些洞察力,或可能以前做過。Java線程關聯

謝謝!

+1

請參閱下文,哈桑的評論我的回答。一些線程的I/O密集程度很高,另一些則是CPU密集型的。如果我屏蔽了某個特定內核的I/O中斷,我希望I/O密集型線程位於同一個套接字上的內核上,並且我希望屏蔽CPU密集型線程與I/O 。 – Dave 2010-02-10 16:24:05

+40

@gimpf:與此類「問題質疑」一樣:SO不是關於「爲什麼」,而是關於「如何」。 CPU親和力的存在是出於某種原因,Linux和Windows都有工具來設置進程的CPU親和力。 OP的問題是一個完全合理的問題,不需要「爲什麼」,而是「如何」。 – SyntaxT3rr0r 2010-02-10 17:22:07

+6

@WizardOfOdds:我懷疑SO爲什麼被禁止,並且由於Java通常不是第一個用於併發性相關性能調整的編程語言,所以我認爲理智檢查是有效的。 – gimpf 2010-02-10 21:24:37

回答

42

你不能在純Java中做到這一點。但是如果你確實需要它 - 你可以使用JNI來調用完成這項工作的本地代碼。這是開始的地方:

http://ovatman.blogspot.com/2010/02/using-java-jni-to-set-thread-affinity.html

http://blog.toadhead.net/index.php/2011/01/22/cputhread-affinity-in-java/

UPD:經過一番思考,我決定創建自己的類此:ThreadAffinity.java這是基於JNA,很簡單 - 所以,如果你想在生產中使用它,可能你應該花一些時間使它更穩定,但是對於基準測試和測試來說,它可以很好地工作。

UPD 2:還有另一個library用於處理java中的線程關聯。它使用如前所述同樣的方法,但有另一個接口

+0

+1作品!真棒!請注意我在第一篇博客中留下的評論 - 您需要在所有包含內容中加上#define _GNU_SOURCE。 – 2011-11-07 18:22:09

+1

+1:我已將此功能轉換爲使用JNI或JNA的庫,具體取決於可用的功能。它也有一個低延時定時器,並且支持忙於等待PAUSE asm指令。 https://github.com/peter-lawrey/Java-Thread-Affinity – 2012-02-09 09:14:44

+0

@PeterLawrey很好,謝謝! (假設它工作,我還沒有驗證)。雖然你的庫有一些問題(主要是文檔和bug)我該如何與你聯繫? – Raphael 2012-03-01 11:12:07

0

國際海事組織,這不會是可能的,除非你使用本地電話。 JVM應該是獨立於平臺的,任何系統調用都不會產生可移植的代碼。

+6

我不關心可移植性。 – Dave 2010-02-10 16:21:29

+5

@questzen:如果系統調用僅在發現Java程序在支持所述呼叫的OS上運行時纔會發生?該代碼仍然是可移植的,但不會在其他操作系統上設置任何CPU關聯。這是總是讓我感到震驚的一件事:只要你做了一些JNI或者一些Runtime.exec(),人們就會尖叫「不可移植的代碼」。我已經有了可以在Linux,Windows和OS X上運行的程序。 – SyntaxT3rr0r 2010-02-10 17:23:57

+0

這不是關於是否使用本機調用,而是關於平臺是否支持「開箱即用」。 @questzen是正確的,JVM不會抽象訪問這個,因爲它不是平臺中立的。您可能能夠找到能夠做到的第三方庫。 – PSpeed 2010-02-10 21:49:03

0

這是不可能的(至少用普通的Java)。

您可以使用thread pools限制用於不同類型工作的線程數量(以及核心數量),但無法指定要使用的內核。

甚至有(小)的可能性,您的Java運行時不支持您的操作系統或硬件的本地線程。在這種情況下,使用了green threads,並且只有一個內核將用於整個JVM。

9

我知道這是一段時間,但如果有人遇到這個線程,這是我如何解決這個問題。我寫了一個腳本,將做到以下幾點:

  1. 「jstack -l」
  2. 取結果,找到「NID」「我想手動向下鎖定到內核線程秒。
  3. 任務設置這些線程。
+1

出於興趣,我認爲taskset只處理進程而不是單個線程。對線程做什麼語法? – Matt 2011-04-22 16:45:29