2014-01-08 22 views
0

我在3節點安裝中使用Infinispan 6.0.0(每個條目分佈式緩存,每個條目有2個副本,沒有寫入永久存儲),我只是逐行讀取文件,並將該行的內容存儲到緩存中。速度對我來說似乎有點低(我可以在SSD上實現更多的寫入(永久性存儲),而不是在Infinispan的RAM中),但測試代碼中沒有任何明顯的瓶頸(我正在使用緩衝輸入流,當然他們的限制沒有達到至於現在,我能寫的每個條目100K〜45秒,不滿足我假設簡化代碼片段:。低負載到緩存速度

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

我應該怎麼做來可能做錯了

回答

1

我並不完全瞭解所有異步模式特性,但我擔心兩階段提交(Prepare and Commit)中的某些內容可能會強制阻止RPC =>等待網絡延遲=>減慢速度。

你需要交易行爲嗎?如果沒有,請將其關閉。如果您真的需要它,您可以僅禁用自動提交功能,並通過非事務性操作加載羣集。或者,您可以嘗試一個階段提交。

另一個選項可能是通過putAll進行批量加載(數十或數百個條目,取決於您的條目大小),但此消息的路由並不真正智能。在交易模式下,它可能表現更好一些,我猜。

如果您只想快速加載集羣並對其進行操作,則最後一個選項可能會將批量數據傳輸到每個節點,而無需Infinispan(使用您自己的JGroups通道或僅使用套接字),並將所有節點CACHE_MODE_LOCAL標誌。

1

默認情況下,Infinispan遵循返回前一個值的Map.put()合同,因此即使您使用的是DIST_ASYNC高速緩存模式,仍然隱含地爲每個放置執行同步cache.get()

您可以通過兩種方式避免這種情況:

  • configurationBuilder.unsafe().unreliableReturnValues(true)將打壓遠程查找有關緩存中的所有操作。
  • cache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).put(k, v)將禁止單個操作的遠程查找。