我有一个3节点的Hazelcast群集,该群集具有大量并发活动。随着负载的增加,我一直注意到与集群中的项目进行交互时性能会周期性下降。例如,从地图读取通常需要毫秒,但在其他情况下则需要10+秒。这并非孤立于单个集合,而是在集群中的许多不同集合中发生。这些延迟似乎是随机的,没有关于何时发生的明显模式。
我还从用于存储某些潜在大对象的地图的诊断日志中注意到了一些操作缓慢的警告。基于这些观察,我怀疑我遇到文档(https://docs.hazelcast.org/docs/3.9.1/manual/html-single/index.html)中所述的“虚假共享”
错误共享分区-两个完全独立的数据结构共享同一分区。例如,如果有一个地图雇员和一个地图订单,则在分区25上运行的方法employee.get(“ peter”)可能会被在分区25上运行的orders.get(1234)方法阻止。如果有独立的数据结构共享同一个分区,对一个数据结构的缓慢操作会减慢其他数据结构的速度。
虚假感知分区的操作线程共享-每个操作线程负责在多个分区上执行操作。例如,线程1可能负责分区0、10、20等,线程2可能负责分区1、11、21等。如果对分区1的操作花费大量时间,它将阻塞执行分区11的操作,因为它们都映射到相同的操作线程。
我的第一个想法是,我需要找到一种方法来减小地图中对象的大小,这会警告操作缓慢,但是在进行潜在的大型重构之前,我想确认一下“错误共享”实际上是根本原因。有什么方法可以检测何时发生这种情况吗?例如,是否有任何日志记录或JMX指标显示单个分区或单个操作线程排队的操作数量?