【问题标题】:Low loading into cache speed加载到缓存速度低
【发布时间】:2014-01-26 22:06:10
【问题描述】:

我在 3 节点设置中使用 Infinispan 6.0.0(分布式缓存,每个条目有 2 个副本,不写入持久存储),我只是逐行读取文件并存储这些行' 内容存入缓存。速度对我来说似乎有点低(我可以在 SSD(持久存储)上实现比使用 Infinispan 更多的写入 RAM),但测试代码中没有任何明显的瓶颈(我正在使用缓冲输入流,并且他们的极限肯定没有达到。至于现在,我能够每 45 秒编写 100K 条目,这并不满足我。假设简化代码 sn-p:

while ((s = reader.readLine()) != null) {
    cache.put(s.substring(0,2), s.substring(2,5));
}

CacheManager的创建方式如下:

return new DefaultCacheManager(               
  GlobalConfigurationBuilder.defaultClusteredBuilder()
    .transport().addProperty("configurationFile", "jgroups.xml").build(),
  new ConfigurationBuilder()                          
    .clustering().cacheMode(CacheMode.DIST_ASYNC).hash().numOwners(2)
    .transaction().transactionMode(TransactionMode.TRANSACTIONAL).lockingMode(LockingMode.OPTIMISTIC)
    .build());

我可能做错了什么?

【问题讨论】:

    标签: caching infinispan


    【解决方案1】:

    我并不完全了解所有异步模式的特殊性,但我担心两阶段提交(准备和提交)中的某些东西可能会迫使一些阻塞 RPC => 等待网络延迟 => 减慢。

    您需要交易行为吗?如果没有,请关闭它们。如果你真的需要它,你可以只禁用自动提交功能并通过非事务性操作加载集群。或者,您可以尝试一阶段提交。

    另一个选项可能是通过 putAll 进行大规模加载(具有数十或数百个条目,取决于您的条目大小),但此消息的路由并不是很聪明。我猜在事务模式下它的表现可能会好一些。

    如果您只想快速加载集群然后对其进行操作,最后一个选项可能是将批量数据传输到没有 Infinispan 的每个节点(使用您自己的 JGroups 通道,或仅使用套接字),并使用CACHE_MODE_LOCAL 标志。

    【讨论】:

      【解决方案2】:

      默认情况下,Infinispan 遵循 Map.put() 返回前一个值的约定,因此即使您使用 DIST_ASYNC 缓存模式,您仍然会为每个 put 隐式执行同步 cache.get()

      您可以通过两种方式避免这种情况:

      • configurationBuilder.unsafe().unreliableReturnValues(true) 将禁止远程查找缓存上的所有操作。
      • cache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).put(k, v) 将禁止远程查找单个操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-18
        • 2016-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多