2017-10-09 155 views
0

我面臨多核系統的可伸縮性問題。我的應用程序在4個物理核心機器上並行處理科學數據,8個邏輯核心啓用超線程。我們推出8個JVM,每個邏輯核心一個(我們最終可能會切換到一個JVM,以避免JVM的開銷)如何檢測多核可伸縮性/爭用問題

問題是可擴展性幾乎是線性的,最多4個核心,但我們幾乎沒有增加10-20通過增加4個「邏輯核心」來提高性能。

我通過剖析應用程序來分析線程行爲,並且看不到太多的鎖或線程。我也檢查了pidstat,我沒有看到例如過度的上下文切換開銷。更確切地說,java進程幾乎沒有上下文切換。 CPU使用率超高,幾乎達到100%,這似乎也沒問題。

我的問題是如何在超過物理內核數量後檢測並分析這種不良可擴展性的原因。我可以使用哪些工具和方法來檢測競爭的位置,我應該在哪裏查看並且能夠以某種方式修復它,而不會改變應用程序的體系結構(例如,切換到每臺計算機的一個JVM)

謝謝

回答

0

請注意,超線程不會使單核的容量翻倍。實際上,當超線程處於開啓狀態時,有些任務會變得更糟。

收益將取決於工作性質 - 更多的管道攤位將意味着更多機會安排另一個過程來代替停滯的過程。

作爲一個例子:完全隨機訪問內存在超線程性能增益方面比在同一緩存行內進行非常快的cpu密集型計算產生更多。

這裏有東西兩個硬件線程共享,並且因此任何將產生爭用限制任何收益:

  • 緩存
  • 分支預測資源
  • 取指令並解碼
  • 執行單元(整數和浮點數)

另一個觀察結果是操作系統必須支持SMT/HT,否則它將無法將任何內容安排到其他內核中,或者安排錯誤的任務。

當受操作系統支持時,在文件句柄或網絡套接字等內容上仍有機會操作系統爭用。更多的'尷尬平行'工作的性質,更多的機會來限制這種爭論。但是,如果您的工作涉及閱讀和/或寫入相同的系統資源,您將獲得較少的收益。

一旦你把所有這些任務爲1個JVM,你並行的水平將是:

int cores = Runtime.getRuntime().availableProcessors(); 
+0

感謝您的回答是明確的問題空間。我會看看緩存未命中的情況,並嘗試僅使用物理內核來運行一個想法。 – greg