[ 
https://issues.apache.org/jira/browse/IGNITE-12096?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16914311#comment-16914311
 ] 

Denis Magda commented on IGNITE-12096:
--------------------------------------

I'm not sure that the recommended way for the used space calculation. Memory 
cleaning can be deferred until the compaction process kicks off:
https://apacheignite.readme.io/docs/memory-defragmentation

Try to adjust the way you do the calculation and see if there is any change:
https://apacheignite.readme.io/docs/memory-metrics#section-memory-usage-calculation

But I still believe that we need to way for next compaction round to purge 
deleted entries from memory. [~DmitriyGovorukhin] does it sound correct?

> Ignite memory metrics incorrect on cache usage contraction
> ----------------------------------------------------------
>
>                 Key: IGNITE-12096
>                 URL: https://issues.apache.org/jira/browse/IGNITE-12096
>             Project: Ignite
>          Issue Type: Bug
>          Components: cache
>    Affects Versions: 2.7
>            Reporter: Colin Cassidy
>            Priority: Critical
>
> When using the Ignite metrics API to measure available memory, the usage 
> figures appear to be accurate while memory is being consumed - but when 
> memory is freed the metrics do not drop. They appear to report that memory 
> has not been freed up, even though it has.
> Reproducer below. This affects Ignite 2.7+.
> {{}}{{import org.apache.ignite.failure.NoOpFailureHandler; }}
> {{import org.junit.Test; }}
> {{public class MemoryTest2 { }}
> {{    private static final String CACHE_NAME = "cache"; }}
> {{    private static final String DEFAULT_MEMORY_REGION = "Default_Region"; }}
> {{    private static final long MEM_SIZE = 100L * 1024 * 1024; }}
> {{    @Test }}
> {{    public void testOOM() throws InterruptedException { }}
> {{        try (Ignite ignite = startIgnite("IgniteMemoryMonitorTest1")) { }}
> {{            fillDataRegion(ignite); }}
> {{            CacheConfiguration<Object, Object> cfg = new }}
> {{CacheConfiguration<>(CACHE_NAME); }}
> {{            cfg.setStatisticsEnabled(true); }}
> {{            IgniteCache<Object, Object> cache = }}
> {{ignite.getOrCreateCache(cfg); }}
> {{            // Clear all entries from the cache to free up memory }}
> {{            memUsed(ignite); }}
> {{            cache.clear(); }}
> {{            cache.removeAll(); }}
> {{            cache.put("Key", "Value"); }}
> {{            memUsed(ignite); }}
> {{            cache.destroy(); }}
> {{            Thread.sleep(5000); }}
> {{            // Should now report close to 0% but reports 59% still }}
> {{            memUsed(ignite); }}
> {{        } }}
> {{    } }}
> {{    }}
> {{    private Ignite startIgnite(String instanceName) { }}
> {{        IgniteConfiguration cfg = new IgniteConfiguration(); }}
> {{        cfg.setIgniteInstanceName(instanceName); }}
> {{        cfg.setDataStorageConfiguration(createDataStorageConfiguration()); 
> }}
> {{        cfg.setFailureHandler(new NoOpFailureHandler()); }}
> {{        return Ignition.start(cfg); }}
> {{    } }}
> {{    private DataStorageConfiguration createDataStorageConfiguration() { }}
> {{        return new DataStorageConfiguration() }}
> {{                .setDefaultDataRegionConfiguration( }}
> {{                        new DataRegionConfiguration() }}
> {{                                .setName(DEFAULT_MEMORY_REGION) }}
> {{                                .setInitialSize(MEM_SIZE) }}
> {{                                .setMaxSize(MEM_SIZE) }}
> {{                                .setMetricsEnabled(true)); }}
> {{    } }}
> {{    private void fillDataRegion(Ignite ignite) { }}
> {{        byte[] megabyte = new byte[1024 * 1024]; }}
> {{            IgniteCache<Object, Object> cache = }}
> {{                    ignite.getOrCreateCache(CACHE_NAME); }}
> {{            for (int i = 0; i < 50; i++) { }}
> {{                cache.put(i, megabyte); }}
> {{                memUsed(ignite); }}
> {{            } }}
> {{    } }}
> {{    private void memUsed(Ignite ignite) { }}
> {{        DataRegionConfiguration defaultDataRegionCfg = }}
> {{ignite.configuration() }}
> {{                .getDataStorageConfiguration() }}
> {{                .getDefaultDataRegionConfiguration(); }}
> {{        String regionName = defaultDataRegionCfg.getName(); }}
> {{        DataRegionMetrics metrics = ignite.dataRegionMetrics(regionName); }}
> {{        float usedMem = metrics.getPagesFillFactor() * }}
> {{metrics.getTotalAllocatedPages() * metrics.getPageSize(); }}
> {{        float pctUsed = 100 * usedMem / defaultDataRegionCfg.getMaxSize(); 
> }}
> {{        System.out.println("Memory used: " + pctUsed + "%"); }}
> {{    } }}
> {{} }}



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

Reply via email to