Terracotta性能和技巧

9
我刚学习了如何使用Terracotta,大约一个月前发现了这个非常酷的技术。
基本上我想做的是:
我的根(记录系统)是一个ConcurrentHashMap。
主要的Instrumented Class是一个“JavaBean”,有30多个字段,我希望它们存在于HashMap中。
将会有大约20000个这样的JavaBeans存在于HashMap中。
每个bean至少有5个字段将会每5秒更新一次。
(我之所以使用Terracotta是因为这些JavaBeans需要在JVM和节点间进行访问。)
有比我更有经验的TC用户有什么建议吗?性能至关重要。
还有其他类似应用的例子吗?
2个回答

7
您可能会发现,在一个锁定范围内批量执行多个更改会更有效率。每个同步块/方法都形成一个写事务(假设您使用写锁),必须将其发送到服务器(可能返回到其他节点)。通过在一个锁下更改一堆字段,可能是在一堆对象上,可以减少创建事务的开销。至少可以尝试一下。
分区也是提高性能的关键方法。只需将更改发送到实际使用对象的节点即可。因此,如果您可以将通常触摸特定对象的节点进行分区,则可以减少必须在集群中发送的更改数量,从而提高性能。 unnutz有关使用CHM或CSM的建议是很好的。 CHM允许更大的并发性(因为每个内部段可以被锁定并同时使用),请确保尝试使用更大的段计数。 CSM对于每个条目实际上只有一个锁,因此在N大小的表中实际上有N个分区。这可以极大地减少锁争用(代价是管理更多的内部锁对象)。即将推出的CSM变化将大大降低锁定管理成本。
通常我们发现一个好的策略是:
  1. 构建性能测试(应该是多线程和多节点的,类似于您的应用程序(或实际应用程序!)
  2. 调整对象 - 查看开发控制台中的集群对象图,找到根本不需要集群的对象 - 有时会意外发生(删除或使用瞬态字段剪切集群)。有时,您可能会将日期聚类在一起,而长整型则可以。虽然这只是一个小改变,但每个地图条目就是一个对象,这可能会有所不同。
  3. 调整锁定 - 使用开发控制台中的锁定分析器查找热锁或锁定范围太窄或太宽的锁定。聚集统计记录器还可以帮助查看事务大小。
  4. 调整GC和DGC - 调整JVM垃圾收集,然后通过打开更改young gen gc的频率来调整Terracotta分布式GC。
  5. 调整TC服务器 - 这里有很多非常详细的调整要做,但通常在上述内容调整之前没有太大价值。

也可以随时在Terracotta论坛上提问 - 所有工程,现场工程,产品管理都会在那里观看并回答问题。


3

首先,我建议您也在他们的论坛上提出这个问题。

其次,实际上,应用程序在Terracotta上的性能取决于发生的写事务数量。因此,您可以考虑使用ConcurrentStringMap(如果您的键是字符串)或ConcurrentHashMap。请注意,从性能角度来看,CSM比CHM要好得多。

最后,POJOs是懒加载的。这意味着每个属性都是按需加载的。

希望这可以帮助到您。

干杯


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接