2014-11-21 44 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); 
}