2014-11-21 31 views
0

在我們的項目中,我們正在測試事務如何在分佈式環境中工作。作爲項目的一部分,我們正在測試GridGain 6.5.5的開源版本。GridGain事務問題

我們在下面的測試用例面臨很多問題

  1. 我們沒有任何額外的規則測試緩存。
  2. 緩存存儲一個id-String作爲鍵,BigDecimal作爲一個值存儲。
  3. 我們正在對來自6,12和18個客戶端的第一個緩存的值進行基本操作(加法和減法)的測試。一個操作看起來像「從A中減去X,將X加到B中」。
  4. GridGain應用程序在WildFly中作爲.war文件進行部署。
  5. 客戶端使用HTTP通過部署​​的GridGain連接到WildFly併發送要執行的操作列表(我們正在測試具有1個操作,50,500,1000,5000操作的批處理)。
  6. 我們正在使用事務測試羣集多節點模式,我們已經使用的配置文件被進一步附加。
  7. 我們已經分別測試了悲觀和樂觀的交易。
  8. 如果結果值等於虛擬模式,我們稱結果值爲「一致」:一個客戶端,批次= 1,一個節點。我們有一個用於交叉檢查的虛擬程序(其在此模式下的結果總是等於本地模式下的GridGain)。

的問題是:

  1. 如果我們在做交易的,是(從一個密鑰值中減去,添加到另一個),我們面臨着兩個問題:死鎖和不一致的,如果我們沒有得到死鎖。不一致的值的數量很少,但我們無法避免它 - 每1000個鍵值約爲12。
  2. 如果我們改變我們的請求以便在每個客戶端按鍵排序(所以操作順序可能會改變),我們可以避免死鎖和不一致。但是,我們又遇到了另外一個問題:如果該批次至少有500個,那麼我們就會發生無法結束的交易失敗。如果批量很小,我們就會完全失敗GridGain(它不響應當前查詢)。
  3. 一切工作非常緩慢,我們幾乎沒有在同一時間的CPU負載(批次= 1000操作約6秒)。可以嗎?

我們的硬件:

8X戴爾M620刀片,256GB內存,2×8核至強E2650v2,萬兆以太網網絡。

附:

  1. GridGain樂觀的配置:https://gist.github.com/al-indigo/a2824aa62a3af8b18932
  2. GridGain悲觀配置:相同,但與
  3. GridGain日誌第二個問題:https://gist.github.com/al-indigo/233058772418fba8d341

回答

0

(從移動評論)

爲了避免死鎖,您需要確保以相同的順序獲取鎖。在處理任何記錄系統中的事務時,必須完成此操作,即Oracle數據庫或GridGain數據網格。

至於性能,應該是非常快的。這很可能是一個配置問題。我可以問你提供一個可重複的例子嗎? (你可以用pastbin.com分享您的代碼)

+0

只要我們注意到,僵局解決方案不起作用,當然我們開始避免以手動方式死鎖(如你所說)。儘管如此,在傳統的DBMS中使用了一些算法:http://en.wikipedia.org/wiki/Deadlock_provision。所以我們認爲它也可以在GridGain中。 但這不是主要觀點。 主要問題是相當少量的數據處理失敗(日誌附加到原始問題)和速度。 下面是我們使用的示例代碼(configgain for gridgain也在這個問題中):https://gist.github.com/al-indigo/438559003a7821c9779e – 2014-11-24 16:33:25

+0

您可以添加測試用具代碼嗎?我們試圖以與您相同的方式重現它是至關重要的。 – Dmitriy 2014-11-24 20:31:08

+0

我不確定我們可以因爲NDA。一般來說,我們使用Ansible和我們自己的劇本來部署所有內容並運行測試。自測試開始以來,除GridGain和Java客戶端應用程序之外,其他軟件層沒有任何影響。我可以(私下 - 請給我一個鏈接到你的電子郵件)我們的中間結果表,以證明一切工作沒有預期的那麼快。 – 2014-11-25 12:16:58

2

我已經看過日誌和我看到下面的JVM參數

-Xms64m -Xmx512m -XX:MaxPermSize=256m 

隨着高度的你正在運行到長GC暫停概率,以及這就是您獲取鎖定超時例外的可能原因。通過像這樣的內存設置,JVM可以進入GC暫停5分鐘,在此期間,世界被鎖定,無法完成任何操作。爲了證實這一點,你可以用下面的JVM選項收集GC日誌:

-Xloggc:/opt/server/logs/gc.log \ 
-verbose:gc \ 
-XX:+PrintGC \ 
-XX:+PrintGCTimeStamps \ 
-XX:+PrintGCDetails 

我的建議是關於分配每個JVM最大10GB,並開始更多的JVM實例。您還可以嘗試使用GridGain的堆外存儲器功能,並在主Java堆外分配大內存空間 - http://doc.gridgain.org/latest/Off-Heap+Memory。另外,請看看GC調整參數在這裏:http://doc.gridgain.org/latest/Performance+Tips#PerformanceTips-TuneGarbageCollection

另一個大的建議是,你不應該做個人的get(...)在您的交易操作,但做了一個GETALL(... )調用來代替:

try (GridCacheTx tx = balanceCache.txStart()) { 

    /* 
    * ============================================== 
    * This while loop calls get(...) many times and acquires one lock at a time. 
    * It should be replaced with one getAll(...) call. 
    * =============================================== 
    */ 
    while (changes.hasNext()) { 
     Map.Entry<String, BigDecimal> ent = changes.next(); 

     BigDecimal oldBalance = balanceCache.get(ent.getKey()); 

     balanceCache.putx(ent.getKey(), oldBalance.add(ent.getValue())); 
    } 

    tx.commit(); 
} catch (GridException ex) { 
    throw new Exception("transaction failed", ex); 
}