Apache Ignite缓存清除仍在内存中。

3
在我们的apache ignite集群稳定性测试中,我们遇到了一个与内存相关的问题,使用的堆空间增加到100%,并且没有像我们预期的那样下降。这就是我们所做的:
创建了一个具有逐出策略FifoEvictionPolicy(最大值:10000,批处理大小:100)的缓存 20个同时运行的线程,执行以下场景数小时: 向缓存中添加唯一条目,然后获取该值以验证已添加。 在测试期间,此场景创建了约230万个条目。
我们的期望是,由于我们相当受限制的驱逐策略最多为10000个条目,因此内存应该已经稳定。然而,内存仅持续上升,直到达到最大堆大小。请参见附带的内存图:
我们的问题是: 即使进行逐出,条目使用的内存仍然被分配?
需要补充的一件事是,我们执行了相同的测试,但在添加条目之后删除了它。现在内存稳定了:
更新包含测试用例和注释。
下面是一个简单的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);    
  }
}

我们正在使用Apache Ignite 1.7版本。 - Stefan Vahlgren
你的完整配置是什么? - Valentin Kulichenko
驱逐策略: FifoEvictionPolicy,最大值为10000,批处理大小为100过期策略: 12小时缓存模式: REPLICATED同步模式: CacheWriteSynchronizationMode.FULL_SYNC备份数: 0 - Stefan Vahlgren
你能提供你正在运行的测试吗? - Valentin Kulichenko
看起来 TTL 管理器会消耗内存。您能否请尝试一下不使用过期策略,而是使用驱逐策略进行测试? - a_gura
@StefanVahlgren 我已经创建了一个问题,你可以跟踪它:https://issues.apache.org/jira/browse/IGNITE-3948 - a_gura
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接