我正在測試我的Java應用程序的任何性能瓶頸。該應用程序使用concurrent.jar進行鎖定。Java性能降低鎖的移除
我有一個很高的計算調用,它爲其操作調用鎖定和解鎖函數。 在從代碼中移除鎖定 - 解鎖機制時,我看到了與我的預期相反的多次摺疊導致的性能下降。除此之外,觀察到CPU消耗增加,這讓我覺得程序運行速度更快,但實際上並非如此。
Q1。當我們移除鎖時,性能下降的原因是什麼?
順祝商祺!
我正在測試我的Java應用程序的任何性能瓶頸。該應用程序使用concurrent.jar進行鎖定。Java性能降低鎖的移除
我有一個很高的計算調用,它爲其操作調用鎖定和解鎖函數。 在從代碼中移除鎖定 - 解鎖機制時,我看到了與我的預期相反的多次摺疊導致的性能下降。除此之外,觀察到CPU消耗增加,這讓我覺得程序運行速度更快,但實際上並非如此。
Q1。當我們移除鎖時,性能下降的原因是什麼?
順祝商祺!
這可能是一個相當常見的發現,具體取決於您正在做什麼以及您正在使用什麼作爲鎖定的替代方法。
實質上,會發生什麼情況是,像ReentrantLock這樣的構造具有一些內置的邏輯,當它們實際上無法獲取鎖時,它們知道「什麼時候退後」。這減少了重複嘗試獲取鎖的邏輯中燒燬的CPU數量,如果使用更簡單的鎖定結構,則會發生這種情況。
作爲一個例子,看看我匆忙搭上的圖表here。它顯示了不斷訪問數組中隨機元素的線程吞吐量,並使用與鎖定機制不同的構造。沿着X軸是線程的數量; Y軸是吞吐量。藍線是一個ReentrantLock;黃色,綠色和棕色線條使用自旋鎖的變體。注意線程數量較少時,自旋鎖可以提供更高的吞吐量,但是隨着線程數量的增加,ReentrantLock的退出邏輯開始執行,並且結束時性能更好,而爭用率更高,自旋鎖只是坐着燃燒CPU。
順便說一句,這真的是在雙處理器機器上進行的試運行;我還在亞馬遜雲中運行它(實際上是一款8路至強處理器),但我渾渾噩噩......錯過了該文件,但我會找到它或者很快再次運行實驗,並進行培訓併發布更新。但是我記得你有一個基本相似的模式。
更新:無論是鎖定代碼或沒有,可以在一些多處理器架構發生的一個現象是,隨着多個處理器對內存執行大量的訪問,你可以最終充斥內存總線,以及影響處理器相互減速。(這與以太網有點相似 - 您添加到網絡中的機器越多,發送數據時發生衝突的機會就越多。)
簡介它。這裏的其他任何東西都只是一個猜測而已。
使用像YourKit探查不僅會告訴你哪些方法是「熱點」的CPU時間方面,而且它還會告訴你在哪裏線程花費大量的時間BLOCKED或等待
難道還要正確執行?例如,應用程序服務器中出現了一個情況,其中一個不同步的HashMap
導致了偶爾的無限循環。不難看出工作如何重複。
我試圖比較有和沒有鎖的應用程序的性能。當然,當鎖被刪除時,我在某些線程運行中得到了「併發修改異常」。 – pankajt 2009-04-23 05:31:12
並非每個錯誤都被檢測到。你不會像喜歡那樣比較。 – 2009-04-23 13:01:29
當您刪除共享內存保護時,看到性能下降和CPU使用率增加的最可能的罪魁禍首是競態條件。兩個或更多線程可以不斷地在共享對象上來回翻轉狀態標誌。
更多描述您的應用程序的目的將有助於診斷。
我不同意這裏的答案凱文。我已經介紹了我的代碼,並且不會借我任何地方。爲了簡化這些事情,我在CPUS上運行的代碼(8個CPU盒)是CPU密集型的過程。 CPU時間方面的熱點對於1.帶鎖的代碼和2.不帶鎖的代碼完全相同。很顯然,第二秒鐘鎖定調用丟失了,但是當我說這是一個CPU密集型進程時,沒有鎖定的代碼2的性能應該更高。 您有其他想法嗎? 感謝Kevin的回覆 – pankajt 2009-05-09 12:47:11