【发布时间】:2014-08-07 07:21:09
【问题描述】:
由于 Hazelcast 2.5 中的一个已知(已修复)错误,我们决定这将是我们项目的下一个升级候选者。但是在加入最新版本(3.2.2)之后,我们的表现很糟糕。
我们使用 Hazelcast 的方式:
- 两个节点
- 多个 IMap 实例(总共约 7 个地图)
- 两个节点都更新地图
- 地图上的大量阅读
- 启用近缓存以加快读取速度
使用 Hazelcast 2.5 时,我们没有使用 map.values(),而是提供了所有包含的键 map.getAll(containedKeys) 的列表,我们获得了出色的性能。我们通过将EntryListener 添加到将包含密钥存储在并发集中的映射来跟踪包含密钥的方式。这是一位同事添加的,感觉就像是 hack,但效果却很不错。
现在,当我们升级到 Hazelcast 3.2.2 时,我们会立即看到 java.io 的问题,例如看看 AppDynamics 的以下 sn-p:
com.hazelcast.map.proxy.MapProxyImpl:getAll:326 (method time = 0 ms, total time = 18938 ms)
com.hazelcast.map.proxy.MapProxySupport:getAllObjectInternal:495 (method time = 0 ms, total time = 18938 ms)
com.hazelcast.map.MapService:toObject:852 (method time = 0 ms, total time = 18938 ms)
com.hazelcast.spi.impl.NodeEngineImpl:toObject:156 (method time = 0 ms, total time = 18938 ms)
com.hazelcast.nio.serialization.SerializationServiceImpl:toObject:221 (method time = 0 ms, total time = 18938 ms)
com.hazelcast.nio.serialization.StreamSerializerAdapter:read:59 (method time = 0 ms, total time = 18938 ms)
com.hazelcast.nio.serialization.DefaultSerializers$ObjectSerializer:read:185 (method time = 0 ms, total time = 18938 ms)
java.io.ObjectInputStream:readObject:370 (method time = 3398 ms, total time = 18938 ms)
java.io.ObjectInputStream:readObject:370 (method time = 15540 ms, total time = 15540 ms)
这是我们在 Hazelcast 2.5 中没有看到的,但在 3.2.2 中确实有。它使我们的应用程序完全停止。再次用 2.5 替换 jar(并将 Entry 重命名回 MapEntry),没有任何问题。
这可能是什么原因造成的?也许它不再使用近缓存?
【问题讨论】:
-
有没有机会快速构建自己的快照并尝试一下?我知道有一个 nearcache 错误,但不确定它是否适用于这种情况。
-
我已经修复了这个:github.com/hazelcast/hazelcast/pull/2523 它修复了 loadClass 但这个 readObject 现在是瓶颈。请指出一个可能的补丁/方向。
-
Java 标准序列化永远是瓶颈。如果您想要高速,请不要使用它或至少使用 j.i.Externalizable。
-
@RoyvanRijn:Hazelcast 的代码库仍在经历惊人数量的代码流失。我们已经看到从一个小版本到另一个小版本的性能大幅波动。我的建议是坚持使用最适合您的特定版本,并尝试在该版本的单点版本中修复您的错误。
-
您正在使用 Java Serializable。我已经看到了一些问题;为了快速检查,您可能会切换到不同的序列化程序,看看这是否会提高性能。
标签: java java-io hazelcast appdynamics