2017-01-28 35 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 –

回答