【问题标题】:Hazelcast CP Subsystem FencedLock memory usageHazelcast CP 子系统 FencedLock 内存使用情况
【发布时间】:2020-03-11 21:05:16
【问题描述】:

设置:

  • Hazelcast:3.12.3
  • Spring Boot:2.1.6
  • Java:1.8
  • 参数:-XX:+UseG1GC
  • Xms7g -Xmx7g 这些在 Docker 中运行:openjdk:8
  • 它们在专用的 vmware 节点 CentOS 7.5.1804 中运行

我总共有 7 个节点组成一个 hazelcast 集群。 其中5人是CP成员。组大小设置为 3。 其他值得注意的配置更改:setSessionTimeToLiveSeconds(200)、setMissingCPMemberAutoRemovalSeconds(240)。

用法: 我有 8 个客户端尝试获取长键的围栏锁,接口缓存 5 分钟。键几乎总是不同的,但在某些情况下,我们会收到同一个键的许多操作,我们希望避免这些键的异步更新。 过去我为此使用 IMap,但我注意到它并不总是尊重锁。 Fenced 锁在达到一定的内存使用率之前似乎表现得非常好。

问题: 我观察到的是,一个 cp 成员被大量使用,并且 G1 Old Gen 堆随着时间的推移而略微增加。一天之内就达到了 5GB。即使在我停止锁定请求之后,内存也永远不会被清除。

我尝试创建两个组以利用集群中的更多节点,这确实有所帮助,但问题仍然存在,一些节点上的已用堆随着时间的推移而增加,并且有时它们变得非常慢。

问题: 我究竟做错了什么?这甚至是该工具的有效用例吗?

【问题讨论】:

  • 您是为每把钥匙创建一个新锁还是使用同一个锁?复制器测试代码会有所帮助。
  • 对于唯一键,我将锁缓存 5 分钟,因此如果我收到 30 次相同 ID 的更新,则锁会被重用。但在 90% 的情况下,会创建一个新锁。负载在一分钟内大约 10k 锁定。我想知道的是什么可以在记忆中徘徊好几天。我希望锁定对象在一段时间后过期。我看不到手动清理它们的方法,所以我想我的用例不是这意味着什么。
  • 我在考虑和小组一起玩。我认为组可以被销毁,所以我可以在几个组之间切换以删除未使用的锁。

标签: java locking hazelcast distributed-lock


【解决方案1】:

锁对象不会自行过期,Hazelcast 不会自动对未使用的锁执行垃圾回收。如果您不再需要锁,可以使用lock.destroy() 将其销毁,否则您将面临运行OOME 的风险。

【讨论】:

  • 我不认为它按我想要的方式工作。如果我破坏了锁,我将无法再次创建它。我进行了基于时间的销毁,如果在一定时间内没有访问锁,我将其销毁,但之后如果我尝试使用相同的密钥获取锁,它会说它已经被销毁。
  • 不确定您打算实现什么。如果创建了对象,它们会消耗一些内存。如果创建了很多对象,那么它们将消耗大量内存,如果您不清理内存,那么您的所有内存最终都会被利用。当您通过删除不需要的对象来清理内存时,当然这些对象将不存在。我在这里错过了什么?
  • 假设我现在想锁定一个对象,两个小时后。如果我创建锁,它会占用空间,如果我有一段时间不使用它,我想删除它。但是当我再次尝试创建它时,我得到了一个已经被破坏的异常。我想我会使用 IMap 锁,据我所知可以清理未使用的锁。
  • 您找到正确的处理方法了吗?我处于同样的情况,如果不使用,我想销毁() FencedLock,然后在以后的时间点按需重新创建。
猜你喜欢
  • 2019-09-21
  • 1970-01-01
  • 2015-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2011-10-15
相关资源
最近更新 更多