2009-04-25 70 views
9

我刚刚在一个月前发现它后学习如何使用兵马俑。这是一项非常酷的技术。兵马俑的性能和技巧

基本上我想做的事:

我的根(记录系统)是一个ConcurrentHashMap的。

主要的Instrumented类是一个“JavaBean”,有30个左右的字段,我想在HashMap中存在。

在Hashmap中将会有大约20000个JavaBean存在。

每个bean都有(至少)5个字段,每5秒会更新一次。

(我用兵马俑这样做的原因是因为这些JavaBeans的需要在不同的JVM和节点访问。)

任何人比我更TC经验,有什么秘诀?性能是关键。

其他类似的应用程序的任何示例?

回答

7

您可能会发现一个下锁定范围是配料一些变化会表现得更好。每个同步块/方法都会形成写入事务(假设您使用写入锁定),必须将其发送到服务器(并可能退回到其他节点)。通过改变一堆字段,可能在一个锁下的一堆对象上,可以减少创建事务的开销。至少可以玩的东西。

分区也是提高性能的关键方法。更改只需发送给实际使用对象的节点。因此,如果可以划分哪些节点通常会触及特定对象,从而减少必须在集群周围发送的更改数量,从而提高性能。

unnutz关于使用CHM或CSM的建议是好的。 CHM允许更高的并发性(因为每个内部分段可以同时被锁定和使用) - 确保也尝试更大的分段数量。 CSM实际上每个条目有一个锁,所以N个表中有N个分区。这可以大大减少锁争用(以管理更多内部锁对象为代价)。 CSM即将发生的变化将使锁管理成本大大降低。

一般来说,我们发现一个好的策略是:

  1. 建立一个性能测试(应该是多线程和多节点,类似于您的应用程序(或您的实际应用!)
  2. 调整对象 - 在开发控制台中查看您的聚簇对象图,以查找根本不需要聚集的对象 - 有时会偶然发生(使用瞬态字段删除或剪切群集)。有时候,你可能会聚集一个日期,一个长期会做的事情。小改动,但这是每个地图条目的一个对象,这可能会有所作为。
  3. 调整锁定 - 使用开发控制台中的锁定分析器来查找太窄或太宽的热锁或锁。群集统计记录器也可以帮助查看事务大小。
  4. 调整GC和DGC - 调整JVM垃圾回收,然后调整Terracotta分布式GC,方法是打开更改young gen gc的频率。
  5. 调谐TC服务器 - 很多非常详细的调音在这里完成,但通常不值得,直到上面的东西被调整。

随意询问Terracotta forums - 所有的工程,现场工程,产品管理都在那里观察并回答。

3

首先,我建议你也在他们的论坛上提出这个问题。其次,实际上,你的应用程序聚集在Terracotta willl上的性能取决于发生的写入事务的数量。所以你可以考虑使用ConcurrentStringMap(如果你的键是字符串)或ConcurrentHashMap。请注意,从性能角度来看,CSM比CHM好得多。

毕竟,POJO是懒洋洋地装载的。这意味着每个属性都按需加载。

希望有所帮助。

干杯