2017-01-28 40 views
1

我使用Ignite的數據網格並想測試堆堆疊模式。我有1個服務器和1個客戶端作爲網格在不同機器上的一部分。以下是我創建緩存時遵循的步驟:Ignite Off堆分層不起作用

  1. 在一個節點上啓動服務器。
  2. 在另一個節點上啓動客戶端(使用Discovery spi連接到服務器)並創建一個高速緩存以及一個近高速緩存,並將10,000個條目加載到高速緩存中。
  3. 緩存內存模式爲OFFHEAP_TIERED,使用CacheConfiguration#setOffHeapMaxMemory(int size)方法將堆內存設置爲零。
  4. 打開Ignite CLI(遮陽板)並檢查存儲在堆中的條目數以及存儲在堆中的條目數。

我遇到的奇怪的事情是,即使是一個單獨的條目也沒有存儲在堆中。遮陽板顯示客戶端和服務器上的所有條目存儲在堆上。但是,如果我不使用附近的緩存,那麼所有的條目都被存儲在堆外。

我想知道這是一個與遮陽板顯示的統計數據有關的問題,還是啓用近高速緩存時Ignite存儲條目的行爲有變化。

這是我的客戶端代碼

public class IgniteClient { 

public static void main(String[] args) { 

    TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder(); 

    // IP has not been shown intentionally 
    ipFinder.setAddresses(Arrays.asList("*.*.*.*")); 

    TcpDiscoverySpi spi = new TcpDiscoverySpi(); 

    spi.setIpFinder(ipFinder); 

    IgniteConfiguration icfg = new IgniteConfiguration(); 

    icfg.setMetricsUpdateFrequency(-1); 

    icfg.setClientMode(true); 

    Ignite grid = Ignition.start(icfg); 

    CacheConfiguration<Integer, String> ccfg = new CacheConfiguration<Integer, String>(); 

    NearCacheConfiguration<Integer, String> ncfg = new NearCacheConfiguration<>(); 

    ccfg.setMemoryMode(CacheMemoryMode.OFFHEAP_TIERED); 

    ccfg.setOffHeapMaxMemory(0); 

    ccfg.setName("data"); 

    ncfg.setNearStartSize(1000); 

    IgniteCache<Integer, String> dataCache = grid.getOrCreateCache(ccfg, ncfg); 

    for (int i = 1; i <= 10000; i++) { 
     dataCache.put(i, Integer.toString(i)); 
    } 

    System.out.println("The entries in data cache are " + dataCache.size(CachePeekMode.ALL)); 


} 

} 

這是我的服務器端代碼

public class IgniteMain { 
public static void main(String[] args) { 

    IgniteConfiguration icfg = new IgniteConfiguration(); 

    icfg.setMetricsUpdateFrequency(-1); 

    Ignite grid = Ignition.start(icfg); 

    } 
} 

這是在客戶機上運行的點燃遮陽命令「緩存」的輸出機器

Time of the snapshot: 01/28/17, 18:23:41 
+===================================================================================================================+ 
| Name(@) | Mode  | Nodes | Entries (Heap/Off heap) | Hits | Misses | Reads | Writes | 
+===================================================================================================================+ 
| data(@c0) | PARTITIONED | 2  | min: 10000 (10000/0)   | min: 0 | min: 0 | min: 0 | min: 0 | 
|   |    |  | avg: 10000.00 (10000.00/0.00) | avg: 0.00 | avg: 0.00 | avg: 0.00 | avg: 0.00 | 
|   |    |  | max: 10000 (10000/0)   | max: 0 | max: 0 | max: 0 | max: 0 | 
+-------------------------------------------------------------------------------------------------------------------+ 

正如你所看到的遮陽板顯示,所有的條目都在堆中,沒有一個他們被堆放在外面。另外,如果我從服務器創建並加載緩存並啓動客戶端(它什麼都不做),那麼所有的條目都會從堆中存儲下來。

爲了補充說明,還有其他可能會導致更多光線的行爲。

  1. 帖子上面提供,如果啓動另一臺服務器節點的步驟,新的服務器節點存儲在離堆內存的緩存條目(假設備份設置)。

  2. 當您再次運行客戶端以清除現有的緩存,然後再添加 的數據,在服務器上,部分數據是在堆和部分在關閉 堆。

+0

你可以指定點燃的版本? – kuaw26

+0

Ignite版本是1.7.0 –

回答