首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GridGain事务问题

GridGain事务问题
EN

Stack Overflow用户
提问于 2014-11-21 19:45:10
回答 2查看 234关注 0票数 0

在我们的项目中,我们正在测试事务如何在分布式环境中工作。作为项目的一部分,我们正在测试GridGain 6.5.5的开源版本。

在以下测试案例中遇到了许多问题:

  1. 我们正在测试没有任何附加规则的缓存。
  2. 缓存将id-字符串存储为键,BigDecimal存储为值。
  3. 我们正在测试来自6、12和18个客户端的第一个缓存值的基本操作(加法和减法)。一个操作看起来像“从A中减去X,将X加到B”。
  4. GridGain应用程序作为.war文件部署在WildFly中。
  5. 客户端使用HTTP使用已部署的WildFly连接到GridGain,并发送要执行的操作列表(我们正在用1次操作、50次、500次、1000次、5000次操作测试批处理)。
  6. 我们正在用事务测试集群多项式模式,我们使用的配置文件将被进一步附加。
  7. 我们分别测试了悲观和乐观的交易。
  8. 如果结果值等于虚拟模式:一个客户端、batch=1、一个节点,我们将其称为“一致的”。我们有一个用于交叉检查的虚拟程序(它在这种模式下的结果总是等于本地模式下的GridGain )。

问题是:

  1. 如果我们按照-is(从一个键值减去另一个键值)进行事务处理,那么我们将面临两个问题:死锁和不一致(如果没有死锁)。不一致值的数量很小,但我们无法避免--大约是每1000个键值中有12个。
  2. 如果我们转换要按每个客户端中的键排序的请求(因此操作顺序可能会改变),我们就可以避免死锁和不一致。但我们还有另一个问题:如果批处理至少有500次,我们就会有无休止的事务失败。如果批处理较小,则GridGain完全失败(它不响应当前查询)。
  3. 所有的工作都非常慢,我们几乎没有同时的CPU负载(对于batch=1000操作大约是6秒)。可以吗?

我们的硬件:

8x戴尔M620刀片,256 8x内存,2x8核心Xeon E2650v2,10 RAM网络。

附加:

  1. GridGain乐观配置:https://gist.github.com/al-indigo/a2824aa62a3af8b18932
  2. GridGain悲观配置:相同但与
  3. 第二期GridGain日志:https://gist.github.com/al-indigo/233058772418fba8d341
EN

回答 2

Stack Overflow用户

发布于 2014-11-25 17:29:23

我已经查看了日志,并看到了以下JVM参数

代码语言:javascript
复制
-Xms64m -Xmx512m -XX:MaxPermSize=256m

在很高的概率下,您会遇到长GC暂停,这可能是导致锁定超时异常的原因。有了这样的内存设置,JVM可以进入GC暂停长达5分钟,在此期间,世界被锁定,什么也做不了。要确认这一点,可以使用以下JVM选项收集GC日志:

代码语言:javascript
复制
-Xloggc:/opt/server/logs/gc.log \
-verbose:gc \
-XX:+PrintGC \
-XX:+PrintGCTimeStamps \
-XX:+PrintGCDetails

我的建议是为每个JVM分配大约10 to的最大值,并启动更多的JVM实例。您还可以尝试使用离堆内存()的GridGain特性,并在主要的Java堆- http://doc.gridgain.org/latest/Off-Heap+Memory之外分配大量内存空间。另外,请在这里查看GC调优参数:http://doc.gridgain.org/latest/Performance+Tips#PerformanceTips-TuneGarbageCollection

另一个重要建议是,您不应该在事务中执行单个get(.)操作,而是执行一个getAll(.)调用:

代码语言:javascript
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2014-11-24 08:32:22

(从评论中移出)

为了避免死锁,您需要确保以相同的顺序获得锁。在处理任何记录系统(无论是Oracle还是GridGain数据网格)中的事务时,都必须这样做。



至于表演,应该很快。很可能这是一个配置问题。我可以请你提供一个可复制的例子吗?(您可以使用pastbin.com共享代码)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27069110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档