低加载到缓存速度

时间:2014-01-08 16:58:46

标签: caching infinispan

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

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());

我可能做错了什么?

2 个答案:

答案 0 :(得分:1)

我并不完全了解所有异步模式专业,但我担心两阶段提交(准备和提交)中的某些内容可能会强制阻止RPC =>等待网络延迟=>慢下来。

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

另一种选择可能是通过putAll进行批量加载(有数十或数百个条目,取决于您的条目大小),但此消息的路由并不是很聪明。在交易模式中,我猜它会表现得更好。

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

答案 1 :(得分:1)

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

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

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