2010-07-13 74 views
8

我讀過一篇博客文章在不久前聲稱Java應用程序更好地運行,當它被允許使用在多核機器單個CPU:http://mailinator.blogspot.com/2010/02/how-i-sped-up-my-server-by-factor-of-6.htmlJVM多核

莫不是什麼原因Java應用程序,在多核機器上運行比在單核機器上運行慢得多?

+0

對於[Java,性能和多核](http://www.google.com/search?q=java+performance+multi+core),有很多有希望的鏈接。如果這個博客文章在列表中,你能留下一張紙條嗎? – 2010-07-13 12:03:02

回答

8

如果在不同線程中的共享資源之間存在顯着的爭用,那麼鎖定和解鎖對象可能需要大量的處理器間中斷,處理器可能會花費更多時間丟棄它們的L1和L2高速緩存並從其他CPU重新獲取數據,而不是實際花費在解決手頭問題上的進度。

這可能是一個問題,如果應用程序的方式too-fine-grained locking。 (我曾經聽說過這樣的概念:「每個CPU緩存行都有一個以上的鎖是沒有意義的,這是毫無疑問的,也許還是太細緻)。如果有太多的人在生活和競爭,導致在運行系統中擁有太多的鎖。

我毫不懷疑,有人會故意寫出這樣的應用程序,但它可能不是很常見。大多數開發人員會編寫應用程序以儘可能減少資源爭用。

+0

這忽略了[Amdahl's law](http://en.wikipedia.org/wiki/Amdahl%27s_law)和[Little's law](http://en.wikipedia.org/wiki/Little%27s_law),它們基本沸騰直到:有些事情不能很好地分解爲並行任務,無論語言/環境如何。 – 2013-01-29 08:33:59

1

我懷疑「很多」的部分。

我的猜測是,從一個CPU移動狀態到另一個狀態的代價是高到足以引人注目。通常你希望作業保持在同一個CPU上,以便儘可能在本地緩存數據。

1

這完全是猜測沒有問題的文章/數據,但有一些類型的程序不太適合並行化 - 也許應用程序從來沒有CPU限制(這意味着CPU不是瓶頸,也許一些類型的I/O是)。

但是這個問題/談話是沒有更多的細節相當毫無根據的。

1

有沒有具體的Java的原因,但是從核心網到核心甚至從CPU到CPU運動狀態需要時間。如果進程停留在單個內核上,這個時間可以更好地使用。而且,在這種情況下可以改進緩存。

這僅僅是相關但如果程序不使用多個線程,從而可以有效地分配到多個核心/ CPU的工作。

0

最新的英特爾CPU具有睿頻加速:

http://en.wikipedia.org/wiki/Intel_Turbo_Boost

+0

最糟糕的情況是,這意味着一個真正荒謬的(如果不是惡意的)任務調度程序可能會嘗試安排一些事情,以使Turbo Boost無法啓動 - 而且我甚至不確定它實際上是否可以這樣操縱。在任何情況下,它都不會達到6倍的性能差異。 – 2010-07-13 20:23:07

+1

我同意。 Turbo Boost甚至不會接近6倍。 – Puppy 2010-07-14 20:03:20

0

這將取決於線程的應用程序產生的數量。如果你產生了四個工作線程在進行繁重的數字處理,那麼這個應用程序在四核機器上的速度將快四倍,這取決於你必須做多少記帳和合並。

1

該應用程序可能會非常糟糕地使用阻塞線程間通信。但是,這純粹是由於應用程序編程異常困難。

沒有任何理由說明爲什麼任何具有適度並行工作負載的平庸編程的多核應用程序都應該在多個內核上運行得更慢。

1

從純粹的性能角度來看,挑戰往往圍繞着內存子系統。所以,雖然更多的CPU通常是好的,但是如果CPU不在Java對象所在的內存附近,則非常非常昂貴。這是非常機器特定的,並且很大程度上取決於每個CPU和內存之間的確切路徑。英特爾和AMD在這裏都有不同的形狀/速度,結果差別很大。

請參閱NUMA出於多核可能阻礙的原因。

根據JVM如何固定到處理器,我們已經看到性能增量在30%或更多的範圍內。由於這個原因,SPECjbb2005現在大多運行在「多JVM」模式下,每個JVM都與給定的CPU /內存相關聯。

0

CPU通常會對能產生多少熱量有限制。這意味着一個芯片較少的芯片可以高頻運行,如果它沒有有效地使用額外的內核,程序運行速度會更快。今天,差別在於4,6和8核心,其中更多的核心單獨較慢。我不知道任何比最快的4核心系統更快的單核系統。

+0

在這篇文章中,作者通過將它分配給一個CPU而不是6個而將他的服務器分配得更快 – IttayD 2010-07-14 03:54:04

+0

你是對的,他將他的所有進程分配給一個內核。如果這樣做,他幾乎肯定會有一個調整問題,儘管它不清楚。 – 2010-07-14 05:54:39

1

如果JIT認爲它運行在單個內核中,它將不包含內存屏障。我懷疑這是參考文章中發生的事情。

這裏是記憶障礙,非常簡明的解釋,它也提供了看到這些JIT過的代碼的整潔技術: http://www.infoq.com/articles/memory_barriers_jvm_concurrency

這並不是說所有的應用程序將受益於被放置在一個單一的核心。