【发布时间】: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