点燃堆分层不起作用

Ignite Off heap Tiered doesn't work

我正在使用 Ignite 的数据网格并想测试堆外分层模式。我在不同的机器上有 1 个服务器和 1 个客户端作为网格的一部分。以下是我创建缓存所遵循的步骤:

  1. 在一个节点上启动服务器。
  2. 在另一个节点上启动客户端(使用 Discovery spi 连接到服务器)并创建缓存和近缓存,并将 10,000 个条目加载到缓存中。
  3. 缓存内存模式为OFFHEAP_TIERED,堆外内存使用方法CacheConfiguration#setOffHeapMaxMemory(int size)设置为零。
  4. 打开 Ignite CLI(visor)并检查存储在堆外的条目数和存储在堆上的条目数。

我遇到的奇怪的事情是,甚至没有一个条目存储在堆外。遮阳板显示客户端和服务器上存储在堆上的所有条目。但是,如果我不使用近缓存,那么所有条目都存储在堆外。

我想知道这是否是遮阳板显示的统计信息有问题,或者当启用近缓存时 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);

  }
}

这是 Ignite 遮阳板上命令 'cache' 的输出,它在客户端机器上 运行ning

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    |
+-------------------------------------------------------------------------------------------------------------------+

如您所见,visor 显示所有条目都在堆中,其中 none 存储在堆外。

此外,如果我从服务器创建并加载缓存并启动客户端(它什么都不做),那么所有条目都存储在堆外。

除此之外还有其他行为可能会带来更多启发。

  1. Post上面提供的步骤,如果你启动另一个服务器节点,新的服务器节点将缓存条目存储在堆外内存中(假设设置了备份)。

  2. 当你运行客户端再次清除现有缓存并添加 再次是数据,在服务器上,部分数据在堆上,部分数据在关闭 堆.

我调查了 Ignite 炒锅,如您所见。

您可以跟踪此问题以修复 https://issues.apache.org/jira/browse/IGNITE-4662

或者不使用近缓存