我已經實現了我的第一個GridGain應用程序,並且沒有獲得我期望的性能改進。可悲的是它更慢。我希望在改進我的實施方面提供一些幫助,這樣可以更快。在一臺機器上比多線程應用程序慢的GridGain應用程序
我的應用程序的要點是我正在做一個蠻力優化,數百萬個可能的參數,每個功能評估只需要幾分之一秒。我已經通過將數百萬次迭代劃分爲幾組來實現這一點,並且每個組都作爲一項工作來執行。
相關的一段代碼如下。函數maxAppliedRange爲範圍x中的每個值調用函數foo,並返回最大值,結果將成爲每個作業找到的所有最大值的最大值。
scalar {
result = grid !*~
(for (x <- (1 to threads).map(i => ((i - 1) * iterations/threads, i * iterations/threads)))
yield() => maxAppliedRange(x, foo), (s: Seq[(Double, Long)]) => s.max)
}
我的代碼可以在多線程執行之間選擇一臺機器上,或者使用上面的代碼使用幾個GridGain節點。當我運行gridgain版本,它開始時像它將會是更快,但隨後的幾件事情總是發生:
- 其中一個節點(不同的機器上)的錯過心跳,導致在節點我主計算機放棄該節點並且第二次開始執行該作業。
- 錯過心跳的節點繼續執行相同的工作。現在我有兩個節點做同樣的事情。
- 最終,所有作業都在我的主機上執行,但由於其中一些作業稍後開始,所有任務都需要更長時間才能完成。
- 有時GridGain引發異常,因爲節點超時且整個任務失敗。
- 我很生氣。
我試圖設置它有很多的工作,所以如果一個失敗了,那麼它不會是一筆交易,但是當我這樣做時,我最終會在每個節點上執行很多工作。這給每臺機器帶來了更大的負擔,使節點更有可能錯過心跳,導致所有事情都更快地下降。如果每個CPU有一個作業,那麼如果一個作業失敗,則不同的節點必須從頭開始重新開始。無論哪種方式,我都贏不了。
我想將最好的工作狀態,如果我可以做兩件事情:
- 加大對心跳 超時
- 油門每個節點,以便它只做一次一個工作。
如果我能做到這一點,我可以把我的任務分成許多工作。每個節點一次只能完成一項工作,並且不會有機器負擔過重而導致錯過心跳。如果一項工作失敗,那麼很少有工作會失去,恢復會很快。
誰能告訴我如何做到這一點?我應該在這裏做什麼?
我認爲我正在尋找的答案必須處理每個網格節點啓動時的xml配置文件?是否 控制心跳超時?我是否需要一個具有有限線程池的執行程序服務來節制每個節點? –
Jim
2010-12-19 06:36:42