2017-06-06 35 views
0

我有幾個問題,我在網上搜索了以下問題,但變得更加困惑。單/多核心單機上的單個/多個JVM

  1. 我有單個機器上運行的Java應用程序與單個JVM,20核心機器與20 GB RAM 20個Java線程。 (單機,單JVM,20核心,20 GB ram,20個java線程)
  2. 我有一臺帶有20個JVM的單機運行的java應用程序,每個JVM帶有1 GB RAM的20個核心機器,每個JVM有1個JAVA線程。 (單機,20 JVM,20芯,20 GB的RAM,20個Java線程)

從以上點1和2,其中一個是在應用 的

  • 性能方面更好,以及爲什麼
  • 機器的CPU利用率
  • 如果即使增加線程數量,CPU也沒有被完全消耗,那麼在應用程序或機器中要做些什麼才能利用更多的CPU。
  • 在哪種情況下上下文切換會更多。

在上面的1和2點中,假設每個線程需要10ms才能完成任務,那麼在情況1和2中所有任務將在多少時間內完成。請解釋。

我有搜索並聽說CPU密集型和I/O密集型應用程序的CPU利用率。你可以請解釋一下,因爲網絡我很困惑了很多。

一般建議線程數等於核心數。如果我有更多的線程數然後核心會有什麼影響。請解釋。

回答

0

你有很多不同的變數在那裏玩,並不會有一個簡單的答案。我將在下面添加一些細節,但tl; dr版本將會「針對您的場景運行一些測試並查看最佳效果」。

每個CPU是否應該有一個線程取決於您的工作負載。正如你已經明顯發現的那樣,如果你的線程是cpu密集型的(也就是說,大多數時候它正在積極使用cpu),那麼一個線程將接近完全利用一個cpu。然而,在許多現實世界中,很可能您的線程可能不得不做其他事情(如等待I/O),在這種情況下,它不會充分利用cpu(這意味着您可以在每個cpu上運行多個線程)。

另外,在您的兩種情況下,您需要考慮所有jvm開銷。每個jvm都會有很多自己的線程(最顯着的是GC線程)。這些會爲你的CPU使用量增加額外的開銷。如果您的代碼大量使用垃圾收集器(在工作時創建/丟棄大量垃圾),則每個線程都有單獨的jvms可能會有所幫助,但是您需要考慮額外的gc線程cpu使用情況。如果你的代碼不會產生大量垃圾,那麼使用單獨的jvms(以及許多額外的gc線程)可能會浪費資源。

考慮到所有這些變量以及線程的實際工作負載配置文件,您不可能單憑理論找到正確的答案。使用真實世界的數據測試各種場景是您爲應用程序找到正確組合的唯一方法(它可能最終會成爲中間的東西,例如4個jvms,每個5個線程)。

+0

感謝您的回答。1)通常,單機上的1個JVM更好,或者考慮到應用程序不使用GC,單機上的多個JVM會更好? 2)如果即使增加線程數量,CPU也沒有被完全耗盡,那麼在應用程序或機器中要做些什麼才能利用更多的CPU。 3)在上面的1點和2點中,假設每個線程需要10ms才能完成任務,那麼在情況1和2中將在多長時間內完成所有任務。請解釋。 – VJS

+0

@VJS對於1,3我相信我已經回答了上面的問題:「有太多的變數來給出一個有意義的答案,你將不得不測試你的應用程序來確定哪些方法最好」。爲2,運行你的代碼在一個體面的分析器,以找到瓶頸,然後修復它們。 – jtahlborn

+0

感謝您的回覆。正如你所提到的,「在一個體面的剖析器下運行你的代碼以找到瓶頸.....」我的方法是什麼?比方說,如果我在JProfiler下運行我的代碼,那麼爲了解決這個問題,應該是什麼區域或標識機制,即爲什麼我的應用程序沒有使用更多的CPU。我的意思是,我在應用程序或Jprofiler中看到了什麼? – VJS