Denis,

Here is a version of CacheMetrics interface with all changes how I see them
(pretty long list :)).

public interface CacheMetrics {

   public long getCacheHits();

   public float getCacheHitPercentage();

   public long getCacheMisses();

   public float getCacheMissPercentage();

   public long getCacheGets();

   public long getCachePuts();

   public long getCacheRemovals();

   public long getCacheEvictions();

   public float getAverageGetTime();

   public float getAveragePutTime();

   public float getAverageRemoveTime();

   public float getAverageTxCommitTime();

   public float getAverageTxRollbackTime();

   public long getCacheTxCommits();

   public long getCacheTxRollbacks();

   public String name();

   public long getOverflowSize();

   public long getOffHeapGets();

   public long getOffHeapPuts();//removing as it duplicates cachePuts

   public long getOffHeapRemovals();

   public long getOffHeapEvictions();

   public long getOffHeapHits();

   public float getOffHeapHitPercentage();

   public long getOffHeapMisses();//removing as it duplicates cacheMisses

   public float getOffHeapMissPercentage();//removing as it duplicates
cacheMissPercentage

   public long getOffHeapEntriesCount();

   public long getOffHeapPrimaryEntriesCount();

   public long getOffHeapBackupEntriesCount();

   public long getOffHeapAllocatedSize();

   public long getOffHeapMaxSize();

   public long getSwapGets();

   public long getSwapPuts();

   public long getSwapRemovals();

   public long getSwapHits();

   public long getSwapMisses();

   public long getSwapEntriesCount();

   public long getSwapSize();

   public float getSwapHitPercentage();

   public float getSwapMissPercentage();

   public int getSize();

   public int getKeySize();

   public boolean isEmpty();

   public int getDhtEvictQueueCurrentSize();

   public int getTxThreadMapSize();

   public int getTxXidMapSize();

   public int getTxCommitQueueSize();

   public int getTxPrepareQueueSize();

   public int getTxStartVersionCountsSize();

   public int getTxCommittedVersionsSize();

   public int getTxRolledbackVersionsSize();

   public int getTxDhtThreadMapSize();

   public int getTxDhtXidMapSize();

   public int getTxDhtCommitQueueSize();

   public int getTxDhtPrepareQueueSize();

   public int getTxDhtStartVersionCountsSize();

   public int getTxDhtCommittedVersionsSize();

   public int getTxDhtRolledbackVersionsSize();

   public boolean isWriteBehindEnabled();

   public int getWriteBehindFlushSize();

   public int getWriteBehindFlushThreadCount();

   public long getWriteBehindFlushFrequency();

   public int getWriteBehindStoreBatchSize();

   public int getWriteBehindTotalCriticalOverflowCount();

   public int getWriteBehindCriticalOverflowCount();

   public int getWriteBehindErrorRetryCount();

   public int getWriteBehindBufferSize();

   public String getKeyType();

   public String getValueType();

   public boolean isStoreByValue();

   public boolean isStatisticsEnabled();

   public boolean isManagementEnabled();

   public boolean isReadThrough();

   public boolean isWriteThrough();

   public long getTotalAllocatedPages();

   public long getTotalEvictedPages();

}


Also I suggest to introduce new interface for MemoryPolicy metrics and make
it available through *IgniteCacheDatabaseSharedManager*:


public interface IgniteMemoryPolicyMetrics {

    /**

     * @return Memory policy name.

     */

    public String getName();


    /**

     * @return Total number of allocated pages.

     */

    public long getTotalAllocatedPages();


    /**

     * @return Amount (in bytes) of not yet allocated space in PageMemory.

     */

    public long getAvailableSpace();


    /**

     * @return Number of allocated pages per second within PageMemory.

     */

    public float getAllocationRate();


    /**

     * @return Number of evicted pages per second within PageMemory.

     */

    public float getEvictionRate();


    /**

     * Large entities bigger than page are split into fragments so each
fragment can fit into a page.

     *

     * @return Percentage of pages fully occupied by large entities.

     */

    public long getLargeEntriesPagesPercentage();


    //---FreeList-related metrics


    /**

     * @return Free space to overall size ratio across all pages in
FreeList.

     */

    public float getPagesFillFactor();


    /**

     * @return Percentage of pages in FreeList with free space >= 8 and <
16 bytes

     */

    public float getPagesPercentage_8_16_freeBytes();


    /**

     * @return Percentage of pages in FreeList with free space >= 16 and <
64 bytes

     */

    public float getPagesPercentage_16_64_freeBytes();


    /**

     * @return Percentage of pages in FreeList with free space >= 64 and <
256 bytes

     */

    public float getPagesPercentage_64_256_freeBytes();

}

In my mind last three methods provide some kind of hist to give an insight
about memory fragmentation.
If there are a lot of pages with relatively big free chunks and less with a
smaller chunks it may indicate that memory is fragmented and it may be
reasonable to adjust page sizes.

Thanks,
Sergey.



On Thu, Mar 16, 2017 at 1:29 AM, Denis Magda <dma...@apache.org> wrote:

> Hi Sergey,
>
> >> In memory management scheme based on MemoryPolicies it may be useful
> (and
> >> easier) to collect some metrics not for individual caches but for whole
> >> MemoryPolicies where several caches may reside.
> >>
>
> I would collect the metrics for every single MemoryPolicy as well as for
> individual caches. It makes sense to expose which cache contributes more to
> memory utilization.
>
> >>   - free space / used space tracking;
> >>   - allocation / eviction rate;
>
> Please consider this as well:
> - total number of pages;
> - total number of enters (how hard to support?).
>
> >>   - metrics to track memory fragmentation: e.g. % of pages with only 8
> >>   bytes free, 16 bytes free and so on;
> >>   - % of big fragmented entries in cache: may be useful to adjust page
> >>   size.
>
> >
> How do you see this in the metrics interface?
>
>
> >   3. Useful, not going to remove:
> >   getOffHeapGets //useful as there still may be deserialized entries
> >   residing on-heap
> >   getOffHeapHitPercentage
> >   getOffHeapHits //overall hits include offheap and onheap
> >   getOffHeapMisses //I think in new model is the same as getCacheMisses
> >   getOffHeapMissPercentage //same as above
> >   getOffHeapPuts //same as above
> >   getOffHeapRemovals //same as above
>
> Could you please prepare an updated version of the cache metrics adding
> new methods and renaming existing ones (only if necessary)? It will be
> simpler to keep up the discussion relying on this updated interface.
>
> —
> Denis
>
> > On Mar 15, 2017, at 8:32 AM, Sergey Chugunov <sergey.chugu...@gmail.com>
> wrote:
> >
> > Also I looked through current set of metrics available on
> > *CacheMetrics *interface
> > and suggest following changes:
> >
> >
> >   1. All methods related to tracking swap space (including
> >   *getOverflowSize*) to be removed.
> >
> >   2. Useless/hard to calculate in new memory management approach:
> >   getOffHeapAllocatedSize //max size is constrained by MemoryPolicy
> config
> >   getOffHeapEntriesCount //all cache entries live offheap
> >   getOffHeapEvictions //will be captured on MemoryPolicyMetrics level;
> >   getOffHeapMaxSize //same as the first one
> >
> >   3. Useful, not going to remove:
> >   getOffHeapGets //useful as there still may be deserialized entries
> >   residing on-heap
> >   getOffHeapHitPercentage
> >   getOffHeapHits //overall hits include offheap and onheap
> >   getOffHeapMisses //I think in new model is the same as getCacheMisses
> >   getOffHeapMissPercentage //same as above
> >   getOffHeapPuts //same as above
> >   getOffHeapRemovals //same as above
> >
> > Please share your thought if I miss something here.
> >
> > Thanks,
> > Sergey Chugunov.
> >
> > On Wed, Mar 15, 2017 at 4:51 PM, Sergey Chugunov <
> sergey.chugu...@gmail.com>
> > wrote:
> >
> >> Hello Igniters,
> >>
> >> As part of [1] cache metrics need to be updated as some of them like
> swap
> >> hits are not applicable anymore.
> >>
> >> In memory management scheme based on MemoryPolicies it may be useful
> (and
> >> easier) to collect some metrics not for individual caches but for whole
> >> MemoryPolicies where several caches may reside.
> >>
> >> I suggest the following list of new metrics to collect for each
> >> MemoryPolicy:
> >>
> >>   - free space / used space tracking;
> >>   - allocation / eviction rate;
> >>   - metrics to track memory fragmentation: e.g. % of pages with only 8
> >>   bytes free, 16 bytes free and so on;
> >>   - % of big fragmented entries in cache: may be useful to adjust page
> >>   size.
> >>
> >>
> >> Please suggest any other metrics that may be worth tracking.
> >>
> >> [1] https://issues.apache.org/jira/browse/IGNITE-3477
> >>
> >> Thanks,
> >> Sergey Chugunov.
> >>
>
>

Reply via email to