2015-10-19 45 views
0

我們廣泛使用Java ThreadPoolExecutor。具體來說,我們遵循一個fork連接模式,構建一個可調用列表並在它們上使用invokeAll()的定時變體。我們只使用這些線程池來執行I/O(非CPU密集型)操作,但是看着線程轉儲,我們看到這些特定線程消耗高CPU。查看FutureTask.awaitDone()實現,我可以看到採用對LockSupport.parkNanos()的交叉調用實現了忙等待策略。看看parkDanos本身的JavaDoc,我看到這個評論「可以虛假地返回......」,這讓我懷疑awaitDone()是否正在旋轉,從而導致高CPU。任何幫助將不勝感激!CPU對FutureTask.awaitDone的影響

+0

你檢查了探查CPU活動? – lbalazscs

+0

我使用這裏描述的這種技術來編織jstack和top的輸出以查找有問題的線程。 http://www.boxjar.com/using-top-and-jstack-to-find-the-java-thread-that-is-hogging-the-cpu/ – RPJ

+0

分析器提供了許多模式的詳細信息,而不僅僅是線程使用CPU,也是使用哪種方法。有免費的Java分析器,例如VisualVm和「Java Mission Control」。 – lbalazscs

回答

0

我看到此評論「可以返回不合邏輯的。」

同樣是一個ReentrantLockCondition#await如此。您通常將awaitwait與while循環關聯的原因之一是由於線程暫停的虛假性質。這就是說,既然我們不擔心虛假的喚醒與Condition你也不應該在這裏擔心。

它確實做了,但它並不繁忙。第一個循環通常緊接着是暫停。

+0

park()'在獲得許可方面「大部分成功」是可能的,因爲我們可以說很多其他併發unparking線程嗎? – RPJ

+0

另外,是否有可能叉式線程發生大量喚醒導致高CPU? – RPJ

0

我認爲awaitDone並不是因爲它叫做parkNanos而「忙 - 等待」。 parkNanos在概念上與Object.wait()相似:一個線程在等待,但CPU可以同時處理其他事情。由於虛假的喚醒造成無限循環,但這些都是操作系統問題,並且也不意味着處於活動狀態的繁忙等待。

該線程可能會花費大量時間(「掛鐘時間」),但這不一定是CPU時間。我的建議是使用探查器,因爲他們可以做出這種區分,並且可以幫助您找到真正的CPU瓶頸。

相關的問題:

What specifically are wall-clock-time, user-cpu-time, and system-cpu-time in UNIX?

Unsafe.park vs Object.wait

How can I Monitor cpu usage per thread of a java application in a linux multiprocessor environment?