【问题标题】:Hazelcast NearCache doesn't have the expected effect on performanceHazelcast NearCache 对性能没有预期的影响
【发布时间】:2015-06-17 11:34:30
【问题描述】:

我们有一个应用程序在 1 或 2 个节点上运行,具体取决于环境,并具有基于 Hazelcast 的共享缓存。

应用程序上的一个请求会在此缓存上触发大约 1000 个请求(所有缓存命中)。

在单节点配置中,这很好用。具体来说,每个请求需要不到 10 毫秒的时间。

但是如果我们使用 2 个节点,每个缓存请求大约需要 20-200ms。我们认为这是因为 Hazelcast 从远程节点获取数据,这当然涉及网络流量。因此,我们将其配置为使用 NearCache,据我们了解,这应该会导致与单个本地缓存大致相同的访问速度。但它没有,它似乎对性能没有任何影响。

所以现在我想知道:

  • 如何检查 NearCache 配置是否真的有效?
  • 我怎样才能获得接近本地缓存的读取性能,但更新(异步)通信到/所有远程缓存,我认为我可以通过配置 NearCache 获得?

我们使用以下配置初始化缓存:

HazelcastConfiguration.getOrCreateCache(
                cacheName,
                new CacheConfig<K, CR>()
                        .setNearCacheConfig(new NearCacheConfig())
                        .setExpiryPolicyFactory(
                                HazelcastConfiguration.createExpiryPolicyFactory(expiryAfterModification)),
                cacheManager
        );

【问题讨论】:

    标签: java caching hazelcast near-cache


    【解决方案1】:

    这取决于很多事情,但 20/200 毫秒很多。当我们在 1 个标准 1 GbE 网络上运行 4 节点集群基准测试(4 个双插槽至强机器)时,99 个百分点远低于 1 毫秒。我们在这里说的是没有近缓存。

    Near 缓存应该提供非常好的性能,因为如果数据是本地缓存的,那么调用是本地的 + 跳过用于操作执行的整个内部基础设施(至少对于 IMap 和 Near 缓存;不完全确定 Cache .

    您可以尝试敲击同一组键吗?只是为了确保您正在访问附近的缓存。

    您使用什么作为键和值?它们是大还是序列化不友好?

    我仍然遇到问题;快速尝试 IMap 并启用近缓存并检查您是否发现有很大差异。

    【讨论】:

    • 谢谢,确认这非常慢。我们实际上只有一个键(一个字符串)。该值本身是一个包含数千个条目(字符串键和简单对象值)的 Map。所以它可能相当大。
    • 啊……猴子从笼子里出来了(荷兰谚语)。可能怀疑您的性能问题是每次读取都需要完全反序列化这个大值。您可以尝试切换到 HZ 3.5 并在近缓存上以内存格式设置 OBJECT。如果我没记错的话,有一个优化应该跳过近缓存的反序列化。
    • 如果这不能解决问题,那么也许切换到更快的序列化机制。也许通过子类化哈希图并使用 Hazelcast 序列化 API 之一,如 DataSerializable。 Java 序列化很慢。
    • 我其实是在昨天离开办公室之前切换到内存格式的OBJECT。我今天会得到结果。
    • 切换到内存格式的OBJECT没有效果,但是我没有切换到3.5。我现在正在尝试切换到 3.5,但在配置 NearCache stackoverflow.com/q/30913938/66686 时遇到问题
    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 2019-05-02
    • 2015-03-04
    • 2011-11-12
    • 2014-01-05
    • 1970-01-01
    • 2019-09-04
    • 2013-05-08
    相关资源
    最近更新 更多