2

我有一個Java程序,用於在多個處理器之間進行一系列科學計算,方法是將其拆分爲不同的線程並在其中運行各個部分。這個問題很簡單,因此線程之間不存在爭用或通信。他們訪問的唯一常見數據是一些共享靜態緩存,不需要同步訪問權限,也可以訪問硬盤上的一些數據文件。線程也連續寫入磁盤,但分開文件。Java在Mac OS上的隨機速度減慢

我的問題是,有時當我運行該程序時,我獲得了非常好的速度,有時當我運行完全相同的東西時,它運行得非常緩慢。如果我看到它運行緩慢並按Ctrl-C並重新啓動它,它通常會再次開始快速運行。它似乎在運行的早期階段將其自身設置爲低速模式或快速模式,並且從不在模式之間切換。

我已經把它連接到jconsole,它似乎不是一個內存問題。當我發現它運行緩慢時,我嘗試連接一個探查器,但探查器無法連接。我試着用-Xprof運行,但慢速運行和快速運行之間的轉儲似乎沒有太大的差別。我也嘗試過使用不同的垃圾收集器和內存空間各個部分的不同尺寸。

我的機器是具有條帶化RAID分區的mac pro。 CPU的使用率永遠不會下降,無論它運行緩慢還是很快,如果線程花費太多時間阻塞從磁盤讀取數據,您會期望這種情況,所以我不認爲這可能是磁盤讀取問題。

我的問題是,我的代碼有哪些類型的問題可能導致這種情況?或者這可能是一個操作系統問題?我一直無法在一臺機器上覆制它,但我沒有一臺類似RAID設置的Windows機器。

+0

嘗試使用「java -server」運行,也許它隨機選擇不使用JIT?你怎麼能確保不同的線程運行在不同的處理器/內核上? – 2009-10-30 20:33:31

+1

@Piligrim,如果他使用默認配備64位Java 6的Mac OS X Snow Leopard,他已經在使用服務器版本。如果JVM會隨機選擇不使用JIT,這將是非常奇怪的 - 這不是一個現實的場景...... – Jesper 2009-10-30 22:15:46

+0

是的,我一直在使用-d64,顯然是代替服務器。 – javajustice 2009-10-30 22:18:12

回答

1

您可能有進入無限循環的線程。

嘗試連接VisualVM並使用線程監視器。

https://visualvm.dev.java.net

您可能有問題發生之前進行連接。

+0

林相當肯定它不會進入無限循環,因爲即使程序運行緩慢,它仍然完成並給出正確的輸出。 – javajustice 2009-10-30 22:19:50

+0

但是,謝謝你,我會嘗試視覺虛擬現實,看看它是否顯示任何東西。 – javajustice 2009-10-30 22:22:10

+0

我試過看visualvm中的線程,並沒有一個被阻止。它說它們都運行良好。如果我做cpu分析,結果很奇怪......它只是零星地更新,並且無論程序運行得很快還是很慢,都會產生無意義的結果。 運行cpu事件探查器確實總是會將程序從「慢速模式」中敲出來。 – javajustice 2009-11-02 20:50:18

1

其次,你應該使用一個探查器來查看線程視圖 - 有多少線程,它們處於什麼狀態等等。這可能是一個奇怪的競賽狀況,偶爾會發生。也有可能是這樣的情況,用profiler掛鉤(導致放緩)對這些類進行測試,將競爭條件分類出來,並且您將看到沒有附加分析器的放緩:/

請看看this post,或者更確切地說,回答,哪裏有提到的緩存爭用問題。

您是否每次都產生相同的線程數?該數字是否小於或等於您的平臺上可用的線程數?這個數字可以用相當準確的檢查或推測。

請張貼任何finidng!

+0

該程序將n維參數空間作爲輸入,並將其分爲每個線程一個常量給定數量的塊。在這種情況下,我使用了15個塊,因爲我有16個邏輯處理器。 線程幾乎完全獨立。他們從同一組數據文件中讀取數據,但每個數據文件都有自己的通道,並寫出單獨的數據文件(參數空間中的每個點都有一個文件)。 唯一的共享內存是一些開始未初始化的常量靜態數組。當其中一個線程試圖查找該常量時,它首先檢查它是否已經... – javajustice 2009-11-02 20:36:34

+0

...計算出來,如果不是,則計算它並將其放入數組中。所以在這裏,多個線程將同時訪問數組,但訪問不同步,並且對數組的所有修改都是原子的。 爲了方便起見,我基本上在一個進程中運行了15個獨立進程。 – javajustice 2009-11-02 20:39:31

1

您是否有測量CPU溫度的工具?操作系統可能會限制CPU來處理溫度問題。

+0

這很有趣。在新的Nehalem芯片中可能與TurboBoost的東西有關嗎?非常奇怪的是,它的速度放緩,同時仍然在頂部顯示相同級別的CPU使用率。 – javajustice 2009-11-02 20:42:02

+0

雖然如果因溫和而節流,我認爲它有時會減緩運行速度很快的流程,反之亦然。這絕不會發生。這個過程總是從一開始就卡住快或者慢,只有連接visualvm和啓動一個cpu配置文件才能將其從慢速模式中解放出來。 – javajustice 2009-11-02 21:28:30

1

有時您的程序有可能被分頁到磁盤嗎?在這種情況下,您將需要查看整個操作系統的內存使用情況,而不僅僅是您的程序。根據經驗我知道,當內存不斷分頁到磁盤並返回時,運行時性能會有很大差異。

我對OSX瞭解不多,但在Linux中,「free」命令對此很有用。

另一個可能導致這種放緩的問題是日誌文件?我知道至少有一些日誌記錄代碼會隨着日誌文件的增長而逐漸減慢系統。您的線程可能正在日益擴大的日誌文件上進行同步,然後當您重新啓動程序時,會使用另一個日誌文件。

+0

我試圖意識到這個問題..我的機器有32G的內存,我限制了使用16G最大堆的過程,並且過程通常永遠不會超過8G。所以它不應該是分頁,但下一次我重現錯誤,我會找到一些東西來監視交換使用情況。 – javajustice 2009-11-02 20:28:33

+0

我解決了這個問題,至少根據mac os活動監視器,它絕對不會觸及頁面文件。 – javajustice 2009-11-02 21:24:38