2010-12-19 49 views
3

我已經實現了我的第一個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有一個作業,那麼如果一個作業失敗,則不同的節點必須從頭開始重新開始。無論哪種方式,我都贏不了。

我想將最好的工作狀態,如果我可以做兩件事情:

  • 加大對心跳
  • 超時
  • 油門每個節點,以便它只做一次一個工作。

如果我能做到這一點,我可以把我的任務分成許多工作。每個節點一次只能完成一項工作,並且不會有機器負擔過重而導致錯過心跳。如果一項工作失敗,那麼很少有工作會失去,恢復會很快。

誰能告訴我如何做到這一點?我應該在這裏做什麼?

+0

我認爲我正在尋找的答案必須處理每個網格節點啓動時的xml配置文件?是否控制心跳超時?我是否需要一個具有有限線程池的執行程序服務來節制每個節點? – Jim 2010-12-19 06:36:42

回答

2

現在我有它正常工作。在我的應用程序中,我在一臺機器上使用多線程應用程序的速度提高了50%,但這不是我能做的最好的。還有更多的工作要做。

要使用gridgain,似乎配置文件對於使所有工作都很關鍵。這是設置節點行爲的地方,必須符合您的應用程序的需求。

有一兩件事,我需要在我的xml配置文件是這樣的:

<property name="discoverySpi"> 
     <bean class="org.gridgain.grid.spi.discovery.multicast.GridMulticastDiscoverySpi"> 
      <property name="maxMissedHeartbeats" value="20"/> 
      <property name="leaveAttempts" value="10"/> 
     </bean> 
    </property> 

這臺之前被認爲是缺少一個節點可以錯過的最大心跳。我把它設置爲一個很高的值,因爲我一直有一個節點離開並在幾秒鐘後回來的問題。或者,不使用多播,我可以使用配置文件中的其他屬性修復正在運行節點的計算機的IP。我沒有這樣做,但如果你反覆使用同一臺機器,它可能會更可靠。

我做的另一件事是:

<property name="collisionSpi"> 
     <bean class="org.gridgain.grid.spi.collision.jobstealing.GridJobStealingCollisionSpi"> 
      <property name="activeJobsThreshold" value="2"/> 
      <property name="waitJobsThreshold" value="4"/> 
      <property name="maximumStealingAttempts" value="10"/> 
      <property name="stealingEnabled" value="true"/> 
      <property name="messageExpireTime" value="1000"/> 
     </bean> 
    </property> 

    <property name="failoverSpi"> 
     <bean class="org.gridgain.grid.spi.failover.jobstealing.GridJobStealingFailoverSpi"> 
      <property name="maximumFailoverAttempts" value="10"/> 
     </bean> 
    </property> 

對於第一個,activeJobsThreshold值告訴了多少份工作可以在同一時間運行的節點。這比改變執行程序服務中的線程數量更有效。此外,它可以進行一些負載平衡,並且空閒節點可以從其他節點「偷走」工作,從而更快地完成所有工作。

還有更好的方法來做到這一點。 Gridgain可以根據每個節點的測量性能來確定作業的大小,顯然,這可以提高整體性能,特別是如果網格中有快速和慢速的計算機。

爲了未來,我將研究配置文件並將其與javadocs進行比較,以瞭解所有不同的選項,從而使其運行速度更快。

2

我想通了。

首先,有一個xml配置文件,它控制網格節點如何操作的細節。缺省配置文件位於GRIDGAIN_HOME/config/default-spring.xml中。我可以編輯它或複製它,並在啓動網格節點時將新文件傳遞給ggstart.sh。我需要添加的兩兩件事是:

<property name="networkTimeout" value="25000"/> 

其中設置了網絡消息到25秒超時,並

<property name="executorService"> 
     <bean class="org.gridgain.grid.thread.GridThreadPoolExecutor"> 
      <constructor-arg type="int" value="1"/> 
      <constructor-arg type="int" value="1"/> 
      <constructor-arg type="long"> 
       <util:constant static-field="java.lang.Long.MAX_VALUE"/> 
      </constructor-arg> 
      <constructor-arg type="java.util.concurrent.BlockingQueue"> 
       <bean class="java.util.concurrent.LinkedBlockingQueue"/> 
      </constructor-arg> 
     </bean> 
    </property> 

前兩個構造函數參數1個線程啓動和最大線程大小爲1.執行程序服務控制執行網格加工作業的線程池。默認值爲100,這就是爲什麼我的應用程序被壓垮,心跳超時。

另一個變化,我不得不讓我的代碼是:

scalar.apply("/path/to/gridgain home/config/custom-spring.xml") { 
    result = grid !*~ 
     (for (x <- (1 to threads).map(i => ((i - 1) * iterations/threads, i * iterations/threads))) 
     yield() => maxAppliedRange(x, kalmanBruteForceObj.performKalmanIteration), (s: Seq[(Double, Long)]) => s.max) 
    } 

由於沒有。適用聲明它啓動網格節點與所有默認選項,而不是配置文件與上面的編輯,這是我想要的是。

現在它完全按照我需要的那樣工作。我可以將任務分成小塊,即使是最弱,最慢的電腦也可以爲這項工作做出貢獻。

+0

但調整配置後,GridGain應用程序的性能如何與一臺機器上的多線程應用程序進行比較?你有沒有找到你的問題的答案? – 2010-12-19 11:40:50

+0

我還沒有測試過,但我毫不懷疑它會更快。改進將基於我的其他3臺電腦的CPU功率。多線程應用程序的性能等同於在同一臺機器上運行兩個執行線程的gridgain。我會在測試時發佈改進的內容。 – Jim 2010-12-19 15:25:15

+0

我被告知,限制執行程序服務並不是實現我所需要完成任務的唯一方法。由於可以設置網格來處理多種作業,因此如果我的應用程序使用GridGain的Collision SPI代碼告訴節點如何處理多個作業以及同時處理多少作業,那更好。我會發布我的解決方案,一旦我得到它的工作。 – Jim 2010-12-19 15:27:36