在我们的项目中,我们正在测试事务如何在分布式环境中工作。作为项目的一部分,我们正在测试GridGain 6.5.5的开源版本。
在以下测试案例中遇到了许多问题:
问题是:
我们的硬件:
8x戴尔M620刀片,256 8x内存,2x8核心Xeon E2650v2,10 RAM网络。
附加:
发布于 2014-11-25 17:29:23
我已经查看了日志,并看到了以下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分配大约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(.)调用:
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);
}发布于 2014-11-24 08:32:22
(从评论中移出)
为了避免死锁,您需要确保以相同的顺序获得锁。在处理任何记录系统(无论是Oracle还是GridGain数据网格)中的事务时,都必须这样做。
至于表演,应该很快。很可能这是一个配置问题。我可以请你提供一个可复制的例子吗?(您可以使用pastbin.com共享代码)
https://stackoverflow.com/questions/27069110
复制相似问题