Apache Ignite Cache驱逐仍在内存中

时间:2016-09-12 09:54:35

标签: caching memory ignite

在我们的apache点燃集群的稳定性测试期间,我们得到了一个与内存相关的问题,其中使用的内存堆空间增加到100%并且没有像我们预期的那样下降。这就是我们所做的:

使用驱逐策略创建一个缓存到FifoEvictionPolicy(最大值:10000,batchSize:100) 同时执行以下场景的20个并发线程,持续几个小时: 向缓存添加了一个唯一条目,然后获取该值以验证它是否已添加。 此方案在测试期间创建了大约230万个条目。

我们的期望是由于我们在最多10000个条目时的相当有限的驱逐政策,记忆应该稳定。但是,内存一直保持上升,直到达到最大堆大小。请参阅附加的内存图:

enter image description here

我们的问题是: 为什么条目使用的内存仍然被分配,即使驱逐完成了?

要添加的一件事是,我们执行了相同的测试,但在删除之后我们添加了它。记忆力现在稳定了:

enter image description here

使用测试用例和评论进行更新。

下面你会发现一个简单的junit测试来证明内存泄漏。 @a_gura似乎是正确的 - 如果我们禁用ExpiryPolicy的东西按预期工作。但是如果我们启用ExpiryPolicy,堆似乎会在ExpiryPolicy持续时间内填满。测试用例:

public class IgniteTest {
  String cacheName = "my_cache";
  @Test
  public void test() throws InterruptedException {    
    IgniteConfiguration configuration = new IgniteConfiguration();
    Ignite ignite = Ignition.start(configuration);
    //create a large string to use as test value. 
    StringBuilder testValue = new StringBuilder();
    for (int i = 0; i < 10*1024; i ++) {
      testValue.append("a");
    }    
    CacheConfiguration cacheCfg = new CacheConfiguration();
    cacheCfg.setName(cacheName);
    cacheCfg.setEvictionPolicy(new FifoEvictionPolicy<>(10_000, 100));
    Duration duration = new Duration(TimeUnit.HOURS, 12);    
   cacheCfg.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(duration));
    cacheCfg.setCacheMode(CacheMode.LOCAL);
    cacheCfg.setBackups(0);
    Cache<Object, Object> cache = ignite.getOrCreateCache(cacheCfg);
    String lastKey = "";
    for (int i = 0; i < 10_000_101; i++){
      String key = "key#"+i;
      String value = testValue + "value#"+i;
      log.trace("storing {} {}", key, value);
      if (i % 1_000 == 0) {
        log.debug("storing {}", key);
      }
      cache.put(key, value);
      lastKey = key;
      Thread.sleep(1);
    }
    String verifyKey = "key#1";
    Assert.assertThat("first key should be evicted", cache.containsKey(verifyKey), CoreMatchers.is(false));    
    Assert.assertThat("last key should NOT be evicted", cache.containsKey(lastKey), CoreMatchers.is(true));    
    ignite.destroyCache(cacheName);    
  }
}

1 个答案:

答案 0 :(得分:1)

这已在 Ignite 1.8 中修复:https://issues.apache.org/jira/browse/IGNITE-3948

感谢提交错误的 @a_gura 和开发团队。